私はこのようにします:
カーブをいくつかのチャンクに分割します
チャンクの数は、曲線の順序によって異なります。私は通常キュービックを使用しているので、経験的に8チャンクで十分であることがわかります(私の目的には)。
チャンクに最も近い点を計算する
したがって、各チャンクを線として扱い、線上のマウスの位置に最も近い点(最小垂直距離)を計算するだけです。チャンクごとにそれを計算し、最も近いものを覚えておいてください。
この後、どのチャンクに「最も近い」点が含まれるかがわかるので、線と垂直線の交点から前のステップでマウスの位置を通過するまでu=<0,1>
、チャンク線のどこに最も近い点があるかを示すパラメーターが必要です。t
チャンクラインの両方の端点の曲線パラメータを知っています(t0,t1
)。これから、これをt
行うだけで最も近い点を概算できます。
t = t0 + (t1-t0)*u
画像上t0=0.25
とt1=0.375
。これで十分な場合もありますが、より良い解決策が必要な場合は、次のように設定してください。
dt = (t1-t0)/4
t0 = t-dt
t1 = t+dt
Use the t0,t,t1
to compute 3 endpoints of 2 chunks and look for the closest point again. You can recursively do this few times as with each iteration you increase precision of the result
The perpendicular distance of point to a line is computed by computing intersection between the line and axis perpendicular to it going through the point in question. So if the line is defined by endpoints p0,p1
and the queried point (mouse) is q
then the axis in 2D will be:
dp=p1-p0 // line direction
dq=(dp.y,-dp.x) // axis direction is perpendicular to dp
dq/= |dq| // normalize
p(u) = p0+dp*u // point on line
p(v) = q +dq*v // point on axis
u = <0,1> // parameter on line
v = <-inf,+inf> // parameter on axis
And we want to know u,v
from
p0+dp*u = q +dq*v
これは、2Dの2つの線形方程式のシステムです。3Dではdq
、外積を利用してを取得する必要があり、システムには3つの方程式が含まれます。こののsytemの解決はあなたを与えるだろうu,v
どこu
チャンクに最も近い点があり、どこを教えてくれる|v|
の垂直距離そのものです。u
が範囲内にない場合は<0,1>
、線のより近い端点を最も近い点として使用する必要があることを忘れないでください。
システムは代数的に解くことができます(ただし、2Dの方程式には2つの解があるため、エッジケースに注意してください)。または逆行列を使用します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加