c# - 如何计算 3D 折线拉伸的顶点?
问题描述
我有一条由多个线段组成的折线。这条线非常复杂,并且在 3D 中到处都是曲线,所以为了简单起见,我们假设它看起来像这样
我想用 3D 渲染它。目前,我做了一个非常简单的过程,我只为每个段生成一个圆柱体:
这很不错,但在线路改变方向的地方看起来很糟糕。这也很浪费——每个方向变化都需要两倍于严格必要的顶点。我会更喜欢生成这样的形状的方法:
起初我并不认为它会太难,但我越努力,我就越发现它令人惊讶地不平凡。我在 C# 中工作,如果这是 2D 的,我只会使用Clipper,但我找不到任何库或资源来解决如何在 3D 中解决这个问题。如果解决方案并不总是完美的,或者有时会导致自相交或类似性质的事情,那也没关系。有人有什么指导吗?
解决方案
所以在数学意义上,两个圆柱的交点是一个椭圆。如果我给你椭圆上的半长轴点和半短轴的位置,你可以计算numsides
椭圆上的任何数量(如 )节点。
取连接位于点p的两条线段的节点,并如下定义椭圆的两个向量。a是半长轴,b是半短轴
每个连接线段具有单位方向向量e_1和e_2,圆柱体的半径为R。
然后从向量a和b定义相交椭圆:
然后在椭圆周围找到一个点c使用以下参数化t = 0..1
这是一些C#
计算numsides
椭圆周围点的代码
// Vectors p, a, b defined
for(int i=0; i<numsides; i++)
{
double t = (1.0*i)/numsides
Vector c = p + a*Math.Cos(2*Math.PI*t) + b*Math.Sin(2*Math.PI*t)
// use/store c as needed for the mesh generation
}
推荐阅读
- java - UnsatisfiedLinkError:java.library.path 中没有 sqljdbc_auth
- laravel - 如何在脚本中设置 if else 语句
- html - 如何使 3d 立方体原地旋转
- javascript - 在服务工作者文件中使用 ESM(导入/导出)
- sql-server - MS SQL - 将表分离到另一个文件或文件组
- shell - 有什么作用。./build.man 在这段代码中是什么意思?
- asp.net-core - 在实体框架中使用 where 子句
- python - 如何在 python 3 中创建和启动任意数量的线程
- ios - UNUserNotificationCenter didReceive / willPresent未触发ios 11
- mysql - 从 mySql 查询中排除负面结果