我有两个弧,由包含起始和终止角度,中心和半径的对象定义。
该定义如下所示:
arc = {
start: 0,
end: Math.PI,
radius: 10,
centre: [0, 0]
}
我想知道弧是否在任何点相交,但我不确定如何做到这一点。我已经尝试在弧的相同半径和中心的两个圆之间找到交点,然后检查这些点是否在两个弧上,但由于我的开始/结束角度可能介于两者之间,这很复杂0和2π - 它们可以是任何值,我不知道如何检查圆形交叉点是否位于弧上。
如何检查两个弧是否相交? (对于它的价值,我使用JavaScript,但任何语言都可以作为答案)
答案 0 :(得分:0)
从更简单的情况开始。你如何测试两个圆的交集。两个圆将在零位置(相隔太远),正好一个(只是触摸),两个位置(重叠)或处处(中心和半径相等)相交。
弄清楚如何计算圆圈重叠的一个或两个位置,然后弄清楚两个圆弧中是否包含任何一个点。
对于最后一部分,我会规范范围,以便start
介于(-pi, pi]
之间(与atan2()
相同的返回范围)。
while ( start > M_PI ) { start -= 2 * M_PI, end -= 2 * M_PI ; }
然后使用atan2()
找到交点在圆圈内的角度,并测试它在start
和end
之间。
如果你可以让它工作,并希望进一步提高性能,有一些方法可以使用跨产品进行类似的测试,而不需要三角计算,但它们需要一定数量的特殊情况。
答案 1 :(得分:0)
嗯,这有点旧,但需要回答。但首先,弧形结构没有足够的信息来处理问题的方式。没有什么可以告诉弧是否超过2pi弧度和周围多少次。如果确实如此,无论如何,超过2pi的弧的想法几何上都是荒谬的,并且需要避免这种可能性。如果你想在这里编写很多代码来处理非几何概念,那就超出了我要解决的范围,你可以在结构中包含更多数据并对其进行正确测试。也没有什么可以告诉我们弧是否被定义为始终顺时针,逆时针。但如果方向定义明确,问题很容易解决。现在,让我们假设从不使用零长度弧,并且弧永远不会超过2pi弧度。我们还假设弧总是顺时针定义。
现在很容易。最多获得两个点,这两个点是两个弧所在的两个圆的交点。对两个点重复分析......
获取交叉点的角度。如果弧形起始角度小于结束角度,则只需测试以确定交叉角度是否在这两个角度之间或之间。但是如果起始角度大于电弧的终止角度,那么进行两次测试,一次检查交叉角是否等于或高于起始角度,还是等于或低于2pi弧度,并且如果需要还要测试,看是否交叉角等于或大于零并且等于或低于弧的终止角。
我认为伪代码看起来像这样:
on_arc = false;
if( start > end )
{
if( intersect >= start && intersect <= 2pi )
on_arc = true;
else if( intersect >= 0 && intersect <= end )
on_arc = true;
}
else if( start == end )
on_arc = true; // arc is the entire circle since we are not handling zero length arcs.
else
{
if( intersect >= start && intersect <= end )
on_arc = true;
}
如果弧形结构中有一个标志来判断弧线是顺时针还是逆时针,那么代码可以在测试之前简单地交换起始角度和结束角度。
避免使用&gt; 2pi弧形的想法,因为它没用。无论计算弧是什么,都可以是某种几何2D概念,也可能是2pi的限制。