我试图寻找/制造算法来计算任意两个装满二维对象的交集(新填充的对象)。 对象使用的是线或立方贝济耶限定,并且可以具有孔或自相交。 我所知道的几个现有的算法做与多边形一样, 在这里列出 。 不过,我想支持贝济耶没有细分它们变成多边形,输出应该有大致相同的控制点在那里有没有交集地区输入。
这是一个交互式程序做一些CSG但剪裁并不需要是实时的。 我搜索过一段时间,但还没有找到很好的出发点。
我试图寻找/制造算法来计算任意两个装满二维对象的交集(新填充的对象)。 对象使用的是线或立方贝济耶限定,并且可以具有孔或自相交。 我所知道的几个现有的算法做与多边形一样, 在这里列出 。 不过,我想支持贝济耶没有细分它们变成多边形,输出应该有大致相同的控制点在那里有没有交集地区输入。
这是一个交互式程序做一些CSG但剪裁并不需要是实时的。 我搜索过一段时间,但还没有找到很好的出发点。
我发现下面的发布是最好的信息关于贝塞尔剪辑:
TW Sederberg,BYU,计算机辅助几何设计课程笔记
谈到有关曲线交点法第7章可在网上。 它概述了4种不同的方法来找到交叉并详细描述贝塞尔剪辑:
http://www.tsplines.com/technology/edu/CurveIntersection.pdf
我知道我是在存在冗余的风险,但我研究了同样的问题,发现我在学术文章阅读,但还没有找到一个工作液的解决方案。
你可以重写的贝塞尔曲线为一组两个双变量三次方程是这样的:
显然,曲线相交的值(T1,T2),其中ΔX=ΔY= 0。不幸的是,它是由一个事实,即它是很难找到根源在两个方面,和近似方法往往(作为另一个作家所说的复杂它)炸毁。
但是,如果你正在使用的整数或有理数为控制点,那么你可以使用GROEBNER基到你的双变量阶多项式3改写成(可能向上到订单-9-这样你的,九元可能的相交)monovariate多项式。 之后,你只需要找到你的根(平说,T 2)在一个维度,将您的结果返回到您的原方程的一个找到其他维度。
Burchburger有一个门外汉友好的介绍Groebner基称为“Gröbner基:简短的开场白为系统理论家 ”这对我来说非常有帮助。 谷歌一下。 另一篇,这是有帮助的是一个由TF海恩,里面有很多实用的方程的贝塞尔曲线,包括如何找到x和y的方程多项式的系数被称为“ 快速,三次贝塞尔路径的精确的扁平化和偏移曲线 ”。
至于贝塞尔剪裁是否会与此特定方法的帮助,我对此表示怀疑,但贝塞尔曲线剪裁是缩小其中交叉可能,而不是寻找的地方是最后(尽管可能近似)的答案的方法。 很多时候用这种方法会在寻找单变量方程来度过的,这个任务不与剪裁得到任何容易。 寻找根源是比较琐碎。
然而,这种方法的优点之一是,它不依赖于递归细分曲线,这个问题成为一个简单的一维求根问题,这是不容易的,但详细的记载。 主要的缺点是计算GROEBNER基是昂贵的,如果你正在处理浮点多项式或使用更高阶的贝塞尔曲线变得非常笨重。
如果你想在Haskell部分成品代码找到交叉点,让我知道。
我写代码,做这个很长,很久以前。 该项目我正在使用产生作为PostScipt路径即分段贝塞尔边界限定2D对象。
我用的方法是:
让曲线P,Q,由贝塞尔控制点来定义。 难道他们相交?
计算控制点的包围盒。 如果它们不重叠,那么这两个曲线不相交。 除此以外:
PX(吨),吡啶(T),QX(U),QY(U)是0三次多项式<= T,U <= 1.0。 距离的平方(PX - QX)** 2 +(PY - QY)** 2是一个多项式(T,U)。 使用牛顿迭代,试图解决为零。 丢弃0以外<= T,U <= 1.0的任何解决方案
NR可能会或可能不会收敛。 曲线可能不相交,或NR可以只炸毁时,两条曲线几乎是平行的。 所以切断NR如果它不经过迭代的一些任意数量之后收敛。 这可能是一个非常小的数目。
如果NR不收敛于一解,分割一个曲线(比方说,P)成两条曲线PA,PB在t = 0.5。 这是很容易,它只是计算中点,作为链接的文章显示。 然后递归测试(Q,PA)和(Q,PB)为交叉点。 (注意,在递归是q已成为p的下一层,使p和q被交替地在递归的每个帘布层分开。)
大多数递归调用的返回迅速,因为边框是不重叠的。
你将不得不切断递归在一些任意深度处理怪异的情况下,两条曲线是平行的,不太接触,但它们之间的距离是任意小的 - 也许差只有1 ULP。
当你找到一个路口,你不这样做,是因为三次曲线可以有多个口岸。 所以,你必须分裂在交叉点的每条曲线,并递归检查之间(PA,QA)(PA,QB)(PB,QA)(PB,QB)更interections,,,。
有许多的做贝塞尔裁剪学术研究论文:
http://www.andrew.cmu.edu/user/sowen/abstracts/Se306.html
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.61.6669
http://www.dm.unibo.it/~casciola/html/research_rr.html
我推荐的间隔方法,因为你描述,你就不必往下划分为多边形,你可以得到保证的结果,以及定义自己的任意精度的结果集。 对于区间呈现的更多信息,你也可指http://www.sunfishstudio.com