直線と直線の交点計算は円の中心を求めるときなどに必要です。

 組込み手続きLineLineIntersectionはパラメータがpoint型となっています。これは、Ver.9でpoint型が出来て以降に作られたサブルーチンだからでしょう。座標値が何個もダラダラと続くと目眩がするので、これは良い判断です。


 元の手続きの宣言部です。

procedure LineLineIntersection(

pt11, pt12 :point; { 直線1の座標 }

pt21, pt22 :point; { 直線2の座標 }

var para :boolean; { 直線が平行である }

var onLines :boolean; { 交点が線分上にある }

var pt :point; { 交点の座標 }

);

 VectorScript function Referenceではpt11〜pt22の頭にもvarが付いていて、変数呼びのようになっていますが、それは間違いです。実際は値呼びのパラメータです。下のソースコードがちゃんとコンパイルされたので自信を持って言えます。
 paraの値は、2本の線分が平行の場合にtrueになります。平行だった場合は交点は計算出来ないので、ptの値は意味がありません。
 onLineの値は、交点が線分上にある場合にtrueになり、falseのときは線分の延長線上に存在しているということらしいです。ブログ主はこの違いを重要とは考えないので、今回はこの値は無視しました。※
 ptは交点の座標です。


 以下はLineLineIntersectionのラッパー関数です。例によって、座標値の型がreal型、point型、vector型の3種類の関数になります。
 返り値は交点の座標でも良いのですが、それよりも交点が取れたかどうかの方が重要と考えて、交点の有る無しを返すことにしました。その判定方は、2本の線分が平行であるかどうかです。paraの値がtrueなら交点は計算されないので、paraの値を反転して関数値として返すようにしました。


(* -------- 交点計算 -------- *)


function IntersectLLP(pt11, pt12, pt21, pt22 :point; var pt :point): boolean;

{ 2本の直線の交点を計算する(point型) }

var

para, onLines : boolean;

begin

LineLineIntersection(pt11, pt12, pt21, pt22, para, onLines, pt);

IntersectLLP:= not para;

end;


function IntersectLLR(x11, y11, x12, y12, x21, y21, x22, y22 :real; var x, y :real): boolean;

{ 2本の直線の交点を計算する(real型) }

var

pt :point;

begin

IntersectLLR:= IntersectLLP(XY2Pt(x11, y11), XY2Pt(x12, y12), XY2Pt(x21, y21), XY2Pt(x22, y22), pt);

Pt2XY(pt, x, y);

end;


function IntersectLLV(pt11, pt12, pt21, pt22 :vector; var pt :vector): boolean;

{ 2本の直線の交点を計算する(vector型) }

var

p :point;

begin

IntersectLLV:= IntersectLLP(Vec2Pt(pt11), Vec2Pt(pt12), Vec2Pt(pt21), Vec2Pt(pt22), p);

pt:= Pt2Vec(p);

end;

{ 2022/09/20 : Intersection → Intersect に修正しました。 }


(注意:赤字の関数は組込み関数ではないので、ライブラリのインクルード・ファイルが必要です。)



 ※onLineの値だけでは、交点が片方の線分上にあって、もう片方の線分上からは外れているケースを表せません。それもあってonLineの値は無視しました。


 ところで今回、パラメータの説明に『線分』という単語が出て来て少々戸惑いました。実はVectorWorksでは『線分』は描けても『直線』は描けないことに気づいたからです。マニュアルにもツールにも『直線』と書いてあるので何の疑いもなく『直線』と呼んでいました。

 しかし今回は線分と直線の区別をしないわけにはいかないので『線分』を使わせていただきました。だからと言って次回から『直線』を正しく『線分』と言い換えることはありません。必要に迫られない限り今後も線分のことを『直線』と呼ばせていただきます。