generated at
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ノード
線分と円を合体します。


関連