Houdini数学 : 円と線分の接触判定
円と線分の接触判定を行うVEXを紹介します。
ネットワーク全体
線分に接触している円は赤く、それ以外は白く表示させてみました。
ノードの解説
■Addノード(円の中心の追加)
左側のAddノードでは円の中心となる点を追加します。
■Addノード(線分の端点の追加)
右側のAddノードでは、線分の両端の点を追加します。
■Attribute Wrangleノード(円と線分の接触判定)
Attribute Wrangleノードでは、円と線分の接触判定を行います。
接触しているものに対しては @Cdアトリビュートに赤色を設定します。
VEC(c)vector l0 = point(@OpInput2, "P", 0);
vector l1 = point(@OpInput2, "P", 1);
vector l = normalize(l1 - l0); // 直線に沿うベクトル
vector p = @P - l0; // 直線の開始点と点Pを結ぶ線分
float k = dot(l, p) / dot(l, l); // 垂線の足までの長さ
k = clamp(k, 0, length(l1 - l0)); // 垂線の足が線分の外に出ないようにする
vector h = p - k * l; // 垂線(点Pと垂線の足を結ぶ直線)
float distance = length(h); // 点と直線の距離
if (distance < chf("radius")) // 垂線が円の半径より短いなら接触
{
// 接触しているなら赤くする
@Cd = {1, 0, 0};
}
■Circleノード
半径1の円を表示します。
■CopyToPointsノード(円の表示)
点に対してCircleノードをコピーして、円を表示します。
■Mergeノード
線分と円を合体します。
関連