【发布时间】:2011-04-01 23:23:11
【问题描述】:
假设我有一个(x,y)对于一条线的起点始终相同,而一个(x,y)对于同一条线的终点会发生变化。这条线也总是 40px 长。在程序开始时,直线起始于垂直方向(我们称之为 0 度)。根据用户输入,我需要通过仅更改末端 (x,y) 将线从其原点重新绘制特定度数。
如果您需要,可以提供更多的思考:
我正在尝试计算这个并使其在 Java 中工作。我可以根据圆弧的弧长进行数学计算,但我不知道如何让 Java 做到这一点。
我认为基于三角形角度会更容易工作,因为我总是知道三角形两侧的长度(一侧由 40px 长的线形成,另一侧由该线的起点和JPanel 的边框)和这两条线形成的角度。尽管如此,我的大脑仍然无法弄清楚。任何帮助将不胜感激。
更新:
@casablanca 让我走上了正轨。我复习了我的三角函数,这就是我如何使它工作的。
首先,我没有意识到 90 度是直线向上的,但是一旦我意识到我的解决方案反映了这一事实。我从框架的底部中心开始画线。因为当我的用户给出的角度小于 90 度时,三角形的opposite 位于屏幕的右侧,而当我的用户给出的角度大于 90 度时,它位于屏幕的左侧我不得不调整公式来考虑这个事实,因此我有四种方法,一种用于屏幕左侧的x 坐标(当用户给定角度大于 90 度时),一种用于@987654324 @ 屏幕左侧坐标(用户给定角度大于 90 度时)和用户给定角度小于 90 度时屏幕右侧的坐标相同。所有方法中的int length 是斜边的长度。 再次感谢@casablanca 的帮助!
public double leftSideX(double angle, int length){
double x = frameWidth/2 - (length * Math.cos(Math.toRadians(90-(Math.toDegrees(angle)-90))));
return x;
}
public double leftSideY(double angle, int length){
double y = frameHeight - (length * Math.sin(Math.toRadians(90-(Math.toDegrees(angle)-90))));
return y;
}
public double rightSideX(double angle, int length){
double x = frameWidth/2 + (length * Math.cos(angle));
return x;
}
public double rightSideY(double angle, int length){
double y = frameHeight - (length * Math.sin(angle));
return y;
}
【问题讨论】:
-
还可以考虑改变图形上下文的变换,如下所示:stackoverflow.com/questions/3420651
-
您可能需要考虑将此功能封装在一个类中;例如向量 2D。这样,您可以使用 x 和 y 坐标或长度和角度构造 Vector2D,并提供诸如 getMagnitude()、getAngle()、getX()、getY()、rotateClockwise(double) 等方法。
-
我很乐意,但我认为这有点超出了我现在的能力。我花了将近一整天的时间才弄清楚这一点:)
标签: java trigonometry