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

如何在GLSL中实现点到线段的距离?,glsl,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); } bool长方形(vec2p,vec2a,vec2b,float r){ 返回((b.y-a.y)*(p.x-a.x)+(b.x-a.x)*(p.y-a.y))^2/(b.x-a.x)^2

我只是看不出我的虫子在这里,你能吗

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);
}
bool长方形(vec2p,vec2a,vec2b,float r){

返回((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)您没有很好地解释函数应该做什么以及单字符变量名的实际含义。我想,
a
b
是线段上的点,
p
是关注点。
r
必须是函数测试的距离(通常,你应该返回距离,让用户根据它进行测试。如果他们想保持距离,这是他们的特权)

< P> >我猜你的真正问题是,在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分量(我只做一次以获得垂直).

您没有很好地解释函数应该做什么以及单字符变量名的实际含义。我猜
a
b
是线段上的点,
p
是关注点。
r
必须是函数测试的距离(通常,你应该返回距离,让用户根据它进行测试。如果他们想保持距离,这是他们的特权)

< P> >我猜你的真正问题是,在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分量(我只做一次以得到垂直方向)。

假设我们有两个点pt1,pt2(直线)和一个期望点pt3

v1=线向量(pt2-pt1)

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

v3=垂直于向量(交换v1的v1.x和v1.y,并将其中一个乘以-1以生成v3)

h=pt3和线路之间的距离

点(v2,v3)=v2 | v3 | cos(θ+π/2)⟹ cos(θ+PI/2)=点(v2,v3)/(v2 | v3 |)⟹ sin(θ)=-dot(v2,v3)/(v2 | v3 |) h=| v2 | sin(θ)
⟹ h=点(v2,v3)/| v3 |=点(v2,范数(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)));
}
另请参见“将一个向量投影到另一个向量上”作为另一种方法。

假设我们有两个点pt1,pt2(直线)和一个期望点pt3

v1=线向量(pt2-pt1)

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

v3=垂直于向量(交换v1的v1.x和v1.y,并将其中一个乘以-1以生成v3)

h=pt3和线路之间的距离

点(v2,v3)=v2 | v3 | cos(θ+π/2)⟹ cos(θ+PI/2)=点(v2,v3)/(v2 | v3 |)⟹ sin(θ)=-dot(v2,v3)/(v2 | v3 |) h=| v2 | sin(θ)
⟹ h=点(v2,v3)/| v3 |=点(v2,范数(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)));
}

另请参见“将一个向量投影到另一个向量上”作为另一种方法。

谢谢,尼科尔;我不知道“pow”功能。它现在正在工作。这个网站可能有太多的旁白,但glsl.heroku.com非常适合说明这些问题并快速进行实验…@dan brickley你是对的,还有太多了。glsl.heroku.com是dead-hmm–这是针对线条的,而不是线段,但不是吗hanks,Nicol;我不知道“pow”功能。它现在正在发挥作用。这个网站可能有太多的旁白,但glsl.heroku.com非常适合演示这些问题并快速进行实验…@dan brickley你说得对,还有太多。glsl.heroku.com是死的,嗯–这是针对线条的,而不是线段的?