极坐标平面中的分段方向

时间:2015-09-18 18:42:27

标签: algorithm geometry computational-geometry euclidean-distance polar-coordinates

我有以下情况:基点(绿色)和段,对于每个段,他的顶点表示为极点,与基点的角度为θ。

enter image description here

问题:对于每个片段,我都有他的2个顶点θ。没有订购!我只需从这些数据中找出该段重叠的角度范围。例如,对于属于顶部片段的2个顶点{20,300},正确的答案是从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...
    }
}

谢谢,

1 个答案:

答案 0 :(得分:1)

让我们不谈线段穿过原点的情况。我们稍后会考虑。

角度将定义两个弧:一个小于180度,一个大于180度。您的弧将始终是小于180度的弧。为什么?考虑垂直移位的x轴非常小。范围将是90度到270度,粗略地,给予或少量。只要您保持在x轴的同一侧,两个角度都不会超过直角,因此总和将小于2 x 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时的情况。那么你的算法应该怎么回答呢?这不是一个修辞问题 - 对用户来说这是一个问题。