直線と直線の交点計算は円の中心を求めるときなどに必要です。
組込み手続きLineLineIntersectionはパラメータがpoint型となっています。これは、Ver.9でpoint型が出来て以降に作られたサブルーチンだからでしょう。座標値が何個もダラダラと続くと目眩がするので、これは良い判断です。
元の手続きの宣言部です。
procedure LineLineIntersection(
pt11, pt12 :point; { 直線1の座標 }
pt21, pt22 :point; { 直線2の座標 }
var para :boolean; { 直線が平行である }
var onLines :boolean; { 交点が線分上にある }
var pt :point; { 交点の座標 }
);
(* -------- 交点計算 -------- *)
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では『線分』は描けても『直線』は描けないことに気づいたからです。マニュアルにもツールにも『直線』と書いてあるので何の疑いもなく『直線』と呼んでいました。
しかし今回は線分と直線の区別をしないわけにはいかないので『線分』を使わせていただきました。だからと言って次回から『直線』を正しく『線分』と言い換えることはありません。必要に迫られない限り今後も線分のことを『直線』と呼ばせていただきます。