Расстояние от точки до прямой С++

164
30 января 2020, 00:20

у меня есть следующий код по нахождению расстояния между точкой и прямой:

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 стала равна нулю. Как это все можно реализовать?

Answer 1

Как правильно сказал @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);
READ ALSO
Не понимаю, почему не работает vector?

Не понимаю, почему не работает vector?

Одно из действий в задаче, заполнить массив

160
Как отключить предупреждения #define _CRT_SECURE_NO_WARNINGS в VS 2017

Как отключить предупреждения #define _CRT_SECURE_NO_WARNINGS в VS 2017

Как отключить предупреждения в VS 2017? Использование #define _CRT_SECURE_NO_WARNINGS в самом начале кода не помогаетЕсли поставить в свойствах препроцессора...

135
Сравнение BigDecimal &ldquo;&gt;=&rdquo;

Сравнение BigDecimal “>=”

Есть ли более короткая запись сравнения BigDecimal chisl1 >= chisl2, чтобы не писать два условия в if?

201
Как игнорировать null значения в SQL запросе

Как игнорировать null значения в SQL запросе

Написал вот такой запрос

141