1

我有以下情況:基點(綠色)和分段,對於每個分段,他的頂點用極座標表示,並帶有從基點起的角度。在極座標平面中的分段方向

enter image description here

問題是:對於每一段我有他的2個頂點THETA的。沒有訂購!我只需要從這些數據中找出這個分段重疊的角度範圍。例如,對於屬於頂部線段的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

讓我們拋開線段穿過原點的情況。我們會在稍後考慮。

這些角度將定義兩個弧:一個小於180度,另一個大於180度。你的弧線總是小於180度的弧線。爲什麼?考慮x軸垂直移動一小部分。範圍將爲90度至270度,大致爲贈送者或需要少量。只要您保持在x軸的同一側,任何角度都不會超過直角,因此總和將小於2 x 90度。給定任意兩個角度x和y,其中x和y在[0,360)(半開區間)中,我們可以寫成0,1,0。假定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 + 180時的情況。那麼你的算法應該怎麼回答?這不是一個修辭問題 - 這是用戶的問題。

+0

很好的答案! – michael