【发布时间】:2021-01-01 04:16:49
【问题描述】:
我似乎无法在这里发现我的错误,你可以吗?
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 程序,(我的第一个是一个圆圈。)感谢您的意见!
【问题讨论】:
标签: 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 程序,(我的第一个是一个圆圈。)感谢您的意见!
【问题讨论】:
标签: glsl
您没有很好地解释该函数应该做什么以及您的单字符变量名的实际含义。我猜a 和b 是线段上的点,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 分量(我只做一次以获得垂直)。
【讨论】:
distance between a point and a line
假设我们有两个点 pt1、pt2(用于线)和一个所需的点 pt3。
v1 = 线向量 (pt2-pt1)
v2 = 直线的第一个点和所需点 pt3 之间的向量 (pt1-pt3)
v3 = 垂直于向量(交换v1的v1.x、v1.y,并将其中一个乘以-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| =点(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)));
}
另一种方法是“将一个向量投影到另一个向量上”,另请参见 https://www.ck12.org/book/ck-12-college-precalculus/section/9.6/。
【讨论】: