研究開発

ブロックを積む(5)

第5章 続2D図形の描画

2D図形の描画ではブロック塀ということで、四角形に関するAPIの話をしましたが、Vectorworksにはそのほかにも多数の図形があります。

直線、長円、円/円弧、2D基準点、多角形、曲線...。

まずは、直線を描いてみましょう。手順は2通りあります、それぞれペアで使うのが基本です。

手続きMoveTo(pX, pY : REAL);
手続きLineTo(pX, pY : REAL);

手続きMove(moveDX, moveDY : REAL);
手続きLine(lineDX, lineDY : REAL);

手続きMoveToはペンを目的の座標値まで、上げた状態で移動し、手続きLineToはペンを目的の座標値まで、下げた状態で移動します。ペンプロッタで線を描くのをイメージしてみてください。実際に線を描くのはLineToですが、線の描き始め位置までペン先を移動するのはMoveToの役目です。

MoveTo( 10, 20 );
LineTo( 60, 50 );

LineToを続けて書くと線が繋がったように描画されます。

MoveTo( 10, 20 );
LineTo( 60, 50 );
LineTo( 80, 50 );
LineTo( 60, 20 );
LineTo( 10, 20 );

FOR文で繰り返すことで、簡単に連続複製したように描くこともできます。

PROCEDURE sample;
VAR
ii : INTEGER;
BEGIN
FOR ii := 0 TO 4 DO
BEGIN
MoveTo( 10+ii*10, 20 );
LineTo( 60+ii*10, 50 );
END;
END;
Run( sample );

手続きMoveと手続きLineは、手続きMoveToと手続きLineToに似ていますが、始点から終点へではなく、始点からx方向にxx、y方向にyyと、与える数値が座標値ではなく、移動量になります。

つづいて、長円を描いてみましょう。 長円を描く手続きは2つあります。

手続きOval(p1X, p1Y, p2X, p2Y : REAL);
手続きOvalN(orginX, orginY, directionX, directionY : REAL; width, height : REAL);

OvalはRectと同じように、4つの引数には、対角にあたる座標をいれます。

  • ※ 点線の囲みはでません。
Oval( 10, 20, 60, 50 );

OvalN、これもRectangleNと同じように、角度のついた長円を描くことができます。

  • ※ 点線の囲みはでません。
OvalN( 10, 20, 1, 1, 50, 30 );

つづいて、円/円弧を描いてみましょう。 円/円弧を描く手続きは2つあります。

手続きArc(p1X, p1Y, p2X, p2Y : REAL; StartAngle, ArcAngle : REAL);
手続きArcByCenter(x, y, radius : REAL; startAngl, sweepAngle : REAL);

まず、Arcですが、最初の4つの引数には、対角にあたる座標をいれます。この四角形に内接する円弧を作成します。このとき、正方形になるようにしないと曲線になってしまいます。また、円弧角が360とすると円になります。

  • ※ 点線の囲みはでません。
Arc( 10, 20, 50, 60, 45, 90 );

Arc( 10, 20, 50, 60, 0, 360 );

次に、ArcByCenterは、円の公式のごとく、円の中心、半径、そして、開始角、円弧角となります。こちらも円弧角が360とすると円になります。

ArcByCenter(10, 20, 40, 45, 90 );

ArcByCenter(10, 20, 40, 0, 360 );

つづいて、2D基準点を描いてみましょう。

手続きLocus(pX, pY : REAL);

描画したい座標値、x,yを入れると2D基準点が描かれます。

Locus( 10, 20 );

次に、多角形と曲線を描いてみましょう。手順は2通りあります。

手続きSmooth(smoothType : INTEGER);
手続きPoly(x1,y1,x2,y2,...,xn,yn : REAL);

手続きBeginPoly;
手続きEndPoly;

Polyは予め頂点数が決まっている場合に使います。Smoothのパラメータで、多角形と曲線(ベジェ、キュービックスプライン、円弧)を描き分けます。

Smooth( 0 );
Poly( 0, 0, 0, 20, 20, 20, 20, 0 );

Smooth( 1 );
Poly( 0, 0, 0, 20, 20, 20, 20, 0 );

Smooth( 2 );
Poly( 0, 0, 0, 20, 20, 20, 20, 0 );

Smooth( 3 );
Poly( 0, 0, 0, 20, 20, 20, 20, 0 );

BeginPoly & EndPolyは手続きの間で頂点を追加していきます。ただし、3点以上追加しないと図形ができません。

多角形の場合、

手続きAddPoint(pX, pY : REAL);

を使います。

BeginPoly;
AddPoint( 0, 0 );
AddPoint( 0, 20 );
AddPoint( 20, 20 );
AddPoint( 20, 0 );
EndPoly;

曲線(ベジェ)の場合、

手続きCurveTo(pX, pY : REAL);

を使います。

BeginPoly;
CurveTo( 0, 0 );
CurveTo( 0, 20 );
CurveTo( 20, 20 );
CurveTo( 20, 0 );
EndPoly;

曲線(キュービックスプライン)の場合、

手続きCurveThrough(pX, pY : REAL);

を使います。

BeginPoly;
CurveThrough( 0, 0 );
CurveThrough( 0, 20 );
CurveThrough( 20, 20 );
CurveThrough( 20, 0 );
EndPoly;

曲線(円弧)の場合、

手続きArcTo(pX, pY : REAL; radiusDistance : REAL);

を使います。

BeginPoly;
ArcTo( 0, 0, 10 );
ArcTo( 0, 20, 10 );
ArcTo( 20, 20, 10 );
ArcTo( 20, 0, 10 );
EndPoly;

また曲線は、頂点形状を組み合わせることも可能です。

BeginPoly;
AddPoint( 0, 0 );
CurveTo( 0, 20 );
CurveThrough( 20, 20 );
ArcTo( 20, 0, 10 );
EndPoly;

さらに、FOR文で繰り返すことで頂点を追加することも可能です。

PROCEDURE sample;
VAR
ii : INTEGER;
BEGIN
BeginPoly;
FOR ii := 0 TO 4 DO
BEGIN
AddPoint( 0+ii*20, 0 );
AddPoint( 10+ii*20, 10 );
END;
EndPoly;
END;
Run( sample );

最後に、多角形、曲線の始点と終点を開くか、閉じるかは

手続きOpenPoly;
手続きClosePoly;

を、多角形、曲線を描く前に実行します。

ClosePoly;
Smooth( 0 );
Poly( 0, 0, 0, 20, 20, 20, 20, 0 );

ClosePoly;
BeginPoly;
AddPoint( 0, 0 );
CurveTo( 0, 20 );
CurveThrough( 20, 20 );
ArcTo( 20, 0, 10 );
EndPoly;