首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AutoCAD如何计算只由拟合点定义的样条的端点切线?

AutoCAD允许将样条实体存储在仅由拟合点定义的DXF文件中,问题是样条定义具有无限的数值正确解,Autodesk不提供从给定的拟合点计算所需参数所需的信息。

tl;dr -缺失的信息是估计的开始和结束切线的方向和大小输入切线的全局B样条插值的末端导数,谁能帮助计算这个值吗?

完整的github源代码。

我使用BricsCAD进行测试,但是"Trueview 2020“显示了相同的结果。

1.设想情况

只给出拟合点,使用不受任何约束的全局曲线插值,得到由控制顶点定义的样条:

代码语言:javascript
运行
AI代码解释
复制
# First spline defined by control vertices interpolated from given fit points
s = global_bspline_interpolation(points, degree=3)
msp.add_spline(dxfattribs={'color': 4, 'layer': 'Global Interpolation'}).apply_construction_tool(s)
# Second spline defined only by fit points as reference
spline = msp.add_spline(points, degree=3, dxfattribs={'layer': 'BricsCAD B-spline', 'color': 2})
doc.saveas(DIR / 'fit-points-only.dxf')

由BricsCAD从拟合点插值的样条与插值控制顶点定义的样条不匹配:

2.设想情况

除了fit点,我还在DXF文件中存储开始和结束切线值。插值由带端导数的全局曲线插值完成(Piegl & Tiller:“NURBS图书”-第9.2.2章)。

我选择了一个任意的角度(100度)作为开始和结束切线,切线大小是由“总弦长”方法估计的。

代码语言:javascript
运行
AI代码解释
复制
m1, m2 = estimate_end_tangent_magnitude(points, method='chord')
start_tangent = Vector.from_deg_angle(100) * m1
end_tangent = Vector.from_deg_angle(-100) * m2
# First spline defined by control vertices interpolated from given fit points and end-tangents
s = global_bspline_interpolation(points, degree=3, tangents=(start_tangent, end_tangent))
msp.add_spline(dxfattribs={'color': 4, 'layer': 'Global Interpolation'}).apply_construction_tool(s)
# Result matches the BricsCAD interpolation if fit points, start- and end
# tangents are stored explicit in the DXF file.
# Second spline defined by fit points as reference
spline = msp.add_spline(points, degree=3, dxfattribs={'layer': 'BricsCAD B-spline', 'color': 2})
# set explicit start- and end tangent as unit vectors
spline.dxf.start_tangent = Vector.from_deg_angle(100)
spline.dxf.end_tangent = Vector.from_deg_angle(-100)
doc.saveas(DIR / 'fit-points-and-tangents.dxf')

由BricsCAD插值的样条现在与插值控制顶点定义的样条完全匹配:

现在我知道插值方法是正确的,我只需要从拟合点绘制同样的样条,就像BricsCAD一样,就是从拟合点推断出的方向和大小的结束切线。

3.设想情况

我需要控制顶点来呈现B样条,但是开始切线和结束切线不像场景1中那样存储在DXF文件中。需要估计开始和结束切线,最好的方法是:“NURBS Book”、Piegl & Tiller中的"5点插值“。

代码语言:javascript
运行
AI代码解释
复制
tangents = estimate_tangents(points, method='5-points')
# Estimated tangent angles: (108.43494882292201, -108.43494882292201) degree
m1, m2 = estimate_end_tangent_magnitude(points, method='chord')
start_tangent = tangents[0].normalize(m1)
end_tangent = tangents[-1].normalize(m2)
# First spline defined by control vertices interpolated from given fit points and end-tangents
s = global_bspline_interpolation(points, degree=3, tangents=(start_tangent, end_tangent))
msp.add_spline(dxfattribs={'color': 4, 'layer': 'Global Interpolation'}).apply_construction_tool(s)
# Second spline defined by fit points as reference, but without explicit start- and end 
# tangents to see if my estimations are correct.
msp.add_spline(points, degree=3, dxfattribs={'layer': 'BricsCAD B-spline', 'color': 2})
doc.saveas(DIR / 'tangents-estimated.dxf')

令人惊讶的是,估计是不正确的,BricsCAD样条的切线角为101.0035408517495和-101.0035408517495度。

最烦人的是,如果我用BricsCAD角度作为输入,样条仍然不匹配,所以我假设切线幅度估计与场景2不同。

4.理论检验

从BricsCAD和样条“方法”保存的DXF文件中计算出以下值,该方法从“适合点”切换到“控制顶点”。根据这些数据,我计算了切线角和震级,tangent vector = 2nd control vertex - 1st control vertex

代码语言:javascript
运行
AI代码解释
复制
required_angle = 101.0035408517495  # angle of tangent vector in degrees
required_magnitude = m1 * 1.3097943444804256  # magnitude of tangent vector
start_tangent = Vector.from_deg_angle(required_angle, required_magnitude)
end_tangent = Vector.from_deg_angle(-required_angle, required_magnitude)
s = global_bspline_interpolation(points, degree=3, tangents=(start_tangent, end_tangent))
msp.add_spline(dxfattribs={'color': 4, 'layer': 'Global Interpolation'}).apply_construction_tool(s)
msp.add_spline(points, degree=3, dxfattribs={'layer': 'BricsCAD B-spline', 'color': 2})
doc.saveas(DIR / 'theory-check.dxf')

现在,样条又匹配了:

  1. 如果给定切线(存储在DXF中),则插值函数的输入切线的大小为“总弦长”。
  2. 在这个例子中,如果没有给定的切线,震级是不同的:m1*1.3097943444804256,但是它不是一个常数因子。

最大的问题是:如何估计仅由拟合点定义的样条在方向和幅度上的开始和结束切线(如AutoCAD或BricsCAD )?

提前谢谢你,

曼弗雷德

EN

回答 2

Stack Overflow用户

发布于 2021-02-24 20:50:43

第三种情况似乎已经解决:样条实体从拟合点没有给定的端点切线。

应用三次Bézier曲线插值似乎是解决方案:

BricsCAD/AutoCAD与ezdxf样条之间没有视觉差异。

这里上描述了三次Bèzier曲线到三次样条的转换,并在ezdxf v0.16中实现了这里,三次Bézier曲线插值的源代码是这里

这只适用于三次B样条(最常用的B样条),而BricsCAD/AutoCAD只允许对只由拟合点定义的样条实体的度为2或3。唯一缺少的是二次B样条曲线作为二次Bézier曲线的插值.

进一步的研究表明,用拟合点定义的二次B样条作为三次B样条加载到BricsCAD/AutoCAD中。除上述声明外:

对于仅由拟合点定义的样条实体,BricsCAD和AutoCAD只使用3度。

B样条给定端切的解是一种三次Bèzier插值,不需要进行端切计算。

更新:不是解决方案

可悲的是,所有这些都只适用于小的简单B样条:

  • 黄色: BricsCAD样条
  • cyan: Bèzier曲线插值
  • 洋红:全局曲线插值

全局曲线插值是比Bèzier曲线插值更好的解决方案。它在B样条开始时发散,其中Bèzier曲线插值完全失败。

AutoCAD端点切线的搜索仍在继续.

票数 1
EN

Stack Overflow用户

发布于 2020-09-01 23:48:51

样条实体可以有可选的群代码12,22,32表示起始切线x,y,z,13,23,33表示端点切线x,y,z。我检查了netDxf项目的源代码,如果只使用拟合点来定义样条,那么开始和结束切值将被指定为

来自AutoCAD 2012样条实体的DXF参考:

12开始切线-可以省略(在WCS中) DXF: x值;APP: 3D点 22,32 DXF: y和z的起始切线值可以省略(在WCS中) 13端切线-可省略( WCS) DXF: x值;APP: 3D点 23,33 DXF: y和z值可省略(在WCS中)

昨天,我们和我的同事在Autocad 2020中创建了一些DXF文件,包括适合点的样条。输出到DXF后,样条由控制点和节点定义。因此,我猜测,适合点是一些过时的东西或用户界面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62472305

复制
相关文章
【图形学】贝塞尔与B样条曲线曲面笔记
这篇文章是看中国农大的图形学公开课的笔记, 简单介绍了贝塞尔Bezier曲线曲面和B样条B-Spline曲线曲面, 希望能够带来一个大概视角和总览. 本文同步存于我的Github仓库, 字数长度3.2k(https://github.com/ZFhuang/Study-Notes/tree/main/Content/%E4%B8%93%E9%A1%B9%E7%AC%94%E8%AE%B0/%E6%A0%B7%E6%9D%A1%E6%9B%B2%E7%BA%BF%E6%9B%B2%E9%9D%A2).
ZifengHuang
2021/03/07
5.3K0
CAD常用基本操作
CAD常用基本操作 1 常用工具栏的打开和关闭:工具栏上方点击右键进行选择 2 动态坐标的打开与关闭:在左下角坐标显示栏进行点击 3 对象捕捉内容的选择:A在对象捕捉按钮上右键点击(对象捕捉开关:F3) B 在极轴选择上可以更改极轴角度和极轴模式(绝对还是相对上一段线) 4 工具栏位置的变化:A锁定:右下角小锁;工具栏右键 B 锁定情况下的移动:Ctrl +鼠标移动 5 清楚屏幕(工具栏消失):Ctrl + 0 6 隐藏命令行:Ctrl + 9 7 模型空间和布局空间的定义:模型空间:无限大三维空间 布局空间:图纸空间,尺寸可定义的二位空间 8 鼠标左键的选择操作:A 从左上向右下:窗围 B 从右下向左上:窗交 9 鼠标中键的使用:A双击,范围缩放,在绘图区域最大化显示图形 B 按住中键不放可以移动图形 10 鼠标右键的使用:A常用命令的调用 B 绘图中Ctrl + 右键调出捕捉快捷菜单和其它快速命令 11 命令的查看:A 常规查看:鼠标移于工具栏相应按钮上查看状态栏显示 B 命令别名(缩写)的查看:工具→自定义→编辑程序参数(acad.pgp) 12 绘图中确定命令的调用:A 鼠标右键 B ESC键(强制退出命令) C Enter键 D 空格键(输入名称时,空格不为确定) 13 重复调用上一个命令: A Enter键 B 空格键 C 方向键选择 14 图形输出命令:A wmfout(矢量图) B jpgout/bmpout(位图)应先选择输出范围 15 夹点的使用:A蓝色:冷夹点 B 绿色:预备编辑夹点 C红色:可编辑夹点 D 可通过右键选择夹点的编辑类型 E 选中一个夹点之后可以通过空格键依次改变夹点编辑的命令如延伸,移动或比例缩放(应注意夹点中的比例缩放是多重缩放,同一图形可在选中夹点连续进行多次不同比例缩放) 16 三维绘图中的旋转:按住Shift并按住鼠标中键拖动 17 . dxf文件:表示在储存之后可以在其它三维软件中打开的文件 18 . dwt文件:图形样板文件,用于自定义样板 19 . dws文件:图形标准文件,用于保存一定的绘图标准 20 对文件进行绘图标准检查并进行修复:打开CAD标准工具栏(工具栏右键)→配置(用于添加自定义的绘图标准;检查(用于根据添加的标准修复新图纸的标准))有缘学习更多+谓ygd3076考证资料或关注桃报:奉献教育(店铺) 21 绘图中的平行四边形法则(利用绘制四边形绘制某些图形) A两条直线卡一条直线,绘制一个边直线后,通过平移获取另一边直线 B 在圆中绘制相应长度的弦,现在圆心处绘制相同长度的直线,再通过平移获得 22 自定义工具栏命令 CUI或输入Toolbar 其中命令特性宏中的^C^表示取消正在执行的操作 22 循环选择操作方法:Shift+空格 用于图形具有共同边界的情况下的选择 23 系统变量 Taskbar的作用:0表示在工具栏上只显示一个CAD窗口,1表示平铺显示所有CAD窗口
用户7505898
2020/09/25
5.8K0
CAD常用基本操作
【笔记】《计算机图形学》(15)——曲线
这一章介绍了曲线的表示, 用到了比较多的数学. 前半部分主要是介绍了曲线的性质和表示方式, 并介绍了多项式插值曲线, 后半部分主要介绍了包括贝塞尔曲线和B样条曲线在内的拟合曲线. 样条曲线的内容在样条曲线曲面有过一些简单的介绍, 这一章没有介绍曲面部分, 但是在曲线部分则进行了更加详细的介绍, 我也对这部分有了更好的理解.
ZifengHuang
2021/06/29
3K0
UE4流动的箭头曲线实现原理
当我们需要表达一个路径的时候,使用路径箭头的方式可以进行一个很好的表达。我们制作一个静态的路径箭头是很容易的,但是我们怎么能做一个流动的箭头路径呢?这里面需要解决的问题:怎么制作出可以动态调整路径的曲线?怎么解决路径上的箭头会受到拉伸、平面中断影响导致箭头不连续的问题?
Jean
2021/10/27
3.7K0
UE4流动的箭头曲线实现原理
基于R统计软件的三次样条和平滑样条模型数据拟合及预测
三次样条 具有连续的一阶和二阶导数。 我们通过应用基础函数来变换变量  并使用这些变换后的变量拟合模型, 向模型添加非线性, 使样条曲线能够拟合更平滑 。
拓端
2020/08/22
2.3K0
怎样在等值面上用 Wolfram 语言的神经网络拟合B样条曲线
读到这篇小文的朋友:新年好!今天我们将在本文中简单探索一个结合Wolfram语言的神经网络与B样条功能的有趣问题。
WolframChina
2021/03/15
1.8K0
怎样在等值面上用 Wolfram 语言的神经网络拟合B样条曲线
自学cad 零基础_零基础自学吉他的步骤
学习CAD制图其实不难,主要还是看个人,下面是学习啦小编带来关于cad的零基础自学教程的内容,希望可以让大家有所收获!
全栈程序员站长
2022/10/03
3.2K0
CAD2007操作教程上
l 认识AutoCAD的应用领域,让学生了解软件的专业特点及在校的优势,认识本专业在国内的发展历程及毕业后的前景。
用户7505898
2020/09/01
3.8K0
CAD2007操作教程上
CAD 初级教程
l 认识AutoCAD的应用领域,让学生了解软件的专业特点及在校的优势,认识本专业在国内的发展历程及毕业后的前景。
用户7505898
2020/09/16
6.1K0
CAD 初级教程
CAD复习资料
11.AutoCAD中命令调用的方法:屏幕菜单、在命令行输入命令、工具菜单、下拉菜单
用户7505898
2020/10/08
6.5K0
CAD复习资料
2014版CAD操作教程(全)
l 认识AutoCAD的应用领域,让学生了解软件的专业特点及在校的优势,认识本专业在国内的发展历程及毕业后的前景。
用户7505898
2020/09/09
6.5K0
2014版CAD操作教程(全)
聊聊springboot项目如何实现自定义actuator端点
用过springboot的朋友,可能会知道springboot有四大神器:自动装配、starter、cli、actuator。其中actuator可帮助你在将应用程序推送到生产环境时监控和管理应用程序。你可以选择使用 HTTP 端点或 JMX 来管理和监控你的应用程序。审计、健康和指标收集也可以自动应用于你的应用程序。
lyb-geek
2022/01/07
9070
聊聊springboot项目如何实现自定义actuator端点
Mastercam9.1
Create    绘图        绘制图素,建立2D,3D几何模型并完成工程作图
用户7505898
2020/09/04
2.7K0
Mastercam9.1
聊聊springboot项目如何实现自定义actuator端点
用过springboot的朋友,可能会知道springboot有四大神器:自动装配、starter、cli、actuator。其中actuator可帮助你在将应用程序推送到生产环境时监控和管理应用程序。你可以选择使用 HTTP 端点或 JMX 来管理和监控你的应用程序。 审计、健康和指标收集也可以自动应用于你的应用程序。
lyb-geek
2021/09/20
9240
聊聊springboot项目如何实现自定义actuator端点
自动驾驶路径规划技术-三次样条插值(Cubic Spline Interpolation)曲线及Python代码实现
自动驾驶运动规划(Motion Planning)是无人驾驶汽车的核心模块之一,它的主要任务之一就是如何生成舒适的、碰撞避免的行驶路径和舒适的运动速度。生成行驶路径最经典方法之一就是是Sampling-Based Planner算法;基于采样的规划器可以规划出可行的轨迹,但这种轨迹往往是折线,为了保证车辆行驶过程中给乘客良好舒适的体验,需要对规划的轨迹进行平滑。Cubic Spline就是一种常用的插值平滑算法,通过一系列的控制点得到一条连续平滑的轨迹。
YoungTimes
2022/04/28
2.2K0
自动驾驶路径规划技术-三次样条插值(Cubic Spline Interpolation)曲线及Python代码实现
Scipy和Numpy的插值对比
插值法在图像处理和信号处理、科学计算等领域中是非常常用的一项技术。不同的插值函数,可以根据给定的数据点构造出来一系列的分段函数。这一点有别于函数拟合,函数拟合一般是指用一个给定形式的连续函数,来使得给定的离散数据点距离函数曲线的总垂直距离最短,不一定会经过所有的函数点。比如在二维坐标系内,用一条直线去拟合一个平面三角形所对应的三个顶点,那么至少有一个顶点是不会落在拟合出来的直线上的。而根据插值法所得到的结果,一定是经过所有给定的离散点的。本文针对scipy和numpy这两个python库的插值算法接口,来看下两者的不同实现方案。
DechinPhy
2022/05/09
3.7K0
Scipy和Numpy的插值对比
MATLAB进行稀疏点的曲线拟合
a = [0.06 0.08 0.1 0.12]; b = [1.30, 1.52, 1.85, 2.59]; figure values = spcrv([[a(1) a a(end)];[b(1
狼啸风云
2019/04/29
1.6K0
MATLAB进行稀疏点的曲线拟合
matlab中如何求插值点,MATLAB插值「建议收藏」
插值就是在已知数据之间计算估计值的过程,是一种实用的数值方法,是函数逼近的重要方法。在信号处理和图形分析中,插值运算的应用较为广泛,MATLAB提供了多种插值函数,可以满足不同的需求。
全栈程序员站长
2022/09/05
3.8K0
CAD VBA创建样条曲线
以下代码使用 CreateTypedArray 转换三个数组:样条曲线拟合点的坐标及其起点和端点切向。然后将变量传递给 AddSpline 方法,创建样条曲线。
办公魔盒
2019/07/22
1.1K0
CAD VBA创建样条曲线
CAD2007操作教程下
图层相当于图纸绘图中使用的重叠图纸,创建和命令图层,并为这些图层指定通用特性。通过将对象分类放到各自的图层中,可以快速有效地控制对象的显示以及其进行更改。(例如墙体或标注)
用户7505898
2020/09/02
8.9K0

相似问题

基数样条曲线的切线计算

16

运动学中样条点的切线

12

通过散点拟合样条曲线

13

从圆上的点计算切线?

10

黑白图像过渡点切线的计算

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档