我如何找到圆周上两点之间的所有角度
How do I find all the angles between two points on the circumference of a circle
我目前正在攻读计算机科学的高潮,但我被困住了,似乎找不到关于堆栈溢出问题的任何答案。
我要解决的问题是在屏幕上(1280 x 720,其中左上角是 (0, 0))上以 (x, y) 的形式存在三个给定点,您必须找到通过所有三个点的曲线。
所以,知道有三个点,就知道它们构成了一个三角形。找到外心后,你现在有:
- 半径,
- 起源,
- 和三个角
曲线必须从第一个给定点开始,通过第二个给定点,并在第三个给定点结束。
int pointX = Math.round(circumcentreX + radius * Math.cos(angle));
int pointY = Math.round(circumcentreY + radius * Math.sin(angle));
以上是方程式我found在给定角度的情况下找到曲线上的点。
我也知道如何用 Math.atan2(y, x);
找到三个给定点的角度
我遇到的主要问题是找到曲线上的角度。到目前为止我有
float angle = (float)Math.toRadians(beginningAngle - (beginningAngle - endAngle) * t);
,其中 t 是它所在曲线的百分比,但它在一半时间不起作用。
圆的角度为北为 270 度,东为 0 度,南为 90 度,西为 180 度。
曲线应该是这样的
Angles: 183.57921 : 264.60202 : 358.09354
X coordinates: [473, 597, 747]
Y coordinates: [376, 248, 380]
这是一个失败的例子
Angles: 179.00537 : 270.5897 : 2.6373901
X coordinates: [473, 614, 752]
Y coordinates: [376, 234, 380]
如果您找到找到角度的方法或想要一些源代码,请告诉我。提前致谢!
在弄清楚导致错误的原因和有效方法之后,我最终得到了四个 if、else-if 和 else's 来解决我的问题。
float change;
float tba = (ba / 100 < 1) ? ba + 360 : ba;
float tma = (ma / 100 < 1) ? ma + 360 : ma;
float tea = (ea / 100 < 1) ? ea + 360 : ea;
if(tba > tma && tma > tea && ea > ba)
change = ea - ba - 360;
else if(tba < tma && tma < tea && ea < ba)
change = tea - ba;
else if(ea < ba && ma < ba)
change = ea - ba;
else
change = (ea - ba < 0f) ? ea - ba + 360 : ea - ba;
change %= 360;
浮点数change
是第一个角和第三个角的差值。浮点数 tba
、tma
和 tea
只是 ba
、ma
和 ea
的临时版本(它们是给定的点),以便比较角度更容易。例如,当ba
为350°,ma
为10°,ea
为15°时,则分别为350°、370°、375°。 (在这种情况下,change
将是 25°)我不确定最后一行是否必要,但我将其保留在那里以防万一。
顺便说一下,我使用浮点数而不是双精度数的原因是 slick2D 通常将浮点数作为参数而不是双精度数。
我目前正在攻读计算机科学的高潮,但我被困住了,似乎找不到关于堆栈溢出问题的任何答案。
我要解决的问题是在屏幕上(1280 x 720,其中左上角是 (0, 0))上以 (x, y) 的形式存在三个给定点,您必须找到通过所有三个点的曲线。
所以,知道有三个点,就知道它们构成了一个三角形。找到外心后,你现在有:
- 半径,
- 起源,
- 和三个角
曲线必须从第一个给定点开始,通过第二个给定点,并在第三个给定点结束。
int pointX = Math.round(circumcentreX + radius * Math.cos(angle));
int pointY = Math.round(circumcentreY + radius * Math.sin(angle));
以上是方程式我found在给定角度的情况下找到曲线上的点。
我也知道如何用 Math.atan2(y, x);
我遇到的主要问题是找到曲线上的角度。到目前为止我有
float angle = (float)Math.toRadians(beginningAngle - (beginningAngle - endAngle) * t);
,其中 t 是它所在曲线的百分比,但它在一半时间不起作用。
圆的角度为北为 270 度,东为 0 度,南为 90 度,西为 180 度。
曲线应该是这样的
Angles: 183.57921 : 264.60202 : 358.09354
X coordinates: [473, 597, 747]
Y coordinates: [376, 248, 380]
这是一个失败的例子
Angles: 179.00537 : 270.5897 : 2.6373901
X coordinates: [473, 614, 752]
Y coordinates: [376, 234, 380]
如果您找到找到角度的方法或想要一些源代码,请告诉我。提前致谢!
在弄清楚导致错误的原因和有效方法之后,我最终得到了四个 if、else-if 和 else's 来解决我的问题。
float change;
float tba = (ba / 100 < 1) ? ba + 360 : ba;
float tma = (ma / 100 < 1) ? ma + 360 : ma;
float tea = (ea / 100 < 1) ? ea + 360 : ea;
if(tba > tma && tma > tea && ea > ba)
change = ea - ba - 360;
else if(tba < tma && tma < tea && ea < ba)
change = tea - ba;
else if(ea < ba && ma < ba)
change = ea - ba;
else
change = (ea - ba < 0f) ? ea - ba + 360 : ea - ba;
change %= 360;
浮点数change
是第一个角和第三个角的差值。浮点数 tba
、tma
和 tea
只是 ba
、ma
和 ea
的临时版本(它们是给定的点),以便比较角度更容易。例如,当ba
为350°,ma
为10°,ea
为15°时,则分别为350°、370°、375°。 (在这种情况下,change
将是 25°)我不确定最后一行是否必要,但我将其保留在那里以防万一。
顺便说一下,我使用浮点数而不是双精度数的原因是 slick2D 通常将浮点数作为参数而不是双精度数。