两个节点之间的Bézier样条插值:如何找到合适的锚点?

时间:2015-09-30 12:24:27

标签: c++ qt bezier spline graph-drawing

在图形用户界面中,我正在处理类似图形的结构。节点由圆圈或矩形表示。用户应该能够在两个节点之间绘制连接线(有向边),并且可以定义该线应该通过的一组中间点。

创建从第一个节点中心开始的分段C2连续Bézier曲线没问题,通过所有中间点并在第二个节点的中心结束。

问题

但是现在(主要是出于美学原因)我希望边缘在节点边界而不是中心点开始/结束。那我怎么能在节点的边界上找到合适的锚点呢?一种可能性是计算我的Bézier曲线和节点边界之间的交点。但是对于圆,这将导致一个6阶多项式方程,并试图用数字解决这个问题似乎有点过分。

可能的解决方案

我尝试的另一个选项是取节点边界和穿过第一个/最后一个Bézier曲线的两个控制点的直线之间的交点。虽然如果中间点远离节点,这似乎是一个很好的近似,但如果它们接近它就会失败:

first cacse second case

  

灰色:中间点,绿色/蓝色:控制点,红色:近似交叉点

是否有推荐的方法来解决这个问题?现有工具如何处理这个问题?

1 个答案:

答案 0 :(得分:1)

  

对于圆,这将产生一个6阶多项式方程,并试图用数字解决这个似乎有点矫枉过正。

QPainterPath::pointAtPercent可与简单的一维牛顿方案一起使用,以找到与圆相交的交点。这很容易做到。

对于正方形,您可以这样做,但迭代圆半径:

  1. 从一个以广场中心为中心的圆圈开始,假设与广场的面积相同。

  2. 找到与圆圈的交点。

  3. 将新的圆半径延伸到方形边界,在从中心到上一步中找到的交叉点的一条直线上。

  4. 从#2重复。

  5. 所有这一切都很容易,而且应该表现良好。

    没关系,解决多项式方程对于像你这样的代数来说是微不足道的。