2012-02-12 95 views
1

我似乎無法在這裏發現我的錯誤,對不對?如何在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程序,(我的第一次是一個圓圈。)感謝您的輸入!

回答

4

你不能很好地解釋函數應該做什麼以及你的單字符變量名稱實際上意味着什麼。我猜測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組件(我只做了一次以獲得垂直)。

+0

謝謝,尼科爾;我不知道'pow'功能。現在正在工作。 – Jackalope 2012-02-12 06:33:26

+1

也許對這個網站有太多的遺憾,但是glsl.heroku.com非常適合用來解釋這樣的問題並且快速地進行實驗...... – 2012-02-12 13:45:33

+0

@ dan-brickley你是對的,還有[ShaderToy](http:// shadertoy .com/view/4djGRV)。 – wil 2014-01-29 09:02:25