Здравствуйте, anonymous, Вы писали:
A>все-таки мне кажется, что сниппет не должен быть больше функции (и уж точно не классом, по крайней мере пока)... и тогда вопрос предельно упрощается: есть четыре точки, через которые проходят две прямые, пресекаются ли они?... итог: функция, на входе которой 8 переменных с координатами, на выходе — булево значение... и теперь любой программист может взять её и использовать в одном из собственных классов описывающих геометрию, т. о. дублирования кода не будет...
Таким образом отказываемся от ООП.
Компактно-крохотных сниппетов может оказаться совсем немного.
Плюс, если копнуть чуть глубже, появляются новые неприятности:
если мы говорим о C++
template < typename T >
bool is_intersect_lines2( T p00x, T p00y, T p01x, T p01y,
T p10x, T p10y, T p11x, T p11y );
1. при
каждом вызове ф-ии, необходимо проверять вырожденные случаи —
( p00x == p01x && p00y == p01y ) ||
( p10x == p11x && p10y == p11y )
если мы будем использовать классы, можно делать такую проверку один раз в конструкторе.
Конечно, эту проблему можно переложить на пользователя, потребовать обязательно проверять передаваемые параметры, но тогда код становится более опасным (для меня это было бы уже достаточной причиной отказаться от использования такого сниппета)
p00x == p01x Эту операцию должен предоставлять пользователь — получаем еще один параметр у is_intersect_lines2, указатель на функцию сравнения.
2. Немножно субъективизма.
Посмотрим на другую ф-ю — определение точки пересечения прямых в 3d. Просто прикинем ее сигнатуру. Координаты входящих точек — шесть параметров, ф-я сравнения — один, результат — еще три. Итого — 10
template < typename T >
bool intersect_lines3( T p00x, T p00y, T p00z, T p01x, T p01y, T p01z,
T p10x, T p10y, T p10z, T p11x, T p11y, T p11z,
is_equal_t equal,
T* resx, T* resy, T* resz );
К чему это говорю — такую страшилку использовать в своем проекте захочется только от большоой тоски, чесслово