用过JAVA 2D中的Arc2D类的就会发现,画出来的圆弧的角度与构造函数中的角度并不一致.通过查看Arc2D的源代码可以发现,Arc2D是这样生成圆弧的:首先使用给定的起始角度与跨越角度生成一个半径为1的标准单位圆弧,然后通过伸缩变换,将其转换为构造函数中指定的椭圆上的圆弧.显然,这样得到圆弧的起始角与跨度角与构造函数中的已经不一样了,除非这个椭圆本来就是个圆,或者其角度为90的倍数.
既然知道了Arc2D的生成原理,通过简单三角变换,我们很容易通过角度变换使用Arc2D生成我们需要的圆弧.下面的代码就是将圆弧的实际角度转换为Arc2D的参数角度:
java 代码
- public
static
double
degreeTranslate(
double
width,
double
height,
double
degree){
-
double
radian =Math.toRadians(degree);
-
double
trans =Math.atan2(width*Math.sin(radian),height*Math.cos(radian));
-
double
angle =Math.toDegrees(trans);
-
return
angle>
0
?angle:
360
+angle;
- }
下面,我们通过一个完整的程序来显示这段代码的正确性:
java 代码
- import
java.awt.*;
- import
java.awt.event.*;
- import
java.awt.geom.*;
- import
javax.swing.*;
-
-
-
-
-
- public
class
ArcT
extends
JFrame
implements
ActionListener,FocusListener{
-
public
static
double
degreeTranslate(
double
width,
double
height,
double
degree){
-
double
radian =Math.toRadians(degree);
-
double
trans =Math.atan2(width*Math.sin(radian),height*Math.cos(radian));
-
double
angle =Math.toDegrees(trans);
-
return
angle>
0
?angle:
360
+angle;
- }
-
-
public
static
Arc2D createArc(
double
x,
double
y,
double
width,
double
height,
double
start,
double
extent,
int
type){
-
double
nStart =degreeTranslate(width,height,start);
-
double
nExtent =
0
;
-
if
(extent>=
360
||extent<=-
360
) nExtent =
360
;
-
else
{
- nExtent =degreeTranslate(width,height,start+extent)-nStart;
-
if
(extent<
0
&&nExtent>
0
) nExtent =nExtent -
360
;
-
if
(extent>
0
&&nExtent<
0
) nExtent =nExtent +
360
;
- }
-
return
new
Arc2D.Double(x,y,width,height,nStart,nExtent,type);
- }
-
-
private
Arc2D arcA,arcB;
-
private
double
start,extent;
-
private
JTextField startField,extentField;
-
private
Stroke strokeB =
new
BasicStroke(
3
.0f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,
10
.0f,
new
float
[]{
5
,
20
,
5
,
10
},
0
),
- strokeA =
new
BasicStroke(
3
.0f),
- strokeX =
new
BasicStroke(
1
.0f);
-
-
public
ArcT(){
-
super
(
"圆弧测试程序"
);
- JPanel drawPanel =
new
JPanel(){
-
public
void
paintComponent(Graphics g){
-
super
.paintComponent(g);
- Graphics2D g2 =(Graphics2D)g;
- g2.setPaint(Color.white);
- g2.fillRect(
0
,
0
,getWidth(),getHeight());
- g2.setPaint(Color.black);
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
- g2.setStroke(strokeA);
- g2.draw(arcA);
- g2.setPaint(Color.red);
- g2.setStroke(strokeB);
- g2.draw(arcB);
- g2.setStroke(strokeX);
-
- g2.setPaint(Color.black);
- g2.draw(
new
Line2D.Double(
new
Point(
160
,
120
),arcA.getStartPoint()));
- g2.draw(
new
Line2D.Double(
new
Point(
160
,
120
),arcA.getEndPoint()));
-
- g2.setPaint(Color.red);
- g2.draw(
new
Line2D.Double(
new
Point(
160
,
120
),arcB.getStartPoint()));
- g2.draw(
new
Line2D.Double(
new
Point(
160
,
120
),arcB.getEndPoint()));
- }
- };
- drawPanel.setPreferredSize(
new
Dimension(
320
,
240
));
- add(drawPanel,BorderLayout.CENTER);
-
- JPanel setPanel =
new
JPanel();
- setPanel.add(
new
JLabel(
"起始角度:"
));
- startField =
new
JTextField(
"0.0"
,
6
);
- start =
0
;
- startField.addActionListener(
this
);
- startField.addFocusListener(
this
);
- setPanel.add(startField);
-
- setPanel.add(
new
JLabel(
"跨越角度:"
));
- extentField =
new
JTextField(
"90.0"
,
6
);
- extent =
90
;
- extentField.addActionListener(
this
);
- extentField.addFocusListener(
this
);
- setPanel.add(extentField);
-
- arcA =createArc(
20
,
15
,
280
,
210
,start,extent,Arc2D.OPEN);
- arcB =
new
Arc2D.Double(
20
,
15
,
280
,
210
,start,extent,Arc2D.OPEN);
- add(setPanel,BorderLayout.SOUTH);
-
- pack();
- setResizable(
false
);
- setDefaultCloseOperation(EXIT_ON_CLOSE);
- setVisible(
true
);
-
- }
-
private
void
setArcByTextField(JTextField textField){
-
double
value =
0
;
-
try
{
- value =Double.parseDouble(textField.getText().trim());
- }
catch
(Exception e){
- textField.setText(String.valueOf(textField==startField?start:extent));
-
return
;
- }
-
if
(textField==startField) start =value;
-
else
extent =value;
- arcA =createArc(
20
,
15
,
280
,
210
,start,extent,Arc2D.OPEN);
- arcB =
new
Arc2D.Double(
20
,
15
,
280
,
210
,start,extent,Arc2D.OPEN);
- repaint();
- }
-
public
void
focusGained(FocusEvent e){}
-
public
void
focusLost(FocusEvent e){
- setArcByTextField((JTextField)e.getComponent());
- }
-
public
void
actionPerformed(ActionEvent e){
- setArcByTextField((JTextField)e.getSource());
- }
-
public
static
void
main(String[] args){
-
new
ArcT();
- }
- }
分享到:
相关推荐
### Arc2D.Float 类在Java中...特别是对于闭合类型为`Arc2D.PIE`的情况,我们可以通过指定的起始角度、覆盖角度以及椭圆框的位置和尺寸来精确控制绘制出的弧形的外观。这对于开发图形用户界面或进行图形处理非常有用。
其中`startAngle`是起始角度,`arcExtent`是弧度的大小,`Arc2D.OPEN`定义了弧的类型为开放。 6. **二次曲线(QuadCurve2D)**: 二次曲线由两点和控制点定义。创建二次曲线的代码如下: ```java QuadCurve2D ...
1. 视角控制:ArcScene提供了多种视角控制工具,包括平移、旋转、缩放、俯仰等,以从不同角度查看三维场景。 2. 漫游与动画:用户可以创建路径并进行动态漫游,也可以设置关键帧,制作出三维场景的动画效果,用于...
`arc`方法允许我们指定圆心坐标、半径、起始角度、结束角度以及是否逆时针绘制。例如: ```javascript var canvas = document.getElementById('myCanvas'); var ctx = canvas.getContext('2d'); ctx.beginPath(); ...
`arc`是以弧度表示的角度,正数表示逆时针旋转,负数表示顺时针旋转。 在绘制直线时,首先需要创建一个`Graphics2D`对象,通常是从`Graphics`对象转换而来,例如: ```java Graphics2D g2d = (Graphics2D) g; ``` ...
5. `Arc`:实现弧形或扇形的绘制,可以指定圆心、半径、起始角度和结束角度。 在项目中,这些形状实例被存储在一个数组中。这表明,程序可能有一个循环,遍历数组,并调用每个形状的`draw()`方法在面板上绘制它们。...
通过采用显式有限差分方法,FLAC2D能够高效地解决非线性问题。 - **输入方式**:与其他数值模拟程序不同,FLAC2D支持两种主要的输入方式: - 交互模式:用户可以直接从键盘输入命令。 - 文件驱动:将命令组织在一...
接着,在`.js`文件中,初始化环形进度条的参数,如半径、起始角度、结束角度、颜色等。我们还需要实现一个`drawCircle`方法,使用canvas 2D API绘制环形进度条。这包括设置线条宽度、颜色,以及使用`arc()`方法绘制...
`ITextElement3D`接口提供了`ZDepth`属性用于设置深度,`Orientation`属性用于设置旋转角度,`Location`属性用于设置位置。 3. 创建`IFeatureClass`和`IFeature`:在GIS应用中,通常会将文字标注与特定的地理特征...
本文将详细介绍HALCON中的1D与2D测量技术,包括基本原理、常用函数以及实际应用案例。 #### 二、HALCON测量技术概览 HALCON的测量技术主要包括两个方面:1D测量和2D测量。这两种测量方法分别适用于不同类型的场景...
`run()`方法是应用程序的入口点,它创建了一个`Display`对象,用于显示和管理窗口,并创建一个名为“Arc Example”的`Shell`(即窗口)。 在`createContents(Shell shell)`方法中,我们设置了窗口的布局,创建了一...
使用Canvas的绘图API(如`beginPath()`、`moveTo()`、`lineTo()`、`arc()`等)绘制鸟的轮廓。你可以根据需求设计不同的鸟形,包括身体、翅膀、尾巴等部分。 4. **定义鸟的属性**: 定义鸟的位置(x、y坐标)、...
首先,arc函数是Canvas API中的一个方法,它在2D渲染上下文中用于绘制圆弧路径。该方法的语法如下:`arc(x, y, radius, startAngle, endAngle, anticlockwise)`。其中,x和y表示圆弧中心的坐标,radius是半径,...
在计算机编程中,特别是在2D或3D图形处理和游戏开发中,计算两点之间的角度是非常常见的需求。易语言,一种中文编程语言,提供了相应的函数和方法来实现这一功能。本篇将详细介绍如何在易语言中根据两点坐标计算它们...
开发者可能会使用`Arc2D`的不同类型(如`Arc2D.OPEN`、`Arc2D.PIE`或`Arc2D.CHORD`)来控制弧线的显示方式。 3. **曲线算法**: 如果项目复杂度较高,可能还涉及到了数学上的曲线算法,如贝塞尔曲线(Bezier Curve)...
在Java中,我们可以使用`java.awt.Polygon`类或`java.awt.geom.Arc2D`类来绘制扇形。通常,我们会先计算出每个扇形的角度,这个角度与数据的占比成正比。 以下是一个简单的饼状图绘制步骤: 1. **初始化数据**:...
在这篇文章中,介绍了如何使用JavaScript在2D平面上绘制数字“8”的图形。具体知识点涵盖以下几个方面: 1. 了解canvas元素:文章首先提到了canvas元素,这是HTML5中提供的一种用于绘图的元素。在页面上定义一个...
在本压缩包"Create_Line_Arc_fillet.zip_UG_ug 二次圆角"中,我们聚焦于UG的二次开发,特别是涉及到创建直线、圆弧和进行圆角处理的自定义功能。 UG的二次开发允许用户根据自身需求定制工具,提升工作效率。这通常...
6. _arc()方法:arc()方法是2D绘图上下文的方法,用于绘制圆弧。在绘制时钟效果时,需要使用arc()方法绘制时钟的表盘。 7. stroke()方法:stroke()方法是2D绘图上下文的方法,用于绘制线条。在绘制时钟效果时,需要...
而Direct2D则更为现代,具有更好的性能和硬件加速,适合创建高质量的2D图形。 仪表盘通常由指针、刻度、数字等组成。我们首先需要设计一个仪表盘的静态背景,然后通过编程动态改变指针的角度来实现转动效果。这可以...