如何实现GLSL中从点到线段的距离?

时间:2012-02-12 03:08:32

标签: glsl

我似乎无法在这里发现我的错误,是吗?

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计划,(我的第一个是圆圈。)感谢您的投入!

2 个答案:

答案 0 :(得分:5)

您没有很好地解释函数应该做什么以及您的单字符变量名称实际意味着什么。我猜测ab是线段上的点,而p是您感兴趣的点。 r必须与函数测试一定距离(通常,您应该返回距离并让用户对其进行测试。如果他们想要保留它,那么它就是特权)。

我猜你真正的问题是C,C ++或GLSL都不是^“提升到权力”运算符。

在任何情况下,此函数的correct version如下:

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分量(我只做一次得到垂直)。

答案 1 :(得分:2)

distance between a point and a line

假设我们有两个点 pt1、pt2(用于线)和一个期望的点 pt3。

v1 = 线向量 (pt2-pt1)

v2 = 直线的第一个点和所需点 pt3 (pt1-pt3) 之间的向量

v3 = 垂直于向量(交换 v1.x、v1.y 的 v1,并将其中之一乘以 -1 得到 v3)

h = pt3 与直线之间的距离

dot(v2, v3) = |v2||v3|cos(theta + PI /2) ⟹ cos(theta + PI /2) = dot(v2, v3) / (|v2|| v3|) ⟹ sin(theta) = -dot (v2,v3) /(|v2||v3|) 并且 h = |v2| .罪(θ)
⟹ h = dot(v2,v3) / |v3| = dot(v2,norm(v3))

GLSL 中的代码:

float dist(vec2 pt1, vec2 pt2, vec2 pt3)
{
   vec2 v1 = pt2 - pt1;
   vec2 v2 = pt1 - pt3;
   vec2 v3 = vec2(v1.y,-v1.x);
   return abs(dot(v2,normalize(v3)));
}

另一种方法参见 https://www.ck12.org/book/ck-12-college-precalculus/section/9.6/ 以了解“将一个向量投影到另一个向量上”。