Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Точка пересечения отрезков 
V
    Опции темы
Recev
  Дата 6.2.2011, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Есть два отрезка, нарисованных на канве. Они пересекаются, как найти точку их пересечения?

Добавлено через 6 минут и 39 секунд
Нашел функции, но не знаю как ними пользоваться:
Код

function LinesCross(LineAP1, LineAP2, LineBP1, LineBP2 : TPoint) : boolean;   
Var   
  diffLA, diffLB : TPoint;   
  CompareA, CompareB : integer;   
begin  
  Result := False;   
    
  diffLA := Subtract(LineAP2, LineAP1);   
  diffLB := Subtract(LineBP2, LineBP1);   
    
  CompareA := diffLA.X*LineAP1.Y - diffLA.Y*LineAP1.X;   
  CompareB := diffLB.X*LineBP1.Y - diffLB.Y*LineBP1.X;   
    
  if ( ((diffLA.X*LineBP1.Y - diffLA.Y*LineBP1.X) < CompareA) xor  
       ((diffLA.X*LineBP2.Y - diffLA.Y*LineBP2.X) < CompareA) ) and  
     ( ((diffLB.X*LineAP1.Y - diffLB.Y*LineAP1.X) < CompareB) xor  
       ((diffLB.X*LineAP2.Y - diffLB.Y*LineAP2.X) < CompareB) ) then  
    Result := True;   
end;   
    
function LineIntersect(LineAP1, LineAP2, LineBP1, LineBP2 : TPoint) : TPointFloat;   
Var   
  LDetLineA, LDetLineB, LDetDivInv : Real;   
  LDiffLA, LDiffLB : TPoint;   
begin  
  LDetLineA := LineAP1.X*LineAP2.Y - LineAP1.Y*LineAP2.X;   
  LDetLineB := LineBP1.X*LineBP2.Y - LineBP1.Y*LineBP2.X;   
    
  LDiffLA := Subtract(LineAP1, LineAP2);   
  LDiffLB := Subtract(LineBP1, LineBP2);   
    
  LDetDivInv := 1 / ((LDiffLA.X*LDiffLB.Y) - (LDiffLA.Y*LDiffLB.X));   
    
  Result.X := ((LDetLineA*LDiffLB.X) - (LDiffLA.X*LDetLineB)) * LDetDivInv;   
  Result.Y := ((LDetLineA*LDiffLB.Y) - (LDiffLA.Y*LDetLineB)) * LDetDivInv;   
end;   
    
function Subtract(AVec1, AVec2 : TPoint) : TPoint;   
begin  
  Result.X := AVec1.X - AVec2.X;   
  Result.Y := AVec1.Y - AVec2.Y;   
end;  

PM MAIL   Вверх
Cheloveck
Дата 6.2.2011, 16:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



  • Восстанавливаешь уравнения прямых, на которых лежат отрезки;
  • Находишь точку пересечения этих прямых, решая уравнение первое_уравнение_прямой = второе_уравнение_прямой;
  • Если решение найдено, проверяешь, лежит ли эта точка на отрезках (проверка, лежат ли проекции этих точек на оси координат внутри проекций отрезков);
  • Если лежит внутри проекций - это твоя точка, иначе - отрезки не пересекаются.
  Тут можно подсмотреть решение, правда на Java.

Это сообщение отредактировал(а) Cheloveck - 17.2.2011, 16:38


--------------------
user posted image
PM Jabber   Вверх
Recev
Дата 6.2.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 18.10.2010

Репутация: нет
Всего: нет



Спасибо, разобрался с функциями написанными мной в первом сообщении.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0704 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.