如何在不知道4分的情况下绘制曲线?

时间:2011-09-03 13:00:09

标签: cairo pycairo

根据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);

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

enter image description here

但那需要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);

3 个答案:

答案 0 :(得分:6)

只需提出要点:

  • 从您的两个已知点开始,(x 1 ,y 1 )和(x 3 ,y 3 ):

enter image description here

  • 加入两行:

enter image description here

  • P 1 P P 2 > 3

enter image description here

  • 现在顺时针旋转 P 3 90°

enter image description here

  • P 4 相同,在 P 1 P <之间创建它/强> <子> 3

enter image description here

  • 顺时针旋转 P 4 90°

enter image description here

  • 现在你有四点,可以绘制你的贝塞尔曲线:

enter image description here


中点可以计算为:

P mid =(x 1 + x 3 )/ 2,(y 1 + Y <子> 3 )/ 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;

答案 1 :(得分:1)

除非您提供某种可用于推导粉红色线条位置的约束。两个端点本身只能定义一条直线段。

答案 2 :(得分:1)

粉色线代表两个端点的偏离矢量。没有这些向量,两点之间的“曲线”只是一条直线(除非你有其他信息来定义它)。

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

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