今回は,
内積から射影を取出す
まず直線の場合なら,
ふたつの垂線の内側
ここで,
第51回図6では,
つまり,
内積による場合分けと線分との距離
内積を使って線分に対する3つの領域を分け,
まず,
ベクトルPとQの内積が正数なら,
そして,
任意の1点と線分の両端の座標から線分上のもっとも近い点を返す関数の定義
計算の仕方はわかったので,スクリプトを書こう。まず,任意の座標から線分上のもっとも近い点を返す関数の定義だ。引数には,Pointオブジェクトで座標を3つ渡す。第1引数が任意の座標で,第2と第3引数は線分の両端の座標とする。関数名はxGetClosestPoint()とした。- xGetClosestPoint
(任意の点, 線分の始点, 線分の終点)
以下のスクリプト1はフレームアクションに関数xGetClosestPoint()を定めた。計算の手順は前項に述べたとおりである。
スクリプト1 任意の1点と線分の両端の座標から線分上のもっとも近い点を返す関数
// フレームアクション
function xGetClosestPoint(myPoint:Point, begin:Point, end:Point):Point {
var myVector3D:Vector3D = new Vector3D(myPoint.x - begin.x, myPoint.y - begin.y);
var baseVector3D:Vector3D = new Vector3D(end.x - begin.x, end.y - begin.y);
var nDotProduct:Number = myVector3D.dotProduct(baseVector3D);
if (nDotProduct > 0) {
var nBaseLength:Number = baseVector3D.length;
var nProjection:Number = nDotProduct / nBaseLength;
if (nProjection < nBaseLength) {
baseVector3D.scaleBy(nProjection / nBaseLength);
return new Point(begin.x + baseVector3D.x, begin.y + baseVector3D.y);
} else {
return end;
}
} else {
return begin;
}
}
まず,
あとは,
入れ子のif条件は,
- Vector3Dオブジェクト.scaleBy
(乗数)
そのVector3Dオブジェクトのxy座標に線分の始点の座標を加えれば,