Проверка пересечения двух отрезков

Проверка пересечения двух отрезков

{ **** UBPFD *********** by kladovka.net.ru ****
>>
X1,Y1,X2,Y2 - координаты первого отрезка
X3,Y3,X4,Y4 - координаты второго отрезка
Возвращает True, если отрезки пересекаются, иначе - False.
Зависимости: System
Автор: Fenik, <a href="mailto:fenik@nm.ru">fenik@nm.ru</a>, Новоуральск
Copyright: Николай Федоровских
Дата: 24 ноября 2005 г.
********************************************** }

function CrossLines(X1,Y1,X2,Y2, X3,Y3,X4,Y4: Integer): Boolean;
begin
 Result := (((X3-X1)*(Y2-Y1) - (Y3-Y1)*(X2-X1)) *
  ((X4-X1)*(Y2-Y1) - (Y4-Y1)*(X2-X1)) <= 0)
  and
  (((X1-X3)*(Y4-Y3) - (Y1-Y3)*(X4-X3)) *
  ((X2-X3)*(Y4-Y3) - (Y2-Y3)*(X4-X3)) <= 0)
end;

Необходимо добавить еще одно условие!иначе метод иногда глючит!нужно дописать:

and (projection_cross(X1,X2,X3,X4)and projection_cross(Y1,Y2,Y3,Y4))
вот функция:

function projection_cross(a, b, c, d: Integer): Boolean;
begin
        Result :=((max(c,d)>=min(a,b)) and (min(c,d)<=max(a,b))) return true;
end;

Все равно не всегда правильно определяет пересечение, иногда если одна линия во много раз длинней другой, и они пересекаются, возвращается false, не знаю почему...

условие из первого комментария избыточно.

Тогда уж можно функцию целиком через проекции переписать.

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...