我在一个程序中画二次曲线。
源程序如下:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.*;
import javax.swing.*;
//定义myQuadCurvePanel类,扩展JPanel类!
class myQuadCurvePanel extends Panel
{
BorderLayout borderLayout = new BorderLayout();
Panel pdown = new Panel();
Checkbox check1,check2;
JLabel t1,t2,t3;
JLabel L1,L2,L3;
Point[] x = new Point[3];
int i,j = 0,k,flag = 0;
String ts1,ts2,ts3;
//定义myQuadCurvePanel的构造器!
public myQuadCurvePanel(){
x[0] = new Point(10,150);
x[1] = new Point(100,50);
x[2] = new Point(200,150);
this.setLayout(borderLayout);
t1 = new JLabel();
t2 = new JLabel();
t3 = new JLabel();
L1 = new JLabel();
L2 = new JLabel();
L3 = new JLabel();
L1.setText("Point1:");
L2.setText("Point2:");
L3.setText("Point3:");
ts1 = x[0].x + "," + x[0].y;
ts2 = x[1].x + "," + x[1].y;
ts3 = x[2].x + "," + x[2].y;
t1.setText(ts1);
t2.setText(ts2);
t3.setText(ts3); pdown.setBackground(Color.pink);
this.add(pdown,BorderLayout.SOUTH);
pdown.add(L1);
pdown.add(t1);
pdown.add(L2);
pdown.add(t2);
pdown.add(L3);
pdown.add(t3); //监听鼠标事件,当鼠标按下的时候,调用方法panel_mousePressed(),该方法将判断鼠标按下的位置是否为控制点的位置!
addMouseListener(new MouseAdapter() {
public void mousePressed (MouseEvent e) {
panel_mousePressed(e);
}
}); //监听鼠标拖动事件,当鼠标拖动的时候,调用方法panel_mouseDragged(),该方法将判断鼠标按下的位置是否为控制点的位置!
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged (MouseEvent e) {
panel_mouseDragged(e);
}
});
} //定义paint()方法,绘制控制点和控制线,然后调用draw_curve2D()方法绘制二次曲线
public void paint(Graphics g){
for(j = 0;j < 3;j++){
g.fillOval(x[j].x-3,x[j].y-3,6,6);
if(j >= 1){
g.drawLine(x[j-1].x,x[j-1].y,x[j].x,x[j].y);
}
}
draw_curve2D(g,x);
} //定义panel_mousePressed()方法,判断鼠标按下的位置是否在以控制点为中心的20个像素的长和宽的正方形区域中,如果是,设置flag=1!
public void panel_mousePressed(MouseEvent e){
Graphics g = getGraphics();
int[] ax = new int[4];
int[] ay = new int[4];
int x0 = e.getX();
int y0 = e.getY();
Polygon a;
for(i = 0;i < 3;i++){
ax[0] = x[i].x-10;
ax[1] = x[i].x+10;
ax[2] = x[i].x+10;
ax[3] = x[i].x-10;
ay[0] = x[i].y-10;
ay[1] = x[i].y-10;
ay[2] = x[i].y+10;
ay[3] = x[i].y+10; a = new Polygon(ax,ay,4);
if(a.contains(x0,y0)){
k = i;
flag = 1;
}
} } //定义panel_mouseDregged()方法,当flag=1时,修改控制点的坐标为鼠标移动的位置坐标,并且调用repaint()方法,重新绘制曲线!
public void panel_mouseDragged(MouseEvent e){
Graphics g = getGraphics();
if(flag == 1){
int x1 = e.getX();
int y1 = e.getY();
x[k].x = x1;
x[k].y = y1;
repaint();
}
} //定义draw_curve2D()方法,定义2D图形上下文g,用3个控制点定义二次曲线curve,然后调用QuadCurve2D.Float的draw()方法
//绘制曲线。最后用QuadCurve2D.Float的getX1()、getY1()、getCtrlX()、getCtrlY()、getX2()、getY2()方法返回控制点坐标,
//然后将值赋给label,并显示在屏幕下方!
public void draw_curve2D(Graphics g,Point[] x){
Graphics2D g2D = (Graphics2D)g;
QuadCurve2D.Float curve = new QuadCurve2D.Float(x[0].x,x[0].y,x[1].x,x[1].y,x[2].x,x[2].y);
//Graphics2D g2D = (Graphics2D)g;
g2D.draw(curve);
ts1 = curve.getX1()+","+curve.getY1();
ts2 = curve.getCtrlX()+","+curve.getCtrlY();
ts3 = curve.getX2()+","+curve.getY2();
t1.setText(ts1);
t2.setText(ts2);
t3.setText(ts3);
}};//定义myQuadCurve类,扩展Frame类,加入myQuadCurvePanel
public class myQuadCurve extends JFrame
{
public myQuadCurve(){
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}); myQuadCurvePanel p = new myQuadCurvePanel();
p.setSize(400,300);
p.setBackground(Color.white);
this.setSize(500,400);
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().setBackground(Color.black); this.getContentPane().add(p,BorderLayout.CENTER);
show();
} //定义mian()方法,显示窗体
public static void main(String[] args){
myQuadCurve f = new myQuadCurve();
}
};我想将程序中的所画的point,line以及fillOval都改成graphic2D下坐标能够用double数据表示的图形:point2D,line2D及Ellipse2D但修改时遇到了几个问题;
1:x[0] = new Point(10,150);的定义改为x[0] = new Point2D.Double(10,150)后,坐标不能够用
x[0].x和x[0].y这样表示,请问如何表示??
2:其中定义了个 Polygon(int,int,int),请问用double数据表示坐标的哪个方法能代替它??求教高手,解决了分全拿去,还可以再加!!!!
源程序如下:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.*;
import javax.swing.*;
//定义myQuadCurvePanel类,扩展JPanel类!
class myQuadCurvePanel extends Panel
{
BorderLayout borderLayout = new BorderLayout();
Panel pdown = new Panel();
Checkbox check1,check2;
JLabel t1,t2,t3;
JLabel L1,L2,L3;
Point[] x = new Point[3];
int i,j = 0,k,flag = 0;
String ts1,ts2,ts3;
//定义myQuadCurvePanel的构造器!
public myQuadCurvePanel(){
x[0] = new Point(10,150);
x[1] = new Point(100,50);
x[2] = new Point(200,150);
this.setLayout(borderLayout);
t1 = new JLabel();
t2 = new JLabel();
t3 = new JLabel();
L1 = new JLabel();
L2 = new JLabel();
L3 = new JLabel();
L1.setText("Point1:");
L2.setText("Point2:");
L3.setText("Point3:");
ts1 = x[0].x + "," + x[0].y;
ts2 = x[1].x + "," + x[1].y;
ts3 = x[2].x + "," + x[2].y;
t1.setText(ts1);
t2.setText(ts2);
t3.setText(ts3); pdown.setBackground(Color.pink);
this.add(pdown,BorderLayout.SOUTH);
pdown.add(L1);
pdown.add(t1);
pdown.add(L2);
pdown.add(t2);
pdown.add(L3);
pdown.add(t3); //监听鼠标事件,当鼠标按下的时候,调用方法panel_mousePressed(),该方法将判断鼠标按下的位置是否为控制点的位置!
addMouseListener(new MouseAdapter() {
public void mousePressed (MouseEvent e) {
panel_mousePressed(e);
}
}); //监听鼠标拖动事件,当鼠标拖动的时候,调用方法panel_mouseDragged(),该方法将判断鼠标按下的位置是否为控制点的位置!
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged (MouseEvent e) {
panel_mouseDragged(e);
}
});
} //定义paint()方法,绘制控制点和控制线,然后调用draw_curve2D()方法绘制二次曲线
public void paint(Graphics g){
for(j = 0;j < 3;j++){
g.fillOval(x[j].x-3,x[j].y-3,6,6);
if(j >= 1){
g.drawLine(x[j-1].x,x[j-1].y,x[j].x,x[j].y);
}
}
draw_curve2D(g,x);
} //定义panel_mousePressed()方法,判断鼠标按下的位置是否在以控制点为中心的20个像素的长和宽的正方形区域中,如果是,设置flag=1!
public void panel_mousePressed(MouseEvent e){
Graphics g = getGraphics();
int[] ax = new int[4];
int[] ay = new int[4];
int x0 = e.getX();
int y0 = e.getY();
Polygon a;
for(i = 0;i < 3;i++){
ax[0] = x[i].x-10;
ax[1] = x[i].x+10;
ax[2] = x[i].x+10;
ax[3] = x[i].x-10;
ay[0] = x[i].y-10;
ay[1] = x[i].y-10;
ay[2] = x[i].y+10;
ay[3] = x[i].y+10; a = new Polygon(ax,ay,4);
if(a.contains(x0,y0)){
k = i;
flag = 1;
}
} } //定义panel_mouseDregged()方法,当flag=1时,修改控制点的坐标为鼠标移动的位置坐标,并且调用repaint()方法,重新绘制曲线!
public void panel_mouseDragged(MouseEvent e){
Graphics g = getGraphics();
if(flag == 1){
int x1 = e.getX();
int y1 = e.getY();
x[k].x = x1;
x[k].y = y1;
repaint();
}
} //定义draw_curve2D()方法,定义2D图形上下文g,用3个控制点定义二次曲线curve,然后调用QuadCurve2D.Float的draw()方法
//绘制曲线。最后用QuadCurve2D.Float的getX1()、getY1()、getCtrlX()、getCtrlY()、getX2()、getY2()方法返回控制点坐标,
//然后将值赋给label,并显示在屏幕下方!
public void draw_curve2D(Graphics g,Point[] x){
Graphics2D g2D = (Graphics2D)g;
QuadCurve2D.Float curve = new QuadCurve2D.Float(x[0].x,x[0].y,x[1].x,x[1].y,x[2].x,x[2].y);
//Graphics2D g2D = (Graphics2D)g;
g2D.draw(curve);
ts1 = curve.getX1()+","+curve.getY1();
ts2 = curve.getCtrlX()+","+curve.getCtrlY();
ts3 = curve.getX2()+","+curve.getY2();
t1.setText(ts1);
t2.setText(ts2);
t3.setText(ts3);
}};//定义myQuadCurve类,扩展Frame类,加入myQuadCurvePanel
public class myQuadCurve extends JFrame
{
public myQuadCurve(){
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}); myQuadCurvePanel p = new myQuadCurvePanel();
p.setSize(400,300);
p.setBackground(Color.white);
this.setSize(500,400);
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().setBackground(Color.black); this.getContentPane().add(p,BorderLayout.CENTER);
show();
} //定义mian()方法,显示窗体
public static void main(String[] args){
myQuadCurve f = new myQuadCurve();
}
};我想将程序中的所画的point,line以及fillOval都改成graphic2D下坐标能够用double数据表示的图形:point2D,line2D及Ellipse2D但修改时遇到了几个问题;
1:x[0] = new Point(10,150);的定义改为x[0] = new Point2D.Double(10,150)后,坐标不能够用
x[0].x和x[0].y这样表示,请问如何表示??
2:其中定义了个 Polygon(int,int,int),请问用double数据表示坐标的哪个方法能代替它??求教高手,解决了分全拿去,还可以再加!!!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货