【问题标题】:Draw a line at a specific angle in Java在Java中以特定角度画一条线
【发布时间】: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


【解决方案1】:

这是你要找的吗?

startX = x;
startY = y;
endX   = x + 40 * Math.sin(angle);
endY   = y + 40 * Math.cos(angle);

并在您使用的任何 API 中从 (startX, startY) 到 (endX, endY) 画一条线。

还要注意angle 是弧度。如果你有度数,你需要先转换它:

angle = angle * Math.PI / 180;

【讨论】:

  • 我希望上帝没有那么简单,但如果是这样的话,今年圣诞节你会吃到水果蛋糕!不过我现在太累了,无法尝试,但早上第一件事......感谢您的快速回复!
  • @Jim Lewis:实际上三角约定是相反的。我切换它是因为 OP 希望 0 度是垂直的:sin 0 = 0 所以endX = xcos 0 = 1 所以endY = y + 40
  • @casablanca:天哪!当然你是对的......也许我应该在周五晚上停止评论数学帖子。
  • 这不太对,但它让我走上了正轨。如果我从上到下画线,我想我会使用Math.sin 代表xMath.cos 代表y,但我是从下往上走,所以我不得不切换功能。跨度>
  • @typoknig:如果您需要改变方向,只需将+ 40 更改为- 40。切换功能将在垂直和水平之间切换angle 方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多