у меня есть следующий код по нахождению расстояния между точкой и прямой:
template<typename T>
using point_t = std::pair<T, T>;
template<typename T>
using line_segment_t = std::pair<point_t<T>, point_t<T>>;
template<typename CoordinateType>
double get_distance_between_point_and_line_segment(const
line_segment_t<CoordinateType>& line_segment, const point_t<CoordinateType>& point) noexcept
{
const CoordinateType x = std::get<X_COORDINATE>(point);
const CoordinateType y = std::get<Y_COORDINATE>(point);
const CoordinateType x1 = std::get<X_COORDINATE>(line_segment.first);
const CoordinateType y1 = std::get<Y_COORDINATE>(line_segment.first);
const CoordinateType x2 = std::get<X_COORDINATE>(line_segment.second);
const CoordinateType y2 = std::get<Y_COORDINATE>(line_segment.second);
const double double_area = abs((y2-y1)*x - (x2-x1)*y + x2*y1 - y2*x1);
const double line_segment_length = sqrt((x2*x2 - x1*x1) + (y2*y2 - y1*y1));
return double_area / line_segment_length;
}
Казалось бы все хорошо, но если я например по даю на вход линию { (5;1), (1;5) }
, то при вычислении ее длины я получаю 0, и следовательно дальше деление на ноль... В моей ситуации я не могу проверить на результат line_segment_length
и выбросить скажем исключение если длина равна нулю. Мне нужно узнать хотя бы примерную длину между точкой и отрезком, когда line_segment_length
стала равна нулю. Как это все можно реализовать?
Как правильно сказал @AlexKrass, у вас ошибка в строке
const double line_segment_length = sqrt((x2*x2 - x1*x1) + (y2*y2 - y1*y1));
Длина (Евклидова норма) - это корень из суммы квадратов разностей координат. Должно быть
const double line_segment_length = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
или, после раскрытия скобок
const double line_segment_length = sqrt(x2*x2 - 2*x2*x1 + x1*x1 + y2*y2 - 2*y2*y1 + y1*y1);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как отключить предупреждения в VS 2017? Использование #define _CRT_SECURE_NO_WARNINGS в самом начале кода не помогаетЕсли поставить в свойствах препроцессора...
Есть ли более короткая запись сравнения BigDecimal chisl1 >= chisl2, чтобы не писать два условия в if?