2012-06-23 2 views
-1

это какой-то переход к моему последнему вопросу. Мне нужно было найти алгоритм, который обнаруживает пересекающиеся/пересекающиеся линии.проверка совпадающих строк в столкновении

следующий код работал хорошо в большинстве случаев, но не правильно иметь дело с совпадающими линиями:

public static function checkLinesIntersection(p_a:Point,p_b:Point,p_c:Point,p_d:Point):Point 
{ 

    // Denominator 
    var d:Number = (p_d.y - p_c.y) * (p_b.x - p_a.x) - (p_d.x - p_c.x) * (p_b.y - p_a.y); 

    // 
    var n_a:Number = (p_d.x - p_c.x) * (p_a.y - p_c.y) - (p_d.y - p_c.y) * (p_a.x - p_c.x); 
    var n_b:Number = (p_b.x - p_a.x) * (p_a.y - p_c.y) - (p_b.y - p_a.y) * (p_a.x - p_c.x); 

    var ua:Number = n_a/d; 
    var ub:Number = n_b/d; 

    var p_intersection:Point = new Point(); 

    //coincidental but also happenes when lines are just aligned on the same plane 
    if(d + n_a + n_b == 0){ 

     //how can i find if the lines really coincide and are not just in alignment, or parallel? 

    }; 
    if ((ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1)) 
    { 
     p_intersection.x = p_a.x + (ua * (p_b.x - p_a.x)); 
     p_intersection.y = p_a.y + (ua * (p_b.y - p_a.y)); 
     return p_intersection; 
    } 
    return null; 
} 

как я могу уточнить код, так что только совмещенной и не параллельных линий оцениваются как пересечение?

спасибо большое!

+0

Что такое пример, для которого он не работает? Какую отладку вы сделали до сих пор? –

+0

Вы должны различать линии и сегменты. Думаю, вы говорите о сегментах? –

+0

привет! @ Oli Charlesworth: Я проверил следующую ситуацию: это работает и waht я хочу достичь (пользователь не позволяет рисовать фигуры с пересекающимися линиями) http://i.imgur.com/Ss8I8.png однако это одна: http://i.imgur.com/fYwSP.png \ п должен быть правильным, но приведенный выше код не может различить параллельно и совпадающие один. @ lcfseth Да, i huess i означает сегменты. – zantafio

ответ

1

Обнаружение двух совпадающих линий легко. все, что вам нужно сделать, - взять нижнюю точку обоих сегментов, назовем их m1, m2 и высшими точками M1, M2.

Теперь проверьте, пересекается ли m1M2 с m2M1.

Если они этого не делают, они находятся на одной линии.

Теперь просто проверьте, что верхний конец нижнего сегмента находится в верхнем сегменте. Illustration

+0

Теперь проверьте, пересекается ли m1M2 m2M1. - эти две точки всегда будут пересекаться, даже если на одной и той же линии единственное различие будет состоять из числа точек, в которые они пересекаются. – sweetfa

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