如何获得线段和圆之间的投影距离?

How can I get the projected distance between a line segment and a circle?

提问人:Reiss Gomez 提问时间:10/18/2023 更新时间:10/19/2023 访问量:68

问:

我正在用 Java 制作一个 2D 射击游戏,我需要能够计算出一个圆可以向前移动的最大距离(仅在 Y 轴上)并将距离作为浮点值,我到处寻找,只能找到离线最近的距离,但我只想要向前距离。这张图片是我如何尝试让它工作的一个例子,线是一堵墙,圆圈是子弹。如果有人能给我一个简单的 Java 函数,那就太棒了。我需要它考虑到圆的整个圆周,所以即使它稍微夹住了带有边缘的墙壁,我也需要这个距离。如果这条线高于圆圈,我希望它返回一个负值,如果这条线低于我想要一个正值,如果它们不会碰撞,则返回POSITIVE_INFITITY。

enter image description here

我尝试了许多在网上找到的不同功能,但似乎没有一个适合我只使用 Y 轴距离的目的。

Java 2D 碰撞 项目符号

评论

0赞 Reiss Gomez 10/19/2023
它们比一个点大,它们的固定半径为 10。
0赞 Reiss Gomez 10/19/2023
是的,我想我可以解决这个问题。
0赞 Old Dog Programmer 10/19/2023
想象一下,另一堵墙平行并低于阻止子弹的墙。与两堵墙成直角相交的线上的墙之间的距离是子弹的半径。子弹表现得好像是点大小,但被想象中的墙挡住了。因此,您需要计算沿与两面墙相交的垂直线的墙之间的距离 g。当子弹的中心距离为实墙下方的 g 距离时,子弹停止。
0赞 Old Dog Programmer 11/9/2023
你解决了这个问题吗?对不起,这篇文章发布后不久我就分心了。

答:

-1赞 Reilas 10/19/2023 #1

大多数 java.awt.geom 框架都包含有用的数学函数。

Line2D 类具有 Line2D#ptLineDist 方法,用于计算此距离,不计算半径。

为此,我想你正在为子弹计算一个不同的角度。
对于该解决方案,这至少是一种资源。

double a = Line2D.ptLineDist(20, 40, 100, 10, 40, 100);
double b = Line2D.ptLineDist(20, 40, 100, 10, 65, 100);
System.out.printf("a = %s, b = %s", a, b);

输出

a = 63.202219485910504, b = 71.9803055256203

评论

0赞 Old Dog Programmer 10/19/2023
是的,O/P 正在计算子弹的不同角度。虽然没有特别提到,但 O/P 确实说他/她找到了如何进行这种总结,这不是想要的。Line2D#ptLineDist
0赞 Reilas 10/20/2023
@OldDogProgrammer,如果半径为 10,则使用 30、9050、110 等。