gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:28:02 25 4
gpt4 key购买 nike

嘿,我正在尝试编写一个方法,该方法采用起始笛卡尔坐标(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;
}

最佳答案

有几件事。首先是要小心你所取的正弦/余弦值。它不是 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 值,这个屏幕坐标系就不太难使用。

关于Java 1.5 使用线条和角度绘制形状的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com