Есть класс Line, описывающий прямую на плоскости, заданную уравнением прямой. Как реализовать метод, который отдаёт либо точку пересечения, если она есть, либо каким-то образом даёт знать, что её нету?
Пока что придумал только два варианта: либо возвращать bool в зависимости от наличия пересечения и принимать в аргументах дополнительный указатель на Point, либо возвращать указатель на созданный в функции экземпляр Point или null, если пересечений нету.
Оба варианта мне не нравятся, поэтому прошу свежих идей.
Может, вообще исключения попробовать?
Другие языки программирования и технологии
Какой наиболее лаконичный способ реализовать Line::intersect(Line) в С++?
Идея возвращать указатель - правильная. Поскольку результат пересечения двух линий на плоскости одно из трех - точка, линия и ничего, то возвращать этот метод должен указатель на общего родителя линии и точки. То есть должен быть некий абстрактный класс - фигура. Будет несколько неудобно проверять, что получилось, но без этого получится уж очень непрозрачно.
Ещё чуток смущает то, что метод Intersect не статический. Более логично объявить его статическим методом некого отдельного класса, который получает в качестве аргументов 2 линии. Дело в том, что если вы объявите новый тип - окружность, то для пересечения окружности и линии в вашем потребуется по одному методу в классах линия и окружность, а в моём случае только один статический в служебном классе.
Кстати, при пересечении окружности и линии результат - ничего, точка или отдельный композитный объект, также наследуемый от фигуры и способный содержать вектор фигур, так как в этом случае точек будет 2 штуки.
Для обобщения на 3-мерный случай такая структура тоже работает. Пример - пересечение плоскости и окружности: окружность|пара_точек (композит) |точка|ничего.
Ещё чуток смущает то, что метод Intersect не статический. Более логично объявить его статическим методом некого отдельного класса, который получает в качестве аргументов 2 линии. Дело в том, что если вы объявите новый тип - окружность, то для пересечения окружности и линии в вашем потребуется по одному методу в классах линия и окружность, а в моём случае только один статический в служебном классе.
Кстати, при пересечении окружности и линии результат - ничего, точка или отдельный композитный объект, также наследуемый от фигуры и способный содержать вектор фигур, так как в этом случае точек будет 2 штуки.
Для обобщения на 3-мерный случай такая структура тоже работает. Пример - пересечение плоскости и окружности: окружность|пара_точек (композит) |точка|ничего.
А если линии совпадают, что возвращать?
Можно передать по ссылке массив (вектор etc). Тогда и bool не надо возвращать. Сразу видно сколько пересечений найдено.
Если же нужен более глубокий анализ, то можно возращать некоторые коды, как уже написал Ponyfag1337. Для линии это могут быть например: Ок, Параллельны, Совпадают.
Для кадов возращать код ошибки содержащий некоторую информацию - норма.
А вот исключения... Они всё таки предназначены для исключительных ситуаций, а может так случиться, что их генерация у вас станет нормой. Тогда всё немножко подвиснет. Конкретно так.
Если же нужен более глубокий анализ, то можно возращать некоторые коды, как уже написал Ponyfag1337. Для линии это могут быть например: Ок, Параллельны, Совпадают.
Для кадов возращать код ошибки содержащий некоторую информацию - норма.
А вот исключения... Они всё таки предназначены для исключительных ситуаций, а может так случиться, что их генерация у вас станет нормой. Тогда всё немножко подвиснет. Конкретно так.
Похожие вопросы
- Как вы думаете эту идею можно реализовать если нет начального капитала?
- Как можно реализовать на практике нижеописанный формат видеоуроков?
- Помогите реализовать на C#
- Разработать класс описывающий множество точек на плоскости, реализовать метод который возвращает наименьшее расстояние
- Как на c++ реализовать прием строки произвольного размера из консоли?
- Как в C++ разбить число на цифры и вывести их через пробел? Решение задачи реализовать с помощью конструкции switch.
- Какой MP3 кодек наиболее точно сохраняет исходный материал ?
- Как в 3D Max'е переместить (или создать) Линию (line) так, чтоб её конец точно привязался к центру Круга (circle)?
- Помогите с проблемой,Есть ли или существует метод-способ востоновить данные,файлы с карты памяти телефона.
- 3DSMax. Подскажите как рисуя линию (line), без отрыва рисования, перемещаться по чертежу?
тогда переработать вариант с возвращаемым bool, чтобы возвращались коды ошибок типа GEOM_NO_SOLUTIONS, GEOM_INFINITY_SOLUTIONS