openGL之API学习(一三八)判断到直线、线段的距离

 

 

//---------------------------------------------------------
// draw endless line through point A and B with radius r
//---------------------------------------------------------
float line(vec2 P, vec2 A, vec2 B, float r)
{
  vec2 g = B - A;
  float d = abs(dot(normalize(vec2(g.y, -g.x)), P - A));
  return smoothstep(r, 0.5*r, d);
}

//---------------------------------------------------------
// draw segment line from point A to point B and radius r
// see also sdCapsule(p,a,b,r) from inigo quilez
// http://iquilezles.org/www/articles/distfunctions/distfunctions.htm
//---------------------------------------------------------
float segment(vec2 P, vec2 A, vec2 B, float r)
{
  vec2 g = B - A;
  vec2 h = P - A;
  float d = length(h - g * clamp(dot(g, h) / dot(g,g), 0.0, 1.0));
  return smoothstep(r, 0.5*r, d);
}
//---------------------------------------------------------
float segment2(vec2 P, vec2 A, vec2 B, float r)
{
  float d = length((P-=A)-(B-=A)*clamp(dot(P,B)/dot(B,B), 0.0, 1.0 ));
  return smoothstep(r, 0.5*r, d);;   
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值