3

カイロのサンプルコードによると、次のコード

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

曲線と2本のピンクの線を生成できます。

ここに画像の説明を入力してください

ただし、これには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);
4

3 に答える 3

6

ポイントを作るだけです:

  • 2つの既知のポイント(x 1、y 1)と(x 3、y 3)から始めます。

ここに画像の説明を入力してください

  • 2つの行を結合します。

ここに画像の説明を入力してください

  • P1P3の中間としてP2を作成ます

ここに画像の説明を入力してください

  • 次に、 P390 °を時計回りに回転させます。

ここに画像の説明を入力してください

  • P 4でも同じことを行い、P1P3の中間に作成ます

ここに画像の説明を入力してください

  • P4を時計回りに90°回転させます。

ここに画像の説明を入力してください

  • これで4つのポイントができ、ベジェ曲線を描くことができます。

ここに画像の説明を入力してください


中点は次のように計算できます。

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;
于 2011-09-03T13:35:24.993 に答える
1

ピンクの線の位置を導き出すために使用できる何らかの制約を提供しない限り、そうではありません。それ自体では、2つのエンドポイントは直線セグメントのみを定義できます。

于 2011-09-03T13:08:50.817 に答える
1

ピンクの線は、2つのエンドポイントからの出発ベクトルを表しています。これらのベクトルがない場合、2つのポイント間の「曲線」は単純に直線になります(それを定義する他の情報がない場合)。

(x1、y1)と(x2、y2)がない場合は、(x、y)からのピンク色の線の終点として(x3、y3)を使用できます。その逆も可能です。それらは、直線の場合に必要な黒い線の真上に配置されます。

曲線が関数で定義されている場合は、終点に近づいたときに導関数を計算し、その角度に沿って接線を描きます。

于 2011-09-03T13:12:58.210 に答える