Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ вопрос по алгоритму

Автор: bigglewood 18.03.2008 16:56

две функции. при вызове LineIntersect находит координаты перечесения двух линий. работает правильно. только не могу понять каким образом.имею ввиду математически. может кто подскажет где есть теория по такому способу поиска пересечения? или коментарии какиенибуть напишет...спасибо.



function Subtract(AVec1, AVec2 : TPoint) : TPoint;
begin
Result.X := AVec1.X - AVec2.X;
Result.Y := AVec1.Y - AVec2.Y;
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);
if (LDiffLA.X*LDiffLB.Y) - (LDiffLA.Y*LDiffLB.X) <> 0 then begin
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;
end;

Автор: Michael_Rybak 18.03.2008 17:33

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

Автор: bigglewood 18.03.2008 17:37

именно такой алгоритм не удается найти.

Автор: Michael_Rybak 18.03.2008 17:48

вместо того, чтобы искать "такой" алгоритм, убери процедуру Subtract, и замени все эти умные названия на неумные. какая разница, что там отнимают векторы и ищут детерминанты, если все равно в результате решается точно та же система 2х2?

Добавлено через 1 мин.
но, конечно, если тебе страшно важно знать, что тут делается, могу почитать и рассказать smile.gif