第一章 一个简单的系列是如何诞生的-P.Bezier

本文探讨了CAD/CAM系统中数学问题的解决方案,重点介绍了UNISURF系统的起源和发展历程。该系统最初由汽车行业数学工程师研发,旨在通过数字控制而非图纸来精确定义零件形状。

为了解决CAD/CAM数学方面的问题,许多方案被提出,每一种方案适合某一特定问题。很多系统被数学家发明。但是UNISURF系统是从事汽车工业的数学工程师开发的,至少刚开始是这样。这些系统在在直线和圆的描绘上相似。倒角和其它blending auxiliary surfaces是不完整的,它们最后的形状要依赖于pattermakers和die-setters的技巧和经验。

Circa 1960,designers of stamped parts such as car-body panels used French curves and sweeps, but in fact the final standard was the "master model",the shape of which, for many valid reasons, could not coincide with the curves traced on the drawing board.此问题被喋喋不休地争论。

显然,这没有什么重大改进。因为没有一个方法可以提供精准的、完备的、无可质疑的任意形状定义方法。

那时,计算机数字化控件(Computing and numerical control-NC)已经有了长足的进步。it was certain that only numbers, transmitted from the drawing office to tool drawing office, manufacture, patternshop and inspection, could provide an answer.Drawings would of course remain necessary, but they would only be explanatory, their accuracy having no importance.Numbers would be the single, final definition.


可以确定的说,如果没有数学的协助,没有系统可被设计出来。设计师,负责操作此系统。他要有很好的几何基础,尤其是画法几何,但是不需要代数或解析几何基础。

法国很快就知道了美国航空工业的进展。在1964年之前,James Ferguson的论文已经透露:雪铁龙(法国汽车公司)已经秘密地得到了Paul de Casteljau的研究成果。但是著名的技术报告MAC-TR-41(作者:S.A.Conns)没有发表直到1967年。在1974年W.Gordon和R.Riesenfeld发表出版了它们。

起初,UNISURF的理念是面向几何而不是解析几何,but with the idea that every datum should be exclusively expressed by numbers.

比如,圆弧可被坐标、cartesian of course、受限点表示(见图1.1)。

ie.,A and B, together with their curvilinear abscissas, related by a grid traced on the edge.

The shape of the middle line of a sweep is acube, if its cross-section is onstant, its matter is homogeneous, and the effect of friction on the tracing cloth is neglected.然而,计算两个点之间的长度有些困难。软件或NC机器使用这些曲线,如2D铣床。这些曲线可为直线、圆,也可能是抛物线。样条曲线将将切割细分成一系列首尾相连的圆弧。

为了将圆弧转换成椭圆的一部分,可使用如下图1.2所示的矩形框架。它有两个方向的绳子,这两个方向绳子的交点可确定一条圆弧。如果框架变成了平行四边形,将框架变成如1.3图所示的样子。圆弧就变成了椭圆弧了。此椭圆弧完全由三个已知坐标点A、B、C定义。如果框架被如图1.4所示的缩放器代替,它将变成平行四边形。一个椭圆弧仍旧被三个已经坐标点ABC定义。



图1.1 template的一部分逼近一段手绘的曲线

图1.2 连接矩形网格点生成圆弧



图3 如果前幅图中的框架发生剪切变形,便可得到椭圆上的弧。

(me:即框架由原来的矩形变成了平行四边形)


图4 缩放构造椭圆弧

(me:我猜想上面左面还有一个缩放器,这两个缩放器用来定位两方向的绳子,当缩放器缩放时,绳子的位置跟着变化,就确定了交点,就又定义了新的弧)


图5 椭圆弧的“控制多边形”

当然,这个并不实现,但它可以代替计算出的曲线上的连续点。那时使用调和函数模拟,此方法使用广泛,结果也不错。但是仅使用有限的椭圆弧太受限制了。需要更自由的方法定义曲线。






 

你提供的这段字符串: ``` path://M367.855,428.202c-3.674-1.385-7.452-1.966-11.146-1.794c0.659-2.922,0.834-5.905,0.519-8.874 ``` 是 SVG 中的路径(`<path>`)数据,以 `path://` 开头的形式通常用于 ECharts 等可视化库中表示图形形状。 --- ## ✅ 这段路径是如何生成的? 它是由一系列 **SVG 路径命令** 和坐标参数组成的。我们可以逐步解析它的含义,并了解它是如何绘制图形的。 ### 🔍 解析这段路径 ``` M367.855,428.202 c-3.674-1.385-7.452-1.966-11.146-1.794 c0.659-2.922,0.834-5.905,0.519-8.874 ``` #### 1. `M367.855,428.202` —— MoveTo 命令 将画笔移动到起始点 `(367.855, 428.202)`,不画线。 #### 2. `c-3.674-1.385-7.452-1.966-11.146-1.794` —— 三次贝塞尔曲线(Cubic Bezier) 这是第一个 `C` 命令(简写为 `c`,相对坐标): - 控制点1:`(-3.674, -1.385)` - 控制点2:`(-7.452, -1.966)` - 结束点:`(-11.146, -1.794)` 由于是相对坐标 (`c`),所以最终结束点的位置是: ``` 当前位置 + 参数 = (367.855 - 11.146, 428.202 - 1.794) = (356.709, 426.408) ``` #### 3. `c0.659-2.922,0.834-5.905,0.519-8.874` —— 第二个贝塞尔曲线 继续从上一个终点开始,使用新的控制点和终点: - 控制点1:`(0.659, -2.922)` - 控制点2:`(0.834, -5.905)` - 终点:`(0.519, -8.874)` 最终位置变为: ``` (356.709 + 0.519, 426.408 - 8.874) = (357.228, 417.534) ``` --- ## 🧰 如何生成这样的路径? 你可以通过以下方式生成类似的 SVG 路径: --- ### 方法一:使用矢量图形软件导出 SVG 1. 使用 Adobe Illustrator、Figma、Inkscape 等工具绘制图形。 2. 导出为 `.svg` 文件。 3. 打开文件查看 `<path>` 的 `d` 属性值。 --- ### 方法二:使用在线 SVG 编辑器手动绘制 推荐工具: - [https://yqnn.github.io/svg-path-editor/](https://yqnn.github.io/svg-path-editor/) - [https://svg-edit.github.io/svgedit/releases/latest/editor/svg-editor.html](https://svg-edit.github.io/svgedit/releases/latest/editor/svg-editor.html) 这些工具可以让你拖动节点并实时生成路径字符串。 --- ### 方法三:用 JavaScript 动态生成路径字符串 如果你希望在程序中动态生成路径,可以拼接字符串或使用函数生成: ```javascript function createBezierPath(startX, startY, cp1x, cp1y, cp2x, cp2y, endX, endY) { return `M ${startX} ${startY} C ${cp1x} ${cp1y} ${cp2x} ${cp2y} ${endX} ${endY}`; } const pathStr = createBezierPath(100, 100, 120, 80, 140, 80, 150, 100); console.log(pathStr); // 输出: M 100 100 C 120 80 140 80 150 100 ``` --- ## 📌 在 ECharts 中使用该路径 ECharts 支持直接使用这种格式定义图标或图形元素,例如作为标记(markPoint)、背景图等: ```javascript option = { xAxis: {}, yAxis: {}, series: [{ type: 'line', data: [[10, 20], [20, 30]], markPoint: { symbol: 'path://M367.855,428.202c-3.674-1.385-7.452-1.966-11.146-1.794c0.659-2.922,0.834-5.905,0.519-8.874', symbolSize: 30, data: [{ name: 'point', coord: [10, 20] }] } }] }; ``` --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值