在图形用户界面中,我正在处理类似图形的结构。节点由圆圈或矩形表示。用户应该能够在两个节点之间绘制连接线(有向边),并且可以定义该线应该通过的一组中间点。
创建从第一个节点中心开始的分段C2连续Bézier曲线没问题,通过所有中间点并在第二个节点的中心结束。
但是现在(主要是出于美学原因)我希望边缘在节点边界而不是中心点开始/结束。那我怎么能在节点的边界上找到合适的锚点呢?一种可能性是计算我的Bézier曲线和节点边界之间的交点。但是对于圆,这将导致一个6阶多项式方程,并试图用数字解决这个问题似乎有点过分。
我尝试的另一个选项是取节点边界和穿过第一个/最后一个Bézier曲线的两个控制点的直线之间的交点。虽然如果中间点远离节点,这似乎是一个很好的近似,但如果它们接近它就会失败:
灰色:中间点,绿色/蓝色:控制点,红色:近似交叉点
是否有推荐的方法来解决这个问题?现有工具如何处理这个问题?
答案 0 :(得分:1)
对于圆,这将产生一个6阶多项式方程,并试图用数字解决这个似乎有点矫枉过正。
QPainterPath::pointAtPercent
可与简单的一维牛顿方案一起使用,以找到与圆相交的交点。这很容易做到。
对于正方形,您可以这样做,但迭代圆半径:
从一个以广场中心为中心的圆圈开始,假设与广场的面积相同。
找到与圆圈的交点。
将新的圆半径延伸到方形边界,在从中心到上一步中找到的交叉点的一条直线上。
从#2重复。
所有这一切都很容易,而且应该表现良好。
没关系,解决多项式方程对于像你这样的代数来说是微不足道的。