SDF矩形(附圆角)公式推导

news2024/9/21 2:40:38

SDF矩形(附圆角)公式推导

矩形

一般情况下,我们会使用(top_left, top_bottom), (width, height)来定义一个矩形,但是对于SDF而言,使用(centerX, centerY), (HalfSizeX, HalfSizeY)会更方便一些。

假设一个矩形,我们先定义原点在(0, 0),那图像如下:

image-20240710144719755

记住要计算的内容:点与形状最近边缘之间的距离

那么会出现两种情况,当要计算矩形内的点与矩形最近边缘的距离时,我们可以看下下图的表示:

image-20240710144859200

找到最近的边缘,然后做垂线就可以计算出SDF值,A,B,C点皆是如此。

但是对于形状外的点,情况就有些不同:

image-20240710145351508

对于AB点来说,情况是一致的,找到最近的边缘,然后就可以得到距离了。

但是我们发现,对于C,D点,矩形内点与矩形最近边缘的距离其实是到角点E的距离。所以当计算矩形SDF时候,要考虑这种特殊情况,在第一象限的时候,代码如下:

float sdf_rect(vec2 point, vec2 half_size) {
    
    point = abs(point);

    // 计算每个点到两个边的距离
    float x_dist = point.x - half_size.x;
    float y_dist = point.y - half_size.y;
  	// 如果一正一负,或者全是负数
  	// 则可以直接取max(x_dist, y_dist)作为对应点的SDF值
  
    // distance to corner
    float c_dist = length(point - half_size); // 求到corner的距离
    // 如果都为正数,说明是C、D点的情况,则要返回到corner的距离
    float res = x_dist > 0.0 && y_dist > 0.0 ?
           c_dist :
           max(x_dist, y_dist);
    return  res;
}

那对于其他象限呢,要知道,一个矩形是对称的,所以要求的其他象限的点的SDF值,可以都映射到第一象限去求:

img

最终的代码是这样的:

float sdf_rect(vec2 point, vec2 half_size) {
    
    point = abs(point);

    // 计算每个点到两个边的距离
    float x_dist = point.x - half_size.x;
    float y_dist = point.y - half_size.y;
  	// 如果一正一负,或者全是负数
  	// 则可以直接取max(x_dist, y_dist)作为对应点的SDF值
  
    // distance to corner
    float c_dist = length(point - half_size); // 求一下到corner的距离
    // 如果都为正数,说明是C、D点的情况,则要返回到corner的距离
    float res = x_dist > 0.0 && y_dist > 0.0 ?
           c_dist :
           max(x_dist, y_dist);
    return  res;
}
image-20240710153220534

进一步探讨

圆角矩形

现在的设备设计都开始讲究一个圆角矩形了,比如苹果的各种设备,我们也希望得到的矩形是一个圆角,该怎么做呢,读者可以在这里自行分析一下。

image-20240710153505390

答案很简单,就是将最终的SDF值减去一个r,对的,就是这么简单。

image-20240710153622294

我们知道,处在矩形边缘上的点的SDF值是0,如果把所有相同值的SDF化成一条线,则可以得到一个类似这样的等高线图。

image-20240710154226650

其实问题的关键(问题的关键就是关键的问题?🐶)在角点处,角点处SDF值连成的线会变成一个圆值,所以SDF值做减法的时候,形状会变成圆角,这里的r一般情况下可以根据矩形的边长进行线性的设置大小。

如果是做加法呢,矩形会变得比之前小,但是不是圆角。

镂空矩形

image-20240710155838830

image-20240710155718315

具体的解释和上面圆角矩形的设置是一样的,核心是找到+r 和 -r所在的那个等高线,然后分析一下值的变化。

相关代码: https://www.shadertoy.com/view/MXVXDc

refer

  • https://iquilezles.org/articles/distfunctions2d/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1916437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用【Python】【线性规划】优化工厂生产:实现智能资源配置与利润最大化的现代解决方案

目录 1. 问题背景和描述 1.1 问题背景 1.2 问题描述 2. 数学模型的建立 2.1决策变量 2.2 目标函数 2.3 约束条件 2.4 数学模型总结 3. 使用Python解决线性规划问题 3.1 导入必要的库 3.2 定义目标函数系数 3.3 定义不等式约束矩阵和向量 3.4 定义变量的边界 非负…

MAVLink代码生成-C#

一. 准备Windows下安装环境 Python 3.3 – 官网链接下载Python future模块 –pip3 install future TkInter (GUI 工具). – python for Windows自带,无需下载环境变量PYTHONPATH必须包含mavlink存储库的目录路径。 –set PYTHONPATH你的mavlink源码路径 源码下载在…

【Linux】Windows环境下配置虚拟机静态IP

当前我们虚拟机的Linux操作系统,其IP地址是通过DHCP服务获取的。 DHCP:动态获取IP地址,即每闪重启设备后都会获取一次,可能导致IP地址频繁变更 原因1:办公电脑IP地址变化无所谓,但是我们要远程连接到Linux系统&#x…

IDEA之Debug的使用

自定义功能图表 功能说明 光标回到Debug行 执行到光标所在行 Force Step into Trace Current Stream Chain Reset Frame 重置方法入栈

ESP32网络开发:1.创建一个基于TCP网络协议的网站

一、TCP协议的介绍 TCP(传输控制协议,Transmission Control Protocol)是互联网协议套件中的一种核心协议,主要用于在网络中的计算机之间可靠地传输数据。TCP协议位于OSI模型(开放系统互联模型)的传输层&…

系统架构设计师教程(清华第2版)<第2章 计算机系统基础知识>解读

系统架构设计师教程 第二章 计算机系统基础知识-2.1计算机系统概述 2.2 计算机硬件 2.1 计算机系统概述2.2 计算机硬件2.2.1 计算机硬件组成2.2.2 处理器2.2.2.1 控制单元(CU)2.2.2.2 算术逻辑单元(ALU)2.2.2.3 指令集2.2.2.3.1 CISC的特点2.2.2.3.2 RISC的特点2.2.3 存储器2.2…

大白话讲解AI大模型

大白话讲解大模型 大模型的发展重要大模型发展时间线 大模型的简单原理-训练⼤模型是如何训练并应⽤到场景中的?如果训练私有化模型 模型:model 语料库:用于训练模型的数据 大模型的发展 详细信息来源:DataLearner 2022年11月底…

【STM32学习】stm32cubemx基础配置,点亮/闪烁一个LED灯

1、cubemx开始 打开cubemx,在help栏中,点击,选择安装你所需要的stm32芯片版本, 打开后,选择你所配置的芯片型号,如我配置的是stm32f4系列,勾选,点击Install。 安装好后,…

防火墙配置安全策略以及用户认证综合实验

一、拓扑图: 二、实验需求: 1、DMz区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问; 2、生产区不允许访问互联网,办公区和游客区允许访问互联网 3、办公…

如何挑选适合的需求池管理系统?10款优质工具分享

本文将分享10款优质需求池管理工具:PingCode、Worktile、Teambition、Epicor Kinetic、TAPD、SAP IBP、Logility、RELEX Solutions、JIRA、明道云。 在管理项目和产品需求时,正确的工具能够大幅提高效率与透明度。如何从众多需求池工具中选择最适合团队的…

昇思25天学习打卡营第17天|基于MobileNetv2的垃圾分类

今天学习的内容是利用视觉图像技术,来实现垃圾分类代码开发的方法。通过读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。 本章节主要包括8部分内容: 1、实验目的 1、了解熟悉垃圾分类应用…

基于Python的哔哩哔哩数据分析系统设计实现过程,技术使用flask、MySQL、echarts,前端使用Layui

背景和意义 随着互联网和数字媒体行业的快速发展,视频网站作为重要的内容传播平台之一,用户量和内容丰富度呈现爆发式增长。本研究旨在设计并实现一种基于Python的哔哩哔哩数据分析系统,采用Flask框架、MySQL数据库以及echarts数据可视化技术…

前端--第一个前端程序

第一个前端程序 第一步: 使用记事本,编写代码 在你的一个磁盘里面创建一个文件夹,名为前端,然后在里面新建一个记事本,在里面写如下代码,注意一定要使用英文,然后把后缀名称改为.html。 第二…

MGRE环境下的OSPF实验

1、IP进行分配,并配置 配置各个路由器上的换回地址 配置接口地址 将缺省路由配出来 2、R1/4/5全连的MGRE以R1为中心 R1配置 进入隧道接口并配置ip 将协议配置为MGRE 并配置源接口IP 配置nhrp的id R3配置 R4配置

隔离计数器卡 脉冲编码器模块USB2392 采集48V电压 北京阿尔泰科技

1、简介: 2、主要系统框图: 2.3、规格参数: 3、板卡外形图:

Qt+MySQL实现社团管理系统

开发环境 ● Qt 5.14.1 ● Win10 ● Mysql 5.7.28 系统介绍 系统主要实现的功能如下图所示 社团管理系统主要包含了以下几个亮点功能 轮播图显示社团信息支持excel形式的导入导出学生信息权限控制(管理员、超级管理员、用户) 系统效果展示 登录界面…

Python-找客户软件

软件功能 请求代码: 填充表格: 可以search全国各个区县的所有企业信息,过滤手机号、查看是否续存/在业状态。方便找客户。 支持定-制-其他引-留-阮*件(XHSS,DYY,KS,Bi-li*Bi-li) V*…

Open3D 四元数法实现对应点集配准

目录 一、概述 1.1 基本思想 ​1.2详细步骤 二、代码实现 三、实现效果 3.1原始点云 3.2配准后点云 3.3变换矩阵 一、概述 在点云配准中,四元数法是一种精确计算旋转和平移变换的方法。其目标是找到一个刚体变换,使源点云和目标点云的对应点集之…

电厂数字孪生能源数据可视化运维平台开发炫酷且性价比更高

3D数据可视化大屏平台是我们为工厂车间提供的线上展示自定义工具,深度融合了web3D开发建模、AI和图形图像技术,完美还原车间产线布局,让复杂的生产流程和设备运行数据在大屏上直观呈现。 3D可视化数据大屏采用全景3D视角和虚拟现实技术&#…

Matlab中如何添加OptiluX?

1、打开Matlab,依次点击“新建”,“工程”,“从SVN”。 2、存储库路径输入: p/optilux/code - Revision 80: /trunk 同时在“源代码控制集成”菜单中选择“SVN (1.9)” 3、沙盒选择一个自己建的文件夹即可。 来源:Opt…