我正在尝试在有限线段和弧段之间进行碰撞测试。我有一个碰撞测试,它做线段和线段,所以我将用线段近似这些弧段并运行我现有的测试。
我定义弧段的数据是三点。其中两个是位于圆周上的端点,第三个点是该圆的中心。
到目前为止,这就是我所拥有的:
设(a,b)为圆的中心点,让'r'为圆的半径,(x1,y1),(x2,y2)为圆弧段的端点圆的圆周。
以下参数方程给出了弧的x和y位置。 't'是参数变量。
x = a + r * cos(t) y = b + r * sin(t)
为了从弧线创建线段,我想沿着弧线走一段固定比例的't',沿途创建线段,直到我到达弧的末端。要做到这一点,我想我必须找到开始和结束角度。我开始从起始角度走弧,并以结束角度结束。由于我知道起点和终点,我认为我可以使用这些方程来求解这些角度。以下是我的方程式:
t = arccos((x-a) / r)
或
t = acrcsin((y-b) / r)
我遇到的问题是这些函数返回的值范围(http://en.wikipedia.org/wiki/Inverse_trigonometric_function)是有限的,因此很可能不会返回我正在寻找的角度,因为这些函数是多值的:arcsin(0)= 0,但arcsin(0)=π,arcsin(0)=2π等
如何获得我正在寻找的确切角度?或者,你能想到一个更好/不同的方式来实现我的目标吗?
答案 0 :(得分:4)
查看atan2
function,它应该存在于您正在使用的任何编程语言或数学库中。它需要两个参数,一个点的x和y坐标(对你:(x-a)/ r和(y-b)/ r)并返回-π到+π范围内的角度。
答案 1 :(得分:3)
至少IMO,你的方式是错误的。一条线有一个等式y=mx+b
。圆具有方程x 2 + y 2 = r 2 。您正在寻找圆的x和y等于线的x和y的点。你可以用mx+b
方程代替圆中y
方程的直线,然后用二次方程求解。
所涉及的方程确实有点长,但是很多网页(例如http://www.sonoma.edu/users/w/wilsonst/papers/geometry/circles/default.html)都有它们,此时将方程实现为几个函数并插入值很简单为您的特定圈/线。基于这些方程的解决方案完全避免了使用arg切线的模糊性。
答案 2 :(得分:1)
你的伪代码看起来很像Python。如果您不介意使用Python,我会推荐使用Shapely Library。如果您只想要算法,请检查来源。
匀称的对象具有'简化'和'交叉'方法。