我有以下情况:基点(绿色)和线段,对于每个线段,他的顶点表示为与基点成θ角的极坐标点。
algorithm - 极平面中的线段方向-LMLPHP
问题是:对于每一段,我有他的两个顶点θ。没有顺序我只需要从这些数据中找出这个段重叠的角度范围例如,对于属于顶部段的2个顶点{20300},正确答案是所有角度都在300到20之间,而不是20到300之间。
方向是从0到359,如示例所示,它是循环的。
编辑:假设-段的最大重叠角小于180,这意味着179。
我认为解决办法就是为if找到“正确的条件”。。。

class Node {
    int theta;  //angle from base point e.g. 45
    double radius;  //distance (in problem specific metric) from base point
}

class Segment {
    //nodes not ordered in any way
    Node node_1;
    Node node_2;
}

List<Segments> allSegments = new ArrayList<>();
//populate allSegments...

Segment mSegment;
for (int i=0; i<allSegments.size(); i++) {
    mSegment = allSegments.get(i);
    if (TODO? mSegment.node_1.tetha ? mSegment.node_2.theta) {
       //the order is from node_1 to node_2 or otherwise...
    }
}

谢谢,

最佳答案

让我们撇开线段穿过原点的情况我们以后再考虑。
角度将定义两条弧:一条小于180度,一条大于180度。你的弧度总是小于180度。为什么?考虑X轴垂直位移很小的量。范围将是90度到270度,大致上,给予者或采取少量。只要你保持在X轴的同一边,两个角度都不会超过一个直角,所以总和将小于2×90度。
给定任意两个角x和y,x和y在[0,360)(半开区间),我们可以w.l.o.g.假设x>=y,那么范围是(x-y)和(y-x+360)。计算两者,取两者中较小的一个。在您的示例中:(300-20)=280和(20-300+360)=80,所以80是答案(或者300-20,如果您喜欢范围格式的话)再次:计算(x-y)和(y-x+360),如果(x-y)较小,则范围为“y到x”,如果(y-x+360)较小,则范围为“x到y”。
现在考虑x=y+180的情况。那么你的算法应该回答什么呢这不是一个反问句-这是用户的问题。

10-07 19:01
查看更多