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

AutoCAD如何计算只由拟合点定义的样条的端点切线?
EN

Stack Overflow用户
提问于 2020-06-19 06:22:03
回答 2查看 842关注 0票数 7

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

复制
相关文章
Android开发(37) 使用DrawerLayout实现抽屉式导航菜单
最近流行 左侧抽屉式的导航条菜单,知乎,360,QQ都使用了这样的导航菜单,我们也了解下:
张云飞Vir
2020/03/16
3.7K0
[flutter专题]6详解AppBar小部件
应用栏是各种应用程序中最常用的组件之一。它可用于容纳搜索字段、以及在页面之间导航的按钮,或者只是页面标题。由于它是一个如此常用的组件,因此 Flutter 为该功能提供了一个名为AppBar的专用小部件。
徐建国
2021/11/30
16.8K0
[flutter专题]6详解AppBar小部件
Android入门教程 | DrawerLayout 侧滑栏
要使用 DrawerLayout,可以在 layout xml 文件中将 DrawerLayout 设置为根视图。
Android_anzi
2021/12/08
2.3K0
2、wxWidgets介绍–菜单栏、状态栏、图标简介
wxWidgets是一个用来编写C++程序的GUI(图形用户界面)工具包。它是一个开源的、成熟的、跨平台的工具包。wxWidgets应用程序能在所有主流的操作系统上运行,Windows,Unix,Mac。这个项目由Julian Smart在1992年启动。wxWidgets提供各种各样的C++类来处理数据流、数据库、多线程、在线帮助、应用程序设置。wxWidgets由大量的窗口小部件组成。
全栈程序员站长
2022/09/06
3.1K0
2、wxWidgets介绍–菜单栏、状态栏、图标简介
Windows 7 操作系统
Windows 7 的主要特性有:  更简单  更安全  更好的连接  更低的成本
青灯古酒
2023/10/16
6270
如何在Mac上轻松更改Finder的外观
macOS Finder是一个方便的实用程序,但是如果您自定义外观,它可能会为您提供更好的服务。这里有一些改变Finder外观的技巧!
office小助手
2020/12/24
6.3K0
如何在Mac上轻松更改Finder的外观
vs code 打开顶部菜单栏和左侧菜单栏的方法
按快捷键 F1 或者 shift+ctrl+p 切换出命令行,然后输入menu 有个view:toggle Menu bar 的功能,即可打开顶部菜单栏
朵朵花儿
2019/09/19
11.7K0
vs code 打开顶部菜单栏和左侧菜单栏的方法
『React Navigation 3x系列教程』createDrawerNavigator开发指南
这篇文章将向大家分享createDrawerNavigator的一些开发指南和实用技巧。
CrazyCodeBoy
2019/12/10
7.3K0
『React Navigation 3x系列教程』createDrawerNavigator开发指南
Parallels Toolbox for mac(pd工具箱)
专为富有创造力的个人、学生、小企业主、长期多任务处理者、IT 经理以及介于两者之间的任何人而设计。Parallels Toolbox 讓每個人都可以充分利用他們的 Mac,而不必學習複雜的系統設定。
Mac小小心
2023/04/10
5.9K0
Parallels Toolbox for mac(pd工具箱)
Android 侧滑抽屉菜单
  滑动菜单相信都不会陌生,你可能见过很多这样的文章,但我的文章会给你不一样的阅读和操作体验。
晨曦_LLW
2021/03/23
4K0
Android 侧滑抽屉菜单
pycharm如何调试代码_pycharm怎么分段运行代码
  (2)已经创建了一个python工程并且添加了内容,具体参考: Getting Started tutorial
全栈程序员站长
2022/09/27
2.3K0
pycharm如何调试代码_pycharm怎么分段运行代码
VsCode中使用Jupyter
(以前称为IPython Notebook)是一个开源项目,可让您轻松地在一个名为Notebook的画布上组合Markdown文本和可执行的Python源代码。
云深无际
2020/11/03
6.2K0
VsCode中使用Jupyter
Windows中的键盘快捷方式大全
Windows有很多键盘快捷方式,使用键盘快捷方式能够大大提高使用windows的效率,同时还能提升自己的逼格,背熟几个快捷方式,操作起来行云流水犹如大神一般!
用户7657330
2020/08/14
5.9K0
点击加载更多

相似问题

在TypeScript中使用ENUM有什么意义?

20

在代码(不是URL)中"javascript:“有什么意义?

43

C++ --使用< T>而不是<typename T>有什么意义吗?

11

使用ostringstream而不是只使用常规字符串有什么意义?

12

使用SubSink而不是订阅数组有什么意义

239
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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