Algorithm 从x,y坐标计算角度

Algorithm 从x,y坐标计算角度,algorithm,math,collision-detection,trigonometry,Algorithm,Math,Collision Detection,Trigonometry,可能重复: 我试着在有限直线段和圆弧段之间进行碰撞测试。我有一个碰撞测试,它做直线段和直线段,所以我打算用直线段近似这些圆弧段,然后运行我现有的测试 我定义弧段的数据有三个点。其中两个端点位于圆的圆周上,第三个点是圆的中心 到目前为止,我得到的是: 设(a,b)为圆的中心点,设‘r’为圆的半径,(x1,y1)、(x2,y2)为圆弧段的端点,圆弧段位于圆的圆周上 以下参数方程给出了圆弧的x和y位置t’是参数变量 x=a+r*cos(t) y=b+r*sin(t) 要从圆弧创建线段,我想沿着圆弧走

可能重复:

我试着在有限直线段和圆弧段之间进行碰撞测试。我有一个碰撞测试,它做直线段和直线段,所以我打算用直线段近似这些圆弧段,然后运行我现有的测试

我定义弧段的数据有三个点。其中两个端点位于圆的圆周上,第三个点是圆的中心

到目前为止,我得到的是:

设(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)

我遇到的问题是,这些函数()返回的值的范围是有限的,因此我寻找的角度很可能不会返回,因为这些函数是多值的:arcin(0)=0,但也有arcin(0)=π,arcin(0)=2π,等等


如何获得我要查找的确切角度?或者,你能想出一种更好/不同的方法来实现我的目标吗?

看看,它应该存在于你正在使用的任何编程语言或数学库中。它有两个参数,一个点的x和y坐标(对你来说:(x-a)/r和(y-b)/r),并返回范围为-π到+π的角度。

你的伪代码看起来很像Python。如果您不介意使用Python,我推荐Shapely库。如果您只是想要算法,请检查源代码


Shapely对象有“简化”和“交集”方法。

至少在我看来,你走错了方向。一条直线有一个方程式
y=mx+b
。圆有一个方程式x2+y2=r2。你在寻找一个点,在这个点上,圆的x和y等于直线的x和y。你可以用
mx+b
方程代替圆中的
y
方程,然后用二次方程求解


所涉及的方程确实有点长,但相当多的网页(例如)都有它们,在这一点上,将方程作为一对函数实现并插入特定圆/线的值就很简单了。基于这些方程的解决方案完全避免了使用arg切线带来的歧义。

我编辑了你的问题标题,因为你似乎真的在问如何计算角度,而用线段近似曲线的问题只是上下文。圆弧的端点&圆的中心指定两条圆弧中的任意一条(它们相互补充以构成整个圆)。你如何确定哪个弧是相关的?我同意。查看直线和圆相交的位置;如果有一个或多个点,然后测试它们是否同时位于线段和圆弧上。顺便说一下,为圆引用的方程式仅适用于以原点为中心的圆。@Jonathon:是的,我不想在这里把事情弄得太复杂,我的想法是指出如何将一个替换为另一个以找到位置的一般思路(如果有)它们是相等的。不过引用的页面使用了完整的等式。