1

У меня следующая ситуация: базовая точка (зеленая) и сегменты, для каждого сегмента его вершины представлены как полярная точка с углом тета от базовой точки.Направление сегмента в полярной плоскости

enter image description here

Проблема: Для каждого сегмента у меня есть его 2 вершины тета-х. Не заказано! Мне нужно только из этих данных выяснить диапазон углов, которые этот сегмент перекрывает. Например, для 2 вершин {20,300}, принадлежащих верхнему сегменту, правильный ответ - все углы от 300 до 20 и НЕ от 20 до 300.

Направление от 0 до 359 и, как видно на примере, это циклическая.

EDIT: Успенская - Максимальный угол перекрытия для сегмента составляет менее 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) (полуоткрытый интервал), мы можем w.l.o. предположим, что х> = у. Тогда диапазоны (x - y) и (y - x + 360). Вычислите оба и возьмите меньший из двух. В вашем примере: (300 - 20) = 280 и (20 - 300 + 360) = 80, поэтому 80 - это ответ (или 300-20, если вы предпочитаете формат диапазона). Опять же: вычислите оба (x - y) и (y - x + 360), и ваш диапазон будет «y через x», если (x - y) меньше или «x через y», если (y - x + 360) меньше.

Теперь рассмотрим случай, когда x = y + 180. Что должен ответить вашему алгоритму? Это не риторический вопрос - это вопрос для пользователей.

+0

очень хороший ответ! – michael

Смежные вопросы