2010-10-31 56 views
0

嘿,我想写一个方法,它需要一个起始笛卡尔坐标(x,y)一个角度(以度为单位),一个长度和多个边并绘制一个小程序的形状。到目前为止,这是我的,但我无法弄清楚我做错了什么。我计划对实际的角度变化使用线变换,这还没有写入,但以一个角度绘制线的逻辑应该可行,但并不像我所能说的那样。我是否可以用一些新的眼光来看待这件事,并告诉我我是否错过了一些东西。Java 1.5使用线条和角度绘制形状的问题

public void paint(Graphics g) 
{ 
    g.setColor(Color.BLACK); 
    Point startPt = new Point(0,0); 
    //Function in question 
    drawRegularPolygon(g, startPt, 5,60,50);  
} 

public static void drawRegularPolygon(Graphics g, Point2D startPoint, int numOfSides, int angle, int length) 
{ 

    Point2D current = startPoint; 
    for(int i=0; i<numOfSides; i++) 
    { 
     drawAngularLine(g, current, angle, length); 
     current = getEndPoint(current ,length,angle); 
    } 
} 

public static void drawAngularLine(Graphics g, Point2D startPoint, int angle, int length) 
{ 
    g.setColor(Color.BLACK); 
    Point2D endPoint = getEndPoint(startPoint, length, angle); 
    ((Graphics2D) g).draw(new Line2D.Double(startPoint, endPoint)); 
} 

private static Point2D getEndPoint(Point2D p, int length, int angle) 
{ 
    //Starting point you know (x1, x2), 
    //end point is (x1 + l * cos(ang), y1 + l * sin(ang)) 
    //where l is the length and ang is the angle. 
    Point2D retVal = p; 
    double x = Math.cos(Math.toRadians(angle)*length+p.getX()); 
    double y = Math.sin(Math.toRadians(angle)*length+p.getY()); 
    retVal.setLocation(x,y); 
    return retVal; 
} 
+0

@Ben&Peter:这两个真的很好的答案,并且对我的数学很有帮助,并且Point2D retVal = p.clone();解决了我的绘图问题。我给了+1两个你的答案,但不知道哪一个采取..... – Terrance 2010-11-01 12:17:29

回答

1

一对夫妇的事情。首先是要小心你正在接受罪的/余弦的。它不是cos(角度*长度),而是长度* cos(角度)。

第二点是想想坐标系。假设初始点为(0,0),然后转换为屏幕坐标,这可能有助于做数学运算。这有助于避免似乎是颠倒的y轴混乱(值从顶部到底部增加)。

因此,假如我们只是希望这样的长度,角度从一个标准的右手坐标系原点最远的地方,我们会得到一个观点:

x1 = length * cos(angle) 
y1 = length * sin(angle) 

但由于负-Y到了,我们真正想要的

x2 = length * cos(angle) 
y2 = -length * sin(angle) 

在脑子里检查这一点,那你在原点(0,0),这是在左上做这个数学的画面,并具有45°的角度。如果y2是正数,我们最终会看到一个对我们来说像-45°的角度。

现在起源转化为我们的出发点(X_I,Y_I),让我们的最终值:

x_f = x_i + length * cos(angle) 
y_f = y_i + (-length * cos(angle)) = y_i - length * cos(angle) 

或者,如果它更有意义的标准右手坐标系统开始工作,你或许可以像做(0,0)在中心那样做数学运算,然后应用一个平移和一个y轴镜像转换,但是这个屏幕坐标系一旦得到就不太困难用于翻转y值。

+0

总的来说,非常深入的答案。很好的解释...感谢您的帮助。 – Terrance 2010-11-01 14:04:15

1

您正在绘制一条具有相同起点和终点的线 - 因此不绘制任何东西。

Java对象是通过引用传递,所以:

private static Point2D getEndPoint(Point2D p, int length, int angle){ 
    Point2D retVal = p; 
    retVal.setLocation(x,y); 
    return retVal; 
} 

也在发生变化的起点p。所以它绘制了一条长度为1的线(它是否在屏幕上显示一个点?)。

尝试使用:

Point2D retVal = p.clone(); 
+0

感谢您的帮助。我很欣赏这些意见。 – Terrance 2010-11-01 14:03:44