求给定任意曲线的长度

「已注销」
博客专家认证
2008-05-14 09:12:37
求给定曲线的任意曲线的长度,如果有困难,可以仅先考虑二次Bezier(QuadBezier)曲线和三次Bezier(CubicBezier)曲线;
目前已经有两种方法:
1)将曲线分解成若干的直线段,计算这些直线段的长度和;
2)直接使用积分的数学方式进行计算(高等数学中有实际算法);
但我仍嫌效率不够高,尤其用数学手段计算在实时矢量绘图中几乎不可行,方案一总感觉仍不是最好的办法;现要找一个比以上两个效率更高的,且适合计算机实现的算法(实时绘图)----使用现成库免谈,我要具体的实现算法----可能是在嵌入系统上;可以适当降低精度,如考虑嵌入系统的原因,允许使用FixedPoint的方式处理算法;
...全文
1484 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
天下无雪 2008-07-28
  • 打赏
  • 举报
回复
楼主的gingkoVG 1.0是自己编写的?开源否??
「已注销」 2008-07-28
  • 打赏
  • 举报
回复
是我自己开发的呀,千真万确。开源暂时还没有考虑; :)
「已注销」 2008-07-26
  • 打赏
  • 举报
回复
因为在忙着赶程序,好久没上来看了.今天上来居然发现新的回复;
优秀程序员不敢说, 我只是努力在追求自己向作的事情;

曲线长度求解暂时没有想到什么好的主意, 暂决定用直线段逼近-----毕竟这看来是非常成熟的算法; 所以现在又开始重新进行程序设计了;
动态算法在gingkoVG 1.0中已经使用: 我会根据曲线的近似长度确定应该细分直线段数----这样可以尽量减少直线段数;

追求完美很大程度看您现在从事的事情, 如果仅仅是作为工作, 很可能只要差不多就好了-----达到客户的要求,达到PL的要求就可以了; 毕竟会马上有新的案子要下来;
但如果作为自己喜欢的一个事业(或仅仅作为自己的一个追求), 情况会不一样, 自然会把他作为一个艺术品精雕细琢, 真的用心去完成; 2D矢量图形我在很早就很看好她在嵌入系统上的应用, 所以针对gingkoVG的开发有些像对待自己的孩子-----欣赏着她长大, 当然最大的愿望是希望未来能真的看着她成熟. 那个时候我也许会重新开始, 继续一个新的梦;
OphoneOu 2008-07-16
  • 打赏
  • 举报
回复
今天晚上睡觉睡不着一直想工作的事:对于刚刚毕业的我,也许要学习的东西太多了.
却有了新的发现:
一个优秀的程序员:tomsoft
证明如下:
1:他在问问题以前,先做了研究!
2:几乎对每一楼问题都做了回复讨论.(这让我很吃惊)tomsoft 您是一个负责的人.
3.你已经有了方法.看得出来你在追求完美.(这多少让我有些感伤:我现在的项目我做得自己并不满意.可是PL满意,客户也没有意见,我完全可以做得更好).

个人感觉这个问题并不是简单问题.新算法我想不出.但是我有一点想法:
1)将曲线分解成若干的直线段,计算这些直线段的长度和;
2)直接使用积分的数学方式进行计算(高等数学中有实际算法);
数值算法一直都没有好好研究过.

或许可以将曲线分解成若干的向量,建立直角坐标系.减少同向冗余.或许考虑为凸包计算问题.以空间换时间.首选动态规划算法.如果要求空间也较少.那就用搜索.通过大量的剪枝优化.在划分标准上,值得仔细考虑.

睡觉了,明天还要努力上班...


OphoneOu 2008-07-16
  • 打赏
  • 举报
回复
今天晚上睡觉睡不着一直想工作的事:对于刚刚毕业的我,也许要学习的东西太多了.
却有了新的发现:
一个优秀的程序员:tomsoft
证明如下:
1:他在问问题以前,先做了研究!
2:几乎对每一楼问题都做了回复讨论.(这让我很吃惊)tomsoft 您是一个负责的人.
3.你已经有了方法.看得出来你在追求完美.(这多少让我有些感伤:我现在的项目我做得自己并不满意.可是PL满意,客户也没有意见,我完全可以做得更好).

个人感觉这个问题并不是简单问题.新算法我想不出.但是我有一点想法:
1)将曲线分解成若干的直线段,计算这些直线段的长度和;
2)直接使用积分的数学方式进行计算(高等数学中有实际算法);
数值算法一直都没有好好研究过.

或许可以将曲线分解成若干的向量,建立直角坐标系.减少同向冗余.或许考虑为凸包计算问题.以空间换时间.首选动态规划算法.如果要求空间也较少.那就用搜索.通过大量的剪枝优化.在划分标准上,值得仔细考虑.

睡觉了,明天还要努力上班...


「已注销」 2008-05-26
  • 打赏
  • 举报
回复
晕~~~就没有数学功力好的伙伴吗? 自己顶起来....
「已注销」 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 rover___ 的回复:]
1楼的方法2,如果能先进行化简(对被积分函数、积分函数),有可能存在更高效的方法。
[/Quote]

确实如此,我就是希望能有数学功底比较好的朋友能找出一个比传统直线算法更为优秀的算法;从理论上希望不使用浮点数(改用FixedPoint)、尽量少的乘法和除法,尤其除法;尽量不要使用其他更高级的运算----这样在具体实现时才可能尽量高效;
rover___ 2008-05-18
  • 打赏
  • 举报
回复
1楼的方法2,如果能先进行化简(对被积分函数、积分函数),有可能存在更高效的方法。
rover___ 2008-05-18
  • 打赏
  • 举报
回复
根据生成曲线的方程推导线积分公式,计算积分,积分的计算可以用近似公式。比如SIMPSON公式。积分的近似计算的方法包括2方面途径:一是把被积分函数用简单函数近似并推导出简单的积分公式;二是积分公式(仍然复杂)用近似函数代替。
被积分函数可以用其级数展开式前几项代替;
总之,先要进行理论推导,然后近似计算。
icosagon 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 tomsoft 的回复:]
引用 15 楼 icosagon 的回复:
那些控制点就是根据相应的曲线算法生成直线段的,绘制曲线并非要直接用直线段数据,所以可以做到很少的数据量绘制曲线.


这个说法似乎有误:
1)Bezier曲线的特征就是以较少的控制点绘制一个曲线,但必须明确控制点的概念----曲线并不需要经过控制点
2)从数学的角度,用细小直线本身就可以理解为积分过程-----不可能通过数学方式直接由控制点或Bezier曲线的参数方程计算下一个点----这在实时矢…
[/Quote]

控制点当然不是指曲线经过的点,但它们是用来生成曲线经过的点的,生成的过程就是相应的曲线算法。归根结底还是直线逼近。
直接用直线数据?这些数据不经过算法怎么来?
「已注销」 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 icosagon 的回复:]
推导还记得是用小线段来模拟的,但数学可以有极限,计算机没有啊,计算机只能近似计算了.
[/Quote]

不考虑精确计算,近似就可以了,所以我讲了可以用FixedPoint加速。误差只要不要太大就可以了,但显示时不能看出破绽----太粗的线不可取
「已注销」 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 icosagon 的回复:]
那些控制点就是根据相应的曲线算法生成直线段的,绘制曲线并非要直接用直线段数据,所以可以做到很少的数据量绘制曲线.
[/Quote]

这个说法似乎有误:
1)Bezier曲线的特征就是以较少的控制点绘制一个曲线,但必须明确控制点的概念----曲线并不需要经过控制点
2)从数学的角度,用细小直线本身就可以理解为积分过程-----不可能通过数学方式直接由控制点或Bezier曲线的参数方程计算下一个点----这在实时矢量图形的显示中可不是什么高明的做法;
设想您在用标准Bezier参数方程计算甚至高达几十万条的Bezier是多么可怕的事情----不要说在嵌入系统,在PC上达到实时都是问题;所以直线逼近是目前最为可行的,也是用的最广泛的矢量图形处理手段;
「已注销」 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 arong1234 的回复:]
首先13楼说法虽然对,但是不准确。我们要计算精确是有一定误差限的,用短线段已经是比较准确的了,只要你分段的足够精细,是完全可以满足误差要求的,在这个意义上,计算的长度就是精确的。实际系统中很少需要真正的数学上那种完全不差的精确。

至于楼主的要求,对于实际求长度的优化算法,是需要根据你实际系统的情况来决定的。你可以考虑以下一些问题:
1. 这些曲线是怎么来的?
2. 这些曲线加入系统后,变化的频率是多…
[/Quote]

非常感动中....
关于这个问题我再说明如下:
1)使用直线的算法是没有问题的, 所以我们不对直线段逼近进行讨论;今年1月已经发布的gingkoVG 1.0已经是这样作的; 但仍要感谢以上的朋友;
2)使用直线算法有他的问题, 在对gingkoVG 1.0用工具进行剖分时已经发现边的处理占了太多的时间; 多数情况下, 通过剖分软件可以测出实际的Curve(含Line)变成直线边后其数量变化为1:89~1:256或更高(取决于您对精度的要求和测试Pattern的选择, 以上数据来自gingkoVG 1.0 fill过程的实际测试);
如果考虑Stroke的Cap和Join所额外带来的边, 边增加的数量会超过这个数字;
3)再次说明:直线算法不是唯一算法, 我曾亲自参加过Adobe官方FlashLite的优化, 他采用了他自己的算法(有专利), 可以确定不是使用的直线段逼近, 因此, 他的渲染效率非常高(FlashLite / FlashPlayer矢量渲染几乎没有使用任何硬件加速----纯软件方式), 因此我希望找到这样类似的算法;

关于楼上仁兄, 我回答如下:
1)可以仅考虑Bezier曲线(QuadBezier和CubicBezier), 这样问题会被简化很多;
2)曲线变化频率我无法确认----因为是实时矢量库, 变化频率取决于用户; 但使用Cache是个好主意, 我印象Hybird矢量库就是这样作的;
3)如1), 仅收缩到仅考虑Line、QuadBezier和CubicBezier;Bezier为指定区段内的(废话)的标准Bezier曲线;
工具剖分一定是需要的,之所以希望找到其他更新的渲染方式也是基于工具剖分的报告,完全基于想象定义优化方案甚至是愚蠢的;非常感谢LS的这个建议;
目前已经完成一个版本的矢量图形库(gingkoVG 1.0),效能比官方的参考实现高不少(几十倍),但目前这并不是最好的算法,和国外实现最好的矢量库相比我的并不是最快的,我希望在gingkoVG 2.0中使用一些更为先进的算法以大幅度提升渲染效能----所以实现不是问题, 我需要比常规算法更高效的算法
「已注销」 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 icosagon 的回复:]
引用 21 楼 tomsoft 的回复:
引用 15 楼 icosagon 的回复:
那些控制点就是根据相应的曲线算法生成直线段的,绘制曲线并非要直接用直线段数据,所以可以做到很少的数据量绘制曲线.


这个说法似乎有误:
1)Bezier曲线的特征就是以较少的控制点绘制一个曲线,但必须明确控制点的概念----曲线并不需要经过控制点
2)从数学的角度,用细小直线本身就可以理解为积分过程-----不可能通过数学方式直接由控制点或Bezier曲线的参…
[/Quote]

明白, 但是Curve被分解成很多顶点后(及直线后), 事实上不是很少的数据----见我之前统计的数据, 除非使用Bezier的参数方程, 所以我可能有误解---仅需要几个控制点就可以了;
直线段的绘制有非常多的高效运算算法, 所以, 用直线逼近曲线本来就不是问题; 我的问题是:找到除线段逼近的其他更高效的算法, 尤其是曲线长度的计算;见原始问题;
非常感谢icosagon的及时回复
arong1234 2008-05-15
  • 打赏
  • 举报
回复
知道啥叫“精确”就知道近似是正确的做法。极限也是当步长“足够小”时的值,近似的道理时一样的。
[Quote=引用 18 楼 icosagon 的回复:]
推导还记得是用小线段来模拟的,但数学可以有极限,计算机没有啊,计算机只能近似计算了.
[/Quote]
icosagon 2008-05-15
  • 打赏
  • 举报
回复
推导还记得是用小线段来模拟的,但数学可以有极限,计算机没有啊,计算机只能近似计算了.
icosagon 2008-05-15
  • 打赏
  • 举报
回复
LZ你没搞清楚贝塞尔曲线的数学原理吧
arong1234 2008-05-15
  • 打赏
  • 举报
回复
13楼不知道还记得不记得牛顿莱布尼差积分是怎么做的,他就是用小线段模拟曲线来积分的,数学上的所有积分、微分公式就是基于连续可微函数在局部接近于直线这个特点来做的。
arong1234 2008-05-15
  • 打赏
  • 举报
回复
首先13楼说法虽然对,但是不准确。我们要计算精确是有一定误差限的,用短线段已经是比较准确的了,只要你分段的足够精细,是完全可以满足误差要求的,在这个意义上,计算的长度就是精确的。实际系统中很少需要真正的数学上那种完全不差的精确。

至于楼主的要求,对于实际求长度的优化算法,是需要根据你实际系统的情况来决定的。你可以考虑以下一些问题:
1. 这些曲线是怎么来的?
2. 这些曲线加入系统后,变化的频率是多少(如果很少变化,应该计算一次长度后就保存该长度,以后就只在曲线变化后再计算)
3. 这些曲线自身有什么规律?说一般用贝塞儿不假,但是如果你曲线有一些特征以至于不使用这个“一般”情况也是很正常的

不进行系统分析就想找“最优”算法是不对的方向
icosagon 2008-05-15
  • 打赏
  • 举报
回复
那些控制点就是根据相应的曲线算法生成直线段的,绘制曲线并非要直接用直线段数据,所以可以做到很少的数据量绘制曲线.
加载更多回复(13)

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧