Java 1.5使用直线和角度绘制形状的问题

时间:2010-10-31 19:04:11

标签: java geometry drawing trigonometry

嘿,我正在尝试编写一个方法,它采用一个起始笛卡尔坐标(x,y)一个角度(以度为单位),一个长度和多个边,并将一个形状绘制到一个小程序。到目前为止,这就是我所拥有的,但我无法弄清楚我做错了什么。我计划使用线变换来实现角度变化,但是还没有写入,但是以某个角度绘制直线的逻辑应该可以工作,但是我不知道。我可以看看这几个新眼睛并告诉我,如果我错过了什么。

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;
}

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

一些事情。首先要注意你正在接受的罪恶/余弦。它不是cos(角度*长度)而是长度* cos(角度)。

第二点是考虑坐标系。假设初始点为(0,0),然后转换为屏幕坐标,可能有助于进行数学运算。这有助于避免y轴的混淆,看起来是颠倒的(值从上到下增加)。

因此,假设我们只想要一个长度,远离标准右手系统原点的点,我们得到:

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

但是由于负面因素上升,我们实际上需要

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值,这个屏幕坐标系就不会太难理解了。