【问题标题】:How to draw a curve without knowing 4 points?如何在不知道 4 个点的情况下绘制曲线?
【发布时间】:2011-11-09 17:32:37
【问题描述】:

根据cairo example code,如下代码

double x=25.6,  y=128.0;
double x1=102.4, y1=230.4,
       x2=153.6, y2=25.6,
       x3=230.4, y3=128.0;

cairo_move_to (cr, x, y);
cairo_curve_to (cr, x1, y1, x2, y2, x3, y3);

cairo_set_line_width (cr, 10.0);
cairo_stroke (cr);

cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_set_line_width (cr, 6.0);
cairo_move_to (cr,x,y);   cairo_line_to (cr,x1,y1);
cairo_move_to (cr,x2,y2); cairo_line_to (cr,x3,y3);
cairo_stroke (cr);

可以生成曲线和两条粉色线。

但这需要 4 个点,(x,y), (x1,y1), (x2,y2), (x3,y3)

如果我只有 x,y 和 x3,y3(曲线的起点和终点), 有没有什么数学公式可以在不知道 x1,y1 和 x2,y2 的情况下生成那些粉线?

编辑

这是我通过以下方式生成曲线的情况。

cairo_move_to (cr, x, y);
cairo_curve_to (cr, x, y3, x3, y, x3, y3);

【问题讨论】:

  • 没有。那些“粉色线”表示曲线在曲线起点和终点的切线。在任意两点 A 和 B 之间可以拟合出无限可能的曲线。一种选择是即使您不知道 x1,y1,x2,y2 但知道曲线两端的切线角度,那么应该可以计算。这可能更适合math.stackexchange.com

标签: cairo pycairo


【解决方案1】:

把点数说清楚:

  • 从您的两个已知点开始,(x1,y1) 和 (x3,y3子>):

  • 加入两条线:

  • P1P 之间创建 P2 >3:

  • 现在将 P3 顺时针旋转 90°:

  • P4 做同样的事情,在 P1P3

  • 顺时针旋转P4 90°:

  • 现在您有了四个点,可以绘制贝塞尔曲线了:


中点可以计算为:

Pmid = (x1+x3)/2 , (y1 +y3)/2

double x1=25.6,  y1=128.0;
double x3=153.6, y3=25.6;

double xm = (x1+x3)/2;
double ym = (y1+y3)/2;

//rotate Pm by 90degrees around p1 to get p2
double x2 = -(ym-y1) + y1;
double y2 =  (xm-x1) + x1;

//rotate Pm by 90degrees around p3 to get p4
double x4 = -(ym-y3) + y3;
double y4 =  (xm-x3) + x3;

【讨论】:

    【解决方案2】:

    除非您提供某种可用于导出粉色线位置的约束,否则不会。两个端点本身只能定义一条直线。

    【讨论】:

      【解决方案3】:

      粉红色的线代表从两个端点的出发向量。如果没有这些向量,两点之间的“曲线”只是一条直线(除非您有其他一些信息来定义它)。

      如果您没有 (x1,y1) 和 (x2,y2),您可以只使用 (x3,y3) 作为 (x,y) 的粉红色线的端点,反之亦然。它们最终会出现在您的黑线上方,这是它们应该在直线上的位置。

      如果曲线由函数定义,请在接近端点时计算导数并沿该角度绘制切线。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-30
        • 2018-12-01
        • 2022-06-28
        • 2012-03-15
        • 1970-01-01
        • 2021-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多