|
★点と直線の距離
|
点Aから直線 ax+by+c=0 までの距離
|
Delphiでは
L := Abs(a*x1+b*y1+c)/Sqrt(a*a+b*b);
のように記述します。
なお、2点間を通る直線の方程式は、
ですが、これを展開すると、
(x2−x1)(y−y1)=(y2−y1)(x−x1)
(y2−y1)x−(x2−x1)y−(y2−y1)x1+(x2−x1)y1=0
となり、これが「ax+by+c=0」の式の形になる訳ですから
a=y2−y1、b=x1−x2、c=(y1−y2)x1+(x2−x1)y1
となり、これを上記のLの式に当てはめれば、点と2点間線分との距離を求める事が出来ます。
★点から直線へ垂直に下ろした点(垂点)
垂点を計算したい場合は、直線の式
と、その点(xp,yp)を通り、上記の直線に垂直となる直線の式
これらの連立方程式を解けば算出出来ます。
(線と線が垂直になる条件は、mm'=−1 (m:傾き))
プログラムは[TEST007]を改良し、2点から成る直線2つの交点を表示する簡単なサンプルプログラムです。絵は、TImageを配置して、そこに描きます。10ドットを1単位とします。 |
プログラムは[TEST010]を改良し、ある点から直線へ下ろした垂点を表示する簡単なサンプルプログラムです。絵は、TImageを配置して、そこに描きます。10ドットを1単位とします。 |
また、回転写像を利用して、簡単に解くには、下記のようにします。もっとも、感覚的に簡単のように見えても、コンピュータでの計算速度は遅くなる場合も多々ありますので御注意下さい。
|
@まず、線の傾き角度を算出します。
A := ArcTan2(y2-y1,x2-x1); |
|
A点(x1,y1)を中心に角度A分、逆回転したと考えます。
(x2,y2)の回転後が(x2',y2')
(xp,yp)の回転後が(xp',yp')
です。 |
|
B(xp',yp')から
線(x1,y1)−(x2',y2')に下ろした点を
(xc',yc')とします。 |
|
C(xc',yc')を
点(x1,y1)を中心に角度A分、回転した
点(xc,yc)が、求める垂点となります。 |
回転写像は、
| ( | cosθ -sinθ | ) θ:回転角 |
sinθ cosθ |
つまり
x'=x×cosθ−y×sinθ
y'=x×sinθ+y×cosθ
ですが、これは中心(0,0)での回転ですので、点(x0,y0)を中心に回転する場合には、
x'=x0+(x−x0)×cosθ−(y−y0)×sinθ
y'=y0+(x−x0)×sinθ+(y−y0)×cosθ
となります。
回転写像を行う部分を関数にしておけばプログラミングは簡単になるでしょう。しかし、1度利用するとsin・cosを4回、逆回転も含めると8回、三角関数を実行する事になります。当然、四則演算よりも速度は遅くなると思われます。
回転写像を利用して、ある点から直線へ下ろした垂点を表示する簡単なサンプルプログラムです。絵は、TImageを配置して、そこに描きます。10ドットを1単位とします。 |
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
▲PREV
▼NEXT
CAD作ろ!
|