Wiki
Clone wikiMindStream / Статьи на русском / Сопутствующие заметки / Черновик. Вариации на тему TDD
Задача:
Сделать чтобы объект на который указывает Connector, "привязался" не к центру фигуры, а к границе
https://bitbucket.org/lulinalex/mindstream/issue/158/connector
Список литературы:
- Скалярное произведение
- Векторное произведение
- Координаты точки пересечения двух прямых - примеры нахождения
- Коллинеарность векторов, условия коллинеарности векторов
- Структуры геометрических данных, основные операции
int Edge::cross(Edge &e, double &t)
- Пересечение: Прямая(отрезок) и прямая (отрезок)
Будем действовать в духе:
Пишем простой интерпретатор на 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;
Коммиты:
- пишем вводную, раз уж задача оказалась сложной.
https://bitbucket.org/lulinalex/mindstream/commits/3be48b26139c972ddf3f7761763a77333de66f50 - добавляем тест TmsLineCrossTest.
https://bitbucket.org/lulinalex/mindstream/commits/e396a5980bf62e7a8794c2d21db25873d0873c47 - упавшие тесты для недоделанной функциональности - меня лично НЕРВИРУЮТ, поэтому я предпочитаю писать в лог 'failed'. Хотя это конечно "не в духе классического TDD".
https://bitbucket.org/lulinalex/mindstream/commits/d7c4e0089d840d9d2af67d5b2e489043f537072a - определяем структуру данных с которой мы будем работать.
https://bitbucket.org/lulinalex/mindstream/commits/40fcaf126d8dd8e7a627c4cf442c212e4a35bd39 - делаем заготовку вывода линии в лог.
https://bitbucket.org/lulinalex/mindstream/commits/e1415e763e20de27e080960c62c26c2a3e4b8298 - добавляем вспомогательную структуру данных TmsPointF.
https://bitbucket.org/lulinalex/mindstream/commits/7491b441ddda404155325f223ec5dda36434c003 - добавляем метод TmsPointF.ToLog.
https://bitbucket.org/lulinalex/mindstream/commits/ca9963413efac6be5d33a71d248a357b670e6bbc - сортируем результаты тестов по папкам.
https://bitbucket.org/lulinalex/mindstream/commits/fd73855a0395fe229eac12e6236e3b6ab66b2ac5 - добавляем метод TmsPointF.N.
https://bitbucket.org/lulinalex/mindstream/commits/0601a8ccd21b9b8400894f16d2c6237a8c96827f - параметризуем имя теста.
https://bitbucket.org/lulinalex/mindstream/commits/7a40847b7f5d1cfeb7bb54c7d3de5fb74ff3136c - добавляем метод TmsLineF.Cross.
https://bitbucket.org/lulinalex/mindstream/commits/e783606f38d8e22bd3aa008c828aa6ac9ca79a7a - используем TmsLineF.Cross.
https://bitbucket.org/lulinalex/mindstream/commits/66541b8c42dec45ec081def7fc028190d4b3c6f3 - добавляем класс TmsLineCrossTestSuite.
https://bitbucket.org/lulinalex/mindstream/commits/0fe04024c35118ba39ff7b4996238a6b1610a487 - используем TmsLineCrossTestSuite.
https://bitbucket.org/lulinalex/mindstream/commits/0c37f6219b555a615d17fd4e7e8ffa739ef015d2 - добавляем структуру TmsLineFPair.
https://bitbucket.org/lulinalex/mindstream/commits/62de8f85c47b40f30b65e045ff4107a876287b85 - добавляем структуру TmsLineFPairs.
https://bitbucket.org/lulinalex/mindstream/commits/5c805d11c30568f8fd6c4820c820ae70accf56fc - используем TmsLineFPairs.
https://bitbucket.org/lulinalex/mindstream/commits/2e2d8d92ce5340b4423f09cce840281b2a730e57 - добавляем конструкторы классу TmsLineF.
https://bitbucket.org/lulinalex/mindstream/commits/032c9ef6c0c4fd63e8f22a721ed4d5b39b16db8b - используем TmsLineFPair.
https://bitbucket.org/lulinalex/mindstream/commits/743150bf75865f09c512bd740bbb6a52b0ec710d - расширяем класс TmsLineFPair.
https://bitbucket.org/lulinalex/mindstream/commits/5f4d3a754da09a7af37e9de4d3ee1524fbf082ba - параметризуем TmsLineCrossTest.
https://bitbucket.org/lulinalex/mindstream/commits/e22652caa8da8da452fd766343633f3d08dc1011 - расширяем набор тестов.
https://bitbucket.org/lulinalex/mindstream/commits/44f632dd83d9033953b6028996974e76a2eb39fd - добавляем методы TmsLineF.dX, TmsLineF.dY, TmsLineF.Length.
https://bitbucket.org/lulinalex/mindstream/commits/77f01ae7d9ce223a765b0374baa3d046d5a2171e - используем метод TmsLineF.Length.
https://bitbucket.org/lulinalex/mindstream/commits/7345401615c304973a9f06e3c81dc355c3538fe6 - дифференцируем тот случай когда и вторая линия имеет нулевую длину.
https://bitbucket.org/lulinalex/mindstream/commits/36211d3324863fe5647560c6dad6e39bd32e20be - отсекаем тот случай, когда вторая линия имеет нулевую длину, а первая - ненулевую.
https://bitbucket.org/lulinalex/mindstream/commits/3c00c60030a3ba2c8c8fd070f81ef539d62cca41 - добавляем рандомные тесты.
https://bitbucket.org/lulinalex/mindstream/commits/c27bbda41ca7803a891d71dd5e99c5b3ceef573c - добавляем ещё один граничный случай.
https://bitbucket.org/lulinalex/mindstream/commits/56c534339f0c8dcd025d9312e1fa3881bfaef162 - добавляе ещё один вариант перепендикулярности.
https://bitbucket.org/lulinalex/mindstream/commits/388e8742abc2153a5324ff35aaaee25eace7c2b4 - расширяем тестовый набор.
https://bitbucket.org/lulinalex/mindstream/commits/49cc737be83b044934e3bb2aa1e98609f088f87c?at=B158_lulin - вводим понятие скалярного произведения.
https://bitbucket.org/lulinalex/mindstream/commits/6dfb9db45fa76b46fe56dd1cc5ad3bd446116253?at=B158_lulin - добавляем функцию определения косинуса угла между векторами.
https://bitbucket.org/lulinalex/mindstream/commits/c40af8783866017619813986ae96d70022f8d9aa - проверяем параллельность прямых.
https://bitbucket.org/lulinalex/mindstream/commits/71d6f36b91a8dbdf9f799a3bacbb0d61c195757f - добавляем тесты параллельности.
https://bitbucket.org/lulinalex/mindstream/commits/2297de81f97ee774eeda7875c96972407a84a607 - пишем комментарии.
https://bitbucket.org/lulinalex/mindstream/commits/1e200b5df639744ceed58e15fddb58546cdffe97 - СНАЧАЛА проверяем параллельность прямых.
https://bitbucket.org/lulinalex/mindstream/commits/350f4a2c7523ea77e536629dc23144089a66bcfb - Далее тесты прямой параллельной X и диагональной.
https://bitbucket.org/lulinalex/mindstream/commits/f3c585e68d01261ed96b9df3cfcceac595be0c2c - Далее тесты прямой параллельной Y и диагональной.
https://bitbucket.org/lulinalex/mindstream/commits/49790ac333f57308a69f92adc6076e5b27c51938 - выделяем процедуру DoCross.
https://bitbucket.org/lulinalex/mindstream/commits/1f44125d9cdb313d93acb493589163a106f007c0 - вытаскиваем процедуру DoCross в правильное место.
https://bitbucket.org/lulinalex/mindstream/commits/6e3f995e9b8df763368f89cdcfcfbd40174b19a4 - упрощам код.
https://bitbucket.org/lulinalex/mindstream/commits/76680457ac57f6cdd8d22398cc4dbbb0088fefb8 - вставляем проверку на граничный случай.
https://bitbucket.org/lulinalex/mindstream/commits/391d31676bfb5a641b0c7124651f703454eaee8f - при граничном случай меняем линии местами.
https://bitbucket.org/lulinalex/mindstream/commits/a2a8afa66752665eea22a56d67d262b94d7c2370 - добавляем ещё тест на тот же граничный случай.
https://bitbucket.org/lulinalex/mindstream/commits/170a47e4a0808193191f02d557d4c64262bcc00b - добавляем ещё тест прямой параллельной Y и диагональной.
https://bitbucket.org/lulinalex/mindstream/commits/2dcdcb8a61c793ec1d8fdcb9b57f35ebc0ce5fb0 - возвращаем результат, про который забыли.
https://bitbucket.org/lulinalex/mindstream/commits/45a3e7f6fea771098d05f9fe426e30996562855b - упрощаем код.
https://bitbucket.org/lulinalex/mindstream/commits/5310dad62e65480851cd6dda9adb41dd538f95d7 - упрощаем код.
https://bitbucket.org/lulinalex/mindstream/commits/e25b3e0ca989a97e2a26cd1bd69d175e12501c38 - упрощаем код.
https://bitbucket.org/lulinalex/mindstream/commits/cf8155d5664d1150e73762a8ff27e59a526e9286 - выделяем заготовочку для обобщения.
https://bitbucket.org/lulinalex/mindstream/commits/9f40ab6e5c902407cb4663d582ffe1b80e588ad6
Updated