如何在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是死的,嗯–这是针对线条的,而不是线段的?