Как я могу реализовать расстояние от точки до отрезка в GLSL? - PullRequest
0 голосов
/ 12 февраля 2012

Я просто не могу определить свою ошибку здесь, не так ли?

bool oblong (vec2 p, vec2 a, vec2 b, float r) {
 return (((b.y-a.y)*(p.x-a.x)+(b.x-a.x)*(p.y-a.y))^2/((b.x-a.x)^2+(b.y-a.y)^2)<= r);
}

Это моя вторая программа GLSL, (моей первой был круг.) Спасибо за ваш вклад!

1 Ответ

5 голосов
/ 12 февраля 2012

Вы не очень хорошо объясняете, что должна делать функция и что на самом деле означают имена ваших односимвольных переменных.Я предполагаю, что 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 (я делаю это только один раз, чтобы получить перпендикуляр).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...