双三次 Bezier 曲面

双三次 Bezier 曲面的定义

Bezier 曲面是由 Bezier 曲线扩展得到,它是两组正交的 Bezier 曲线控制点构造空间网格生成的曲面

p ( u , v ) = ∑ i = 0 3 ∑ j = 0 3 P i , j B i , 3 ( u ) B j , 3 ( v ) , ( u , v ) ∈ [ 0 , 1 ] × [ 0 , 1 ] \begin{equation} \bm{p}(u, v) = \sum_{i=0}^{3}\sum_{j=0}^{3} P_{i,j}B_{i, 3}(u)B_{j,3}(v), (u, v) \in [0, 1] \times [0, 1] \end{equation} p(u,v)=i=03j=03Pi,jBi,3(u)Bj,3(v),(u,v)[0,1]×[0,1]

其中, P i j P_{ij} Pij 是 16 个控制点, B i , 3 ( u ) B_{i, 3}(u) Bi,3(u) B j , 3 ( v ) B_{j, 3}(v) Bj,3(v) 是 Bernstein 基函数。

在这里插入图片描述

对 (1) 式展开,有
p ( u , v ) = [ B 0 , 3 ( u ) B 1 , 3 ( u ) B 2 , 3 ( u ) B 3 , 3 ( u ) ] [ P 0 , 0 P 0 , 1 P 0 , 2 P 0 , 3 P 1 , 0 P 1 , 1 P 1 , 2 P 1 , 3 P 2 , 0 P 2 , 1 P 2 , 2 P 2 , 3 P 3 , 0 P 3 , 1 P 3 , 2 P 3 , 3 ] [ B 0 , 3 ( v ) B 1 , 3 ( v ) B 2 , 3 ( v ) B 3 , 3 ( v ) ] \begin{equation} \bm{p}(u, v) = \begin{bmatrix} B_{0, 3}(u) & B_{1, 3}(u) & B_{2, 3}(u) & B_{3, 3}(u) \end{bmatrix} \begin{bmatrix} P_{0, 0} & P_{0, 1} & P_{0, 2} & P_{0, 3} \\ P_{1, 0} & P_{1, 1} & P_{1, 2} & P_{1, 3} \\ P_{2, 0} & P_{2, 1} & P_{2, 2} & P_{2, 3} \\ P_{3, 0} & P_{3, 1} & P_{3, 2} & P_{3, 3} \\ \end{bmatrix} \begin{bmatrix} B_{0, 3}(v) \\ B_{1, 3}(v) \\ B_{2, 3}(v) \\ B_{3, 3}(v) \end{bmatrix} \end{equation} p(u,v)=[B0,3(u)B1,3(u)B2,3(u)B3,3(u)] P0,0P1,0P2,0P3,0P0,1P1,1P2,1P3,1P0,2P1,2P2,2P3,2P0,3P1,3P2,3P3,3 B0,3(v)B1,3(v)B2,3(v)B3,3(v)

B 0 , 3 ( u ) , B 1 , 3 ( u ) , B 2 , 3 ( u ) , B 3 , 3 ( u ) , B 0 , 3 ( v ) , B 1 , 3 ( v ) , B 2 , 3 ( v ) , B 3 , 3 ( v ) B_{0, 3}(u),B_{1, 3}(u),B_{2, 3}(u),B_{3, 3}(u), B_{0, 3}(v), B_{1, 3}(v), B_{2, 3}(v), B_{3, 3}(v) B0,3(u)B1,3(u)B2,3(u)B3,3(u)B0,3(v)B1,3(v)B2,3(v)B3,3(v)是三次 Bernstein 基函数,

{ B 0 , 3 ( u ) = − u 3 + 3 u 2 − 3 u + 1 B 1 , 3 ( u ) = 3 u 2 − 6 u 2 + 3 u B 2 , 3 ( u ) = − 3 u 3 + 3 u 2 B 3 , 3 ( u ) = u 3 \begin{equation} \begin{cases} B_{0, 3}(u) = -u^3 + 3u^2 -3u +1 \\ B_{1, 3}(u) = 3u^2 -6u^2+3u \\ B_{2, 3}(u) = -3u^3 + 3u^2 \\ B_{3, 3}(u) = u^3 \end{cases} \end{equation} B0,3(u)=u3+3u23u+1B1,3(u)=3u26u2+3uB2,3(u)=3u3+3u2B3,3(u)=u3
{ B 0 , 3 ( v ) = − v 3 + 3 v 2 − 3 v + 1 B 1 , 3 ( v ) = 3 v 2 − 6 v 2 + 3 v B 2 , 3 ( v ) = − 3 v 3 + 3 v 2 B 3 , 3 ( v ) = v 3 \begin{equation} \begin{cases} B_{0, 3}(v) = -v^3 + 3v^2 -3v +1 \\ B_{1, 3}(v) = 3v^2 -6v^2+3v \\ B_{2, 3}(v) = -3v^3 + 3v^2 \\ B_{3, 3}(v) = v^3 \end{cases} \end{equation} B0,3(v)=v3+3v23v+1B1,3(v)=3v26v2+3vB2,3(v)=3v3+3v2B3,3(v)=v3

p ( u , v ) = [ u 3 u 2 u 1 ] [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] [ P 0 , 0 P 0 , 1 P 0 , 2 P 0 , 3 P 1 , 0 P 1 , 1 P 1 , 2 P 1 , 3 P 2 , 0 P 2 , 1 P 2 , 2 P 2 , 3 P 3 , 0 P 3 , 1 P 3 , 2 P 3 , 3 ] [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] [ v 3 v 2 v 1 ] \begin{equation} p(u, v) = \begin{bmatrix} u^3 & u^2 & u & 1 \end{bmatrix} \begin{bmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} \begin{bmatrix} P_{0, 0} & P_{0, 1} & P_{0, 2} & P_{0, 3} \\ P_{1, 0} & P_{1, 1} & P_{1, 2} & P_{1, 3} \\ P_{2, 0} & P_{2, 1} & P_{2, 2} & P_{2, 3} \\ P_{3, 0} & P_{3, 1} & P_{3, 2} & P_{3, 3} \\ \end{bmatrix} \begin{bmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} \begin{bmatrix} v^3 \\ v^2 \\ v \\ 1 \end{bmatrix} \end{equation} p(u,v)=[u3u2u1] 1331363033001000 P0,0P1,0P2,0P3,0P0,1P1,1P2,1P3,1P0,2P1,2P2,2P3,2P0,3P1,3P2,3P3,3 1331363033001000 v3v2v1

U = [ u 3 u 2 u 1 ] , V = [ v 3 v 2 v 1 ] \bm{U} = \begin{bmatrix} u^3 & u^2 & u & 1 \end{bmatrix} , \bm{V} = \begin{bmatrix} v^3 & v^2 & v & 1 \end{bmatrix} U=[u3u2u1],V=[v3v2v1]

M = [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] , P = [ P 0 , 0 P 0 , 1 P 0 , 2 P 0 , 3 P 1 , 0 P 1 , 1 P 1 , 2 P 1 , 3 P 2 , 0 P 2 , 1 P 2 , 2 P 2 , 3 P 3 , 0 P 3 , 1 P 3 , 2 P 3 , 3 ] \bm{M} = \begin{bmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} , \bm{P} = \begin{bmatrix} P_{0, 0} & P_{0, 1} & P_{0, 2} & P_{0, 3} \\ P_{1, 0} & P_{1, 1} & P_{1, 2} & P_{1, 3} \\ P_{2, 0} & P_{2, 1} & P_{2, 2} & P_{2, 3} \\ P_{3, 0} & P_{3, 1} & P_{3, 2} & P_{3, 3} \\ \end{bmatrix} M= 1331363033001000 ,P= P0,0P1,0P2,0P3,0P0,1P1,1P2,1P3,1P0,2P1,2P2,2P3,2P0,3P1,3P2,3P3,3

p ( u , v ) = U M P M T V T \begin{equation} \bm{p}(u, v) = \bm{U}\bm{M}\bm{P}\bm{M}^{T}\bm{V}^{T} \end{equation} p(u,v)=UMPMTVT

M \bm{M} M 是对称矩阵,即 M T = M M^T = M MT=M.

生成曲面时,可以先固定 u 变化 v 得到一簇 Bezier 曲线,然后固定 v,变化 u 得到另一簇 Bezier 曲线,两卒曲线交织生成双三次 Bezier 曲面。

这里的程序算法的示意说明

// 读取控制点void ReadControlPoint(Point3 P[4][4]) {double M[4][4];M[0][0] = -1;M[0][1] =  3;M[0][2] = -3;M[0][3] = 1;M[1][0] =  3;M[1][1] = -6;M[1][2] =  3;M[1][3] = 0;M[2][0] = -3;M[2][1] =  3;M[2][2] =  0;M[2][3] = 0;M[3][0] =  1;M[3][1] =  0;M[3][2] =  0;M[3][3] = 0;Point3 mControlPoint[4][4];for (int i=0; i<4; i++) {for (int j=0; j<4; j++) {mControlPoint[i][j] = P[i][j]	}}// 数字矩阵左乘 三维点矩阵 M * mControlPoint// 计算转置矩阵 M^T// 数字矩阵右乘 三维点矩阵 mControlPoint * Mdouble setp = 0.1;double u3, u2, u1, u0, v3, v2, v1, v0;// 定义 Point Pt;for (double u=0; u<=1; u+=step) {for (double v=0; v<=1; v+=step) {u3 = u*u*u; v3 = v*v*v;u2 = u*u; v2 = v*v;u1 = u;	v1 = v;u0 = 1; v0 = 1;Pt = ....// 根据公式计算出 pt// 斜二投影//if (v == 0) 特殊处理// 绘制点}}for (double v=0; v<=1; v+=step) {for (double u=0; u<=1; u+=step) {u3 = u*u*u; v3 = v*v*v;u2 = u*u; v2 = v*v;u1 = u;	v1 = v;u0 = 1; v0 = 1;Pt = ....// 根据公式计算出 pt// 斜二投影//if (u == 0) 特殊处理// 绘制点}}}
// 计算斜二投影Point2 ObliqueProjection(Point3 P3) {Ponit2 P2;P2.x = P3.x - P3.z * sqrt(2.0) / 2.0;P2.y = P3.y - P3.z * sqrt(2.0) / 2.0;return P2;
}

参考 《计算几何算法与实现》孔令德

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

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

相关文章

法线贴图实现衣服上皱褶特效

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 法线贴图在3D建模中扮演着重要的角色&#xff0c;它通过模拟表面的微…

c++内存池项目

文章目录 一、内存池介绍二、ThreadCache实现三、CentralCache实现四、PageCache实现五、回收内存六、大于256KB的内存申请与释放七、将new和delete换为定长内存池八、多线程环境下对比malloc进行基准测试九、使用基数树进行性能优化 一、内存池介绍 二、ThreadCache实现 下面…

springboot集成springdoc-openapi(模拟前端请求)

目录 描述---痛点 Springfox对比springdoc-openapi 1. 成熟度和维护性&#xff1a; 2. 依赖和配置&#xff1a; 3. 注解和使用方式&#xff1a; 4. 特性和扩展性&#xff1a; 应用目录结构 pom文件 新增测试controller StaffController YUserController 启动测试看下…

PHP HTTPoxy CGI 应用程序漏洞 CVE-2016-5385

HTTPoxy CGI 应用程序漏洞 CVE-2016-5385 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle Communications BRM 10.x/12.x&#xff08;云软件&#xff09;中发现漏洞。它已经被宣布为关键。此漏洞影响组件用户数据库的未…

Linux笔记---用户和权限管理基本命令介绍

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 ​编辑 前言&#xff1a; 命令&#xff1a; whoami&#xff1a; passwd&#xff1a; useradd&#xff1a; userdel&#xff1a; chm…

华为交换配置OSPF与BFD联动

实验拓扑 组网需求 如图所示&#xff0c;SW1、SW2和SW3之间运行OSPF&#xff0c;SW1和SW2之间的交换机仅作透传功能。现在需要SW1和SW2能够快速感应它们之间的链路状态&#xff0c;当链路SW1-SW2发生故障时&#xff0c;业务能快速切换到备份链路SW1-SW3-SW2上 配置思路 采用…

文件的基本管理

目录 一、Linux系统目录结构和相对/绝对路径 &#xff08;一&#xff09;系统目录结构 &#xff08;二&#xff09;相对路径和绝对路径 1.绝对路径 2.相对路径 &#xff08;三&#xff09;通配符的作用 二、创建、复制、删除文件&#xff0c;rm -rf /意外事故 &#xf…

说说对React Hooks的理解?解决了什么问题?

面试官&#xff1a;说说对React Hooks的理解&#xff1f;解决了什么问题&#xff1f; 一、是什么 Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 至于为什么引入hook&#xff0c;官方给出的动机是解决长时间使用和维护…

山景DU561—32位高性能音频处理器(DSP)芯片

音频处理可以更好地捕捉和处理声音和音乐&#xff1b;而DSP音频处理芯片是一种利用数字信号处理技术进行音频处理的专用芯片&#xff1b;可用于多种应用&#xff0c;从音乐拾音到复杂的音频信号处理&#xff0c;和声音增强。 由工采网代理的山景DU561是一款集成多种音效算法高…

08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)

08、基于LunarLander登陆器的DDQN强化学习&#xff08;含PYTHON工程&#xff09; LunarLander复现&#xff1a; 07、基于LunarLander登陆器的DQN强化学习案例&#xff08;含PYTHON工程&#xff09; 08、基于LunarLander登陆器的DDQN强化学习&#xff08;含PYTHON工程&#xf…

DTC营销新模式,创新商业引领裂变营销新潮流的玩法!

DTC营销新模式&#xff0c;创新商业引领裂变营销新潮流的玩法&#xff01; 随着市场竞争的加剧&#xff0c;企业寻求创新的营销模式以突破困境&#xff0c;脱颖而出。其中&#xff0c;DTC&#xff08;Direct-to-Consumer&#xff0c;直接面向消费者&#xff09;营销新模式应运…

CentOS 7 制作openssh 9.6 rpm包更新修复安全漏洞 —— 筑梦之路

2023年12月18日 openssh 发布新版9.6p1&#xff0c;详细内容阅读OpenSSH: Release Notes 背景说明 之前也写过多篇制作openssh rpm包的文章&#xff0c;为何要重新来写一篇制作openssh 9.6版本的&#xff1f; openssh 9.6 rpm包制作和之前存在区别&#xff0c;对于CentOS 7来…

spring之面向切面:AOP(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

【Python】函数

一、函数介绍 二、函数的定义 三、函数的参数 四、函数的返回值 五、函数说明文档 六、函数的嵌套调用 七、变量的作用域 一、函数介绍 函数的使用 函数的作用 函数 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段。 input()、p…

文件批量管理,按单值大小归类保存,提升工作效率与便捷性!

你是否曾经遇到过需要批量管理大量文件&#xff0c;但却因为文件大小不一而感到混乱&#xff1f;你是否希望有一种方法能够将这些文件按照单值大小进行归类保存&#xff0c;以便更方便地管理和查找&#xff1f;现在&#xff0c;我们有一个好消息要告诉你&#xff0c;我们推出了…

Nvm切换nodejs版本

下载地址 Releases coreybutler/nvm-windows GitHub 安装运行 双击安装运行即可 下载速度慢的&#xff0c;可以通过修改配置文件切换国内下载镜像 node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: CNPM Binaries Mirror 打开安装目录&#xff0c;修改se…

easyExcel生成excel并导出自定义样式------添加复杂表头

easyExcel生成excel并导出自定义样式------添加复杂表头 设置合并竖行单元格&#xff0c;表头设置 OutputStream outputStream ExcelUtils.getResponseOutputStream(response, fileName);//根据数据组装需要合并的单元格Map<String, List<String>> strategyMap …

gem5 garnet l1 l2 cache的创建与相连

gem5 garnet l1 l2 cache的创建与相连 主要就是这个图&#xff1a; 细节 我们用的是gem5/configs/deprecated/example/fs.py #fs.py 引入了上两层路径&#xff0c;也就是当前可以看到 gem5/configs/路径。 addToPath("../../")#fs.py引入了gem5/configs/ruby/Ru…

MaBatis使用`ResultMap`标签手动映射详解使用

文章目录 MaBatis使用ResultMap标签手动映射详解使用1、MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系&#xff0c;二者不同时无法自动ORM&#xff0c;如下&#xff1a;2、在SQL中使用 as 为查询字段添加列别名&#xff0c;以匹配属性名&#xff1a;但是如果我…

程序员为什么不接单赚钱?绝对是损失!!!

天气渐寒&#xff0c;2024年步步紧逼。 回望旧的2023年&#xff0c;生活有日益向好吗&#xff1f;身体是否还匹配年龄呢&#xff1f; 再问一个致命的问题&#xff1a;2023年攒的钱够多了吗&#xff1f; 如果差强人意&#xff0c;建议来年再改进。若是一言难尽&#xff0c;同样…