Wiki

Clone wiki

MindStream / Статьи на русском / Сопутствующие заметки / Черновик. Вариации на тему TDD

https://bitbucket.org/lulinalex/mindstream/src/8991728832609ee5d7003fde81e04c74d16e8825/Drafts/LineCross.txt?at=B158_lulin

Задача:
 Сделать чтобы объект на который указывает Connector, "привязался" не к центру фигуры, а к границе
  https://bitbucket.org/lulinalex/mindstream/issue/158/connector

Список литературы:

Будем действовать в духе: Пишем простой интерпретатор на C++ с помощью TDD

Алгоритмы от Мишы Костицына:

Ищем точку пересечения прямых:

#!delphi
procedure FindCross(X1, Y1, X2, Y2, Xa, Ya, Xb, Yb: Extended; var aX, aY: Extended);  
begin  
  aY := ((X2 - X1) * (Yb - Ya) * Y1 - (Xb - Xa) * (Y2 - Y1) * Ya + (Xa - X1) * (Y2 - Y1) * (Yb - Ya)) / 
        ((X2 - X1) * (Yb - Ya) - (Xb - Xa) * (Y2 - Y1));  
  aX := (X2 - X1) * (aY - Y1) / (Y2 - Y1) + X1;  
end;

Проверяем, пересекаются ли отрезки:

#!delphi
function LinesCross(X1, Y1, X2, Y2, Xa, Ya, Xb, Yb: Extended; var aX, aY: Extended): Boolean;  
  function Btwn(Value, One, Two: Extended): Boolean;  
  begin  
    Result := (Value >= Min(One, Two)) and (Value <= Max(One, Two));  
  end;  

begin  
  FindCross(X1, Y1, X2, Y2, Xa, Ya, Xb, Yb, aX, aY);  
  Result := Btwn(aX, X1, X2) and  
            Btwn(aX, Xa, Xb) and  
            Btwn(aY, Y1, Y2) and  
            Btwn(aY, Ya, Yb);  
end;
Осталось перебрать стороны прямоугольника и аккуратно проверить граничные значения, чтобы исключить деление на ноль.

Коммиты:

Updated