29/09/2012-23:20
ここでgitリポジトリを作成しました:https :
//github.com/ArthurWulfWhite/Bezier-Distance/
そこからzipとしてソースファイルをダウンロードしてください。また、FlashDevelopを使用してコンパイルできるデモも含まれています。デモを使用するには、Flash Developでプロジェクトを開き、「テストプロジェクト」をクリックします。デモの実行中にLMBをクリックして、新しいベジェ曲線と新しい円をランダム化します。
幸運を!
zipリンクは見にくい-Ctrl + Fを使用してzipと入力するだけです。このソースは、数週間の調査とプログラミングを表しています。楽しんでいただければ幸いです。
ベジェを再帰的にセグメントに分割し、それらとの衝突をチェックする予定がある場合、100,100配列(グリッド)を作成し、各セグメントを4つの最も近い正方形に配置することをお勧めします。各フレームをセグメント化します。
プログラマーとしてもゲームクリエーターとしてもbox2dの恩恵を受けると思う。
古い答え:純粋な方法。
円の中心と曲線上の最も近い点との間の距離を確認することにより、円がベジェ曲線と衝突しているかどうかを実際に確認できます。
距離の式(一般的に)
説明:
ベジェ方程式:
q(t) = (1-t) * ((1-t) * start.(x,y) + t * control.(x,y)) + t*(t * control.(x,y) + (1 - t) * end.(x,y))
これは(いくつかの代数を使って)合計できます-読みやすくするために。(x、y)を省略します(1つの数字ではなく、まだポイントです)
q(t) = (start -2 * cont + end) t^2 + (-2 * start + 2 * control) + start
ポイント(x、y)からの距離は次のとおりです。
sqrt ((q(t).x - point.x)^2 + (q(t).y - point.y)^2)
ボールに最も近いベジェ上の点を見つけるには、微分がゼロに等しいすべての点(根)を導き出し、見つける必要があります。これは3次の多項式であるため、閉じた式を使用できますが、コンピューターの浮動小数点で表される分数の精度が十分でない可能性があるため、信頼できない可能性があります。ニュートンまたはそのような性質のものを使用する方がはるかに優れています。
根を見つけるために必要な導関数は次のとおりです。
仮定:a =開始b =制御c =終了d =中心点
トリッキーな部分は、このポイントを増やすことです。ドット積を使用する必要があります。
必要に応じて、このためのコードがあり、衝突があるかどうかと衝突の角度がある場合にブール値を返す関数の形式でここで共有できます。このような衝突エンジンの単純な実装では、たとえば、高速で移動するボールが2つの曲線の間に挟まるなどの問題が発生する可能性があります。
現時点では避けることをお勧めします。x軸とy軸の係数を合計して加算するだけです。
ニュートンのように選択できる信頼できる方法を使用して根を見つけ、ベジェの根点から円の中心までの距離を確認し、0 <= t <= 1で、ベジェの両端の距離を確認します(開始終了)円の中心に最も近い方に、衝突があるかどうかを知らせます。
半径が最小距離よりも小さい場合、衝突が発生しています。
角度は、円の中心とベジェ上の最も近い点の間の角度です。
そうは言っても、もしあなたが本当に衝突物理学でゲームを作りたいなら、私はあなたがただベジエを反復することを勧めます
q(t) = (1-t) * ((1-t) * start.(x,y) + t * control.(x,y)) + t*(t * control.(x,y) + (1 - t) * end.(x,y))
中央にある各ピースを十分に小さくなるまで再帰的に分割し、10ピクセル以下とすると、ボックスから大まかにベジェを構築し、物理学にBox2dを使用します。ゲームプレイをあまり向上させないタイムシンク。Box2dの使用は、過去の無数のプロジェクトで実証されています。