OSはWindowsXP、Delphi7 でプログラムを作成します。
Delphiには直接関係内のですが、教えてください。
点P1(X1,Y1)、P2(X2,Y2)で結ばれた直線があり、
この直線上で点(X1,Y1)からの距離lに有る
直線状の点Pl(Xl,Yl)を求めるにはどうすればよいでしょうか?
点P1と点P2の斜距離と指定する距離の比率でX,Yを計算とか。
三角関数「アーク・タンジェント」でその直線の角度を求め、
あとは、サイン、コサインを使って計算、かな。
線分と円との交点。
連立方程式を解くだけ。
実は、
「線分と円との交点の連立方程式を解く」と恐ろしい事になります。
もう少し簡単にしないと手に負えません。X1,Y1を強制的に原点にシフトすればOKです。
従って、P2(xa,ya)=(x2-x1,y2-y1)とすれば、
求めるPlは、
C = l^2* ya^4 + l^2 *xa^2 *ya^2
D = xa^2+ya^2
と置いて
yl= C^0.5/D
xl= xa/ya*(C^0.5/D) = xa/ya*yl
もう一方の点は、円の反対側です。
最後に元の位置にシフトすればよいです。
複素数を使えばさらに簡単になります。2点をあらわす複素数をCP1,CP2としたとき、ベクトルP1→P2はCP2-CP1で,その長さをTotalとします。点P1からPL間での長さをLとすると,ベクトルP1→PLは(CP2-CP1)*L/Totalとなります。以上を踏まえて実際のプログラムは次のようになります。なお,uses節にvarCmplxを追加してください。
var CP1,CP2,CPL:variant;Total,L:double;
begin
CP1:=varComplexCreate(x1,y1);
CP2:=varComplexCreate(x2,y2):
CP2:=CP2-CP1;
Total:=varComplexAbs(CP2);
CPL:=CP1+CP2*L/Total;//Lは既知とする
//目的の座標を求める
xL:=CPL.real;
yL:=CPL.Imaginary;
end;
ツイート | ![]() |