1

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

创建从第一个节点的中心开始,经过所有中间点并在第二个节点的中心结束的分段 C2 连续贝塞尔曲线是没有问题的。

问题

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

可能的解决方案

我尝试的另一个选项是取节点边界与穿过第一条/最后一条贝塞尔曲线的两个控制点的线之间的交点。虽然如果中间点离节点更远,这似乎是一个很好的近似值,但如果它们靠近则失败:

第一种情况 第二种情况

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

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

4

1 回答 1

1

对于圆来说,这将导致一个 6 阶多项式方程,并且试图以数字方式解决这个问题似乎有点矫枉过正。

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

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

  1. 从以正方形中心为中心的圆开始,例如与正方形的面积相同。

  2. 找到与圆的交点。

  3. 在从中心到上一步中找到的交点的直线上,将新的圆半径扩展到正方形边界。

  4. 从#2 重复。

所有这一切都很容易做到,应该可以正常执行。

没关系,用 eigen 之类的东西为你做代数求解多项式方程是微不足道的。

于 2015-09-30T12:55:21.060 回答