赞
踩
符号距离函数(sign distancefunction),简称SDF,又可以称为定向距离函数(oriented distance function),在空间中的一个有限区域上确定一个点到区域边界的距离并同时对距离的符号进行定义:点在区域边界内部为正,外部为负,位于边界上时为0。
您可以在 2D基本图形的Sign Distance Function (SDF)详解(上)这篇文章里找到前1~9个基础2D几何图形的SDF~
代码:
/** * 正五边形 1. 原点在中心点, 中心点到某一个顶点的向量沿y轴负半轴 * 2. r表示中心点到边的距离(不是到顶点的距离) */ float sdPentagon( in vec2 p, in float r ) { // pi/5: cos, sin, tan, !!!注意,k仅作为一个数据的集合! const vec3 k = vec3(0.809016994,0.587785252,0.726542528); p.x = abs(p.x); // 左右对称 // 1. 先映射:同样是分为三部分,上部+右上+右下,都要映射到上部 // 将op在(-k.x, k.y)上投影,得到一个系数,若系数是正数说明p点在上部不用处理,被min(0.0, )滤去 // 若为负数说明在目标范围内,p加上1倍的系数*单位垂直向量就可以到达对称轴处 // 再加一倍就到达对称点处,因此下面要乘2,-=其实和上面说到的垂直向量的方向有关 p -= 2.0*min(dot(vec2(-k.x,k.y),p),0.0)*vec2(-k.x,k.y); // 原先在右下部的区域,还得再映射一次,这里的min再滤去上部的部分 p -= 2.0*min(dot(vec2( k.x,k.y),p),0.0)*vec2( k.x,k.y); // 2. 计算方便计算距离的区域 // 这里就是简单的考虑上部就好,因为右上映射上去后取值范围是(-,+),因此正负都要考虑, // r*k.z是得到半边长,得到的最后的p是处于上部的点做一条垂线到五边形的上部水平边 p -= vec2(clamp(p.x,-r*k.z,r*k.z),r); return length(p)*sign(p.y); }
直接上图,这里真的忍不住安利一下 geogebra 这个几何绘图网站,超好用声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/117098
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。