2012-12-07 38 views
4

我正在paper.js中的一个项目中,我需要根据交集,差异和另外两个工会的联合来创建新路径。我做了一些挖掘,发现了插值一个三次贝塞尔样条的数学函数,但我想知道是否有任何JavaScript库可以进行svg-like向量算术。如果有的话,我会复制inkscape的,并将其转换为JavaScript,但你永远不知道。 无论如何,用于内插立方贝济耶数学函数如下:paper.js工会区别和交集

Pointx = (Ax * percent^3) + (Bx * 3 * (percent^2 * (1-percent))) + (Cx * 3 * (percent * (1-percent)^2)) + (Dx * (1-percent)^3) 
Pointy = (Ay * percent^3) + (By * 3 * (percent^2 * (1-percent))) + (Cy * 3 * (percent * (1-percent)^2)) + (Dy * (1-percent)^3) 

其中A,B,C和d是对于曲线的点。 A被开始时,d是结束,B和C是“控制点”操纵A和D之间的曲率的percent是多远沿曲线上从0分计算为1。

所以这将是一个非常简单的想出一个插值函数,返回一个提供的贝塞尔点和一个贝塞尔百分比的点。找到反函数 - 给定点(或x值或y值)的百分比(s)将很困难。或者更困难的是,两个贝塞尔相交(我不擅长数学)。我希望这是Inkscape的功能提供的。

是否有任何JavaScript库可以快速完成这种矢量插值?如果不是,我会在这里发布我提出的算法。 谢谢!

回答

1

虽然我不会说这是一个重复的问题,但我相信你会从这个question的答案中找到很好的见解,因为它非常相似。

我没有找到未在回答这个问题,这里当中提到一个其他资源: http://13thparallel.com/archive/bezier-curves/

除此之外,这是在问题中提到的最佳资源是在这里: http://blog.mackerron.com/2011/01/01/javascript-cubic-splines/

两个这些资源详细的具体功能,将做你正在寻找的东西。虽然他们不是“图书馆”,但代码将很容易地移植到您的项目中,以达到您的目的。

+0

不幸的是,这些链接是为了渲染线条。这个函数不会按照这些链接之一显示的稳定时间间隔进行渲染: [link](http://13thparallel.com/archive/bezier-curves/example3.htm) 我真的很想要它,但它会查找它们相交的地方。我会尽快在这里更新我的发现。 –

2

你所寻找的是一种叫做Boolean Operations on Polygons

Paper.js似乎现在使用相当不错BoolOps,他们直接与贝塞尔曲线处理。如果你问我,这应该是首选。这是一个不错的example

在另一种情况下,你可以使用De-Casteljau algorithm多边形化的形状,并送入Javascript Clipper。如果使用高采样率,视觉效果与真实曲线完全相同,但您失去了路径的弯曲特性。