Вы не очень хорошо объясняете, что должна делать функция и что на самом деле означают имена ваших односимвольных переменных.Я предполагаю, что a
и b
- это точки на отрезке, а p
- это интересная точка.r
должно быть какое-то расстояние, с которым проверяется функция (обычно вы должны вернуть расстояние и позволить пользователю проверить его. Если они хотят сохранить его, оно там прерогативно).
Я полагаю, ваше реальноепроблема в том, что ни в C, ни в C ++, ни в GLSL ^
не является оператором «повышения до мощности».
В любом случае правильная версия этой функции будет выглядеть следующим:
float DistToLine(vec2 pt1, vec2 pt2, vec2 testPt)
{
vec2 lineDir = pt2 - pt1;
vec2 perpDir = vec2(lineDir.y, -lineDir.x);
vec2 dirToPt1 = pt1 - testPt;
return abs(dot(normalize(perpDir), dirToPt1));
}
Обратите внимание, что этот код не был проверен.Я просто внедряю решение, представленное на данном сайте.Это реализовано в векторной записи с векторной арифметикой.Обратите внимание, что я очень редко получаю компоненты X и Y (я делаю это только один раз, чтобы получить перпендикуляр).