SDF Line相关公式推导

线段是SDF形状的基元之一,可以被用来建模一些形状,比如昆虫的腿,植物的根茎等。

下面这篇文章介绍一下Line公式的推导,首先记住我们要求的变量,点到形状最近的距离

那么对于空间中的点\(P_1, P_2, P_3\),他们的分布有如下三种

其中\(P_1\)到线段的距离是\(|\vec{P_1Q}|\),\(P_2\)到线段的距离是\(|\vec{P_2A|}\),\(P_3\)到线段的距离是\(|\vec{P_3B}|。我们先看\) \(|\vec{P_1Q}|\)的求法,

其实本质是一个向量在另一个向量上的投影长度,此处借用云飞Ran的推导过程:

这里我们采用第二种方法,因此定义向量,\(\vec{BA},\vec{ BP_1}\),然后使用如下公式便可以求出\(\vec{BQ}\)的长度。

\[|\vec{BQ}| = {\vec{BP_1} \cdot \vec{BA}\over |\vec{BA}| }
\]

此时投影长度的比例可以定义为:

\[|\vec{BQ}| = {\vec{BP_1} \cdot \vec{BA}\over |\vec{BA}|^2 }
\]

熟悉这个求解投影长度的代码之后,在看一下另外两个点\(P_2, P_3\)我们会发现一个投影长度占BA的比例小于0,另一个大于1。

熟悉完上面的内容之后,我们就可以看一下SDF Line的实现了:

// Original SDF line segment function
float sdSegmentRegular( in vec2 p, in vec2 a, in vec2 b)
{
vec2 bp = b-p, ba = b-a; //求解向量
float h = clamp( dot(bp,ba)/dot(ba,ba), 0.0, 1.0 );
return length(bp - ba*h );
} void SDFLine(in vec2 p, in vec2 a, in vec2 b, in float r, out float sdf) {
sdf = sdSegmentRegular(p, a, b, r);
}
float h = clamp( dot(bp,ba)/dot(ba,ba), 0.0, 1.0 );

这段代码巧妙的地方在于通过这行代码统一了三种分布的点,当p在a,b点的左侧时,h = 1,此时求得是向量\(\vec{bp}-\vec{ba}\)也就是\(\vec{ap}\)的长度,这里大致如图:

但是这段代码运行起来是看不到任何东西的,我们还需要减去一个 width,才能得到LineSegment;

// Original SDF line segment function
float sdSegmentRegular( in vec2 p, in vec2 a, in vec2 b, in float r )
{
vec2 bp = b-p, ba = b-a;
float h = clamp( dot(bp,ba)/dot(ba,ba), 0.0, 1.0 );
return length( bp - ba*h ) - r;
} void SDFLine(in vec2 p, in vec2 a, in vec2 b, in float r, out float sdf) {
sdf = sdSegmentRegular(p, a, b, r);
}

具体的原理我们可以看一下这篇博客圆角矩形小节。此处就不再赘述啦。

refer

SDF Line相关公式推导的更多相关文章

  1. Cache Line 伪共享发现与优化

    https://yq.aliyun.com/articles/465504 Cache Line 伪共享发现与优化 作者:吴一昊,杨勇 1. 关于本文 本文基于 Joe Mario 的一篇博客 改编而 ...

  2. [C++]现行的试卷封面并获取学生题目得分信息以及学号信息的原型系统

    大二的时候写的一个CV小玩意,最终决定还是把它放出来,也许会帮助到很多人,代码写的很丑,大家多多包涵.附加实验报告主要部分. 课题背景及意义: 本项目主要目标是设计一套能自动分析我校现行的试卷封面并获 ...

  3. 一个前端程序猿的Sublime Text3的自我修养

    来源于:http://guowenfh.github.io/2015/12/26/SublimeText/ 详细设置 && 20+插件 本文章会在本人有插件或者设置更新时,进行不定时更 ...

  4. 干货之运用CALayer创建星级评分组件(五角星)

    本篇记录星级评分组件的创建过程以及CALayer的运用. 为了实现一个星级评分的组件,使用了CALayer,涉及到mask.CGPathRef.UIBezierPath.动画和一个计算多角星关键节点的 ...

  5. iOS----友盟分享完善版本

    分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...

  6. 为什么要选择Sublime Text3?

    为什么要选择Sublime Text3? Sublime Text3 自动保存,打开图片 跨平台启动快!!!!多行游标,太好用. 插件,简直选不过来. 代码片段 VIM兼容模式 菜单栏基础功能介绍 F ...

  7. opencv笔记5:频域和空域的一点理解

    time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...

  8. 有关线程安全的探讨--final、static、单例、线程安全

    我的代码中已经多次使用了线程,然后还非常喜欢使用据说是线程不安全的静态方法,然后又看到很多地方最容易提的问题就是这个东西线程不安全   于是我不免产生了以下几个亟待解决的问题: 什么样的代码是天生线程 ...

  9. 【洛谷】4917:天守阁的地板【欧拉函数的应用】【lcm与gcd】【同除根号优化】

    P4917 天守阁的地板 题目背景 在下克上异变中,博丽灵梦为了找到异变的源头,一路打到了天守阁 异变主谋鬼人正邪为了迎击,将天守阁反复颠倒过来,而年久失修的天守阁也因此掉下了很多块地板 异变结束后, ...

  10. 热门数据挖掘模型应用入门(一): LASSO回归

    热门数据挖掘模型应用入门(一): LASSO回归 2016-10-10 20:46 作者简介: 侯澄钧,毕业于俄亥俄州立大学运筹学博士项目, 目前在美国从事个人保险产品(Personal Line)相 ...

随机推荐

  1. 即时通讯技术文集(第14期):WebSocket精华文章合集 [共15篇]

    为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第14 期. [- 1 -] 新手快速入门:WebSocket简明教程 [链接] http://w ...

  2. 《CUDA编程:基础与实践》读书笔记(4):CUDA流

    1. CUDA流 一个CUDA流指的是由主机发出的在一个设备中执行的CUDA操作序列.除主机端发出的流之外,还有设备端发出的流,但本文不考虑后者.一个CUDA流中的各个操作按照主机发布的次序执行:但来 ...

  3. C#/.NET/.NET Core技术前沿周刊 | 第 21 期(2025年1.6-1.12)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  4. 【转载】Geojson常用工具,收藏备用

    收集了网上几个比较好用的网站,收藏备用 1.Geojson数据下载器:http://datav.aliyun.com/tools/atlas/#&lat=33.54139466898275&a ...

  5. 基于同态加密的PSI开源库-1

    下面介绍一个PSI的开源库,还原论文:CCS2017:Fast Private Set Intersection from Homomorphic Encryption和CCS2018:Labeled ...

  6. 对象流的序列化与反序列化:ObjectInputStream 和 ObjectOutputStream

    1.对象流: ObjectInputStream 和 ObjectOutputStream2.作用:ObjectOutputStream:内存中的对象--->存储中的文件.通过网络传输出去:序列 ...

  7. Iceberg治理服务Amoro---配置Prometheus + Grafana看板

    一.基础资料 1.mac安装Prometheus + Grafana https://www.cnblogs.com/robots2/p/18689540 2.配置文档 https://amoro.a ...

  8. mac安装spark

    一.基础信息 spark版本:spark-3.1.3-bin-hadoop3.2 hadoop版本:hadoop-3.2.1 scala版本:scala-2.11.12  建议3.12版本 下载地址: ...

  9. 【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库(文末附笔记及材料)

    一.总体方案 目前在使用 DeepSeek 在线环境时,页面经常显示"服务器繁忙,请稍后再试",以 DeepSeek R1 现在的火爆程度,这个状况可能还会持续一段时间,所以这里给 ...

  10. TypeScript 中的 type 和 interface:你真的了解它们的不同吗?

    如果你有写过 Vue3 的项目,那么对 TypeScript 肯定不会陌生.不管是公司新项目技术选型还是个人学习开发新的前端项目,Vue3 + TypeScript 已经成为首选技术方案之一 在 Ty ...