3

私は長方形を持っています。その高さ (RH) は 400 です。幅 (RW) は 500 です。

サークルを持っています。その高さ (CH) は 10 です。幅 (CW) は 10 です。開始位置 (CX1、CY1) は 20、20 です。

サークルが移動しました。その新しい場所 (CX2、CY2) は 30、35 です。

私の円が直線的に動き続けると仮定します。円の端が境界に達したときの円の位置は?

ここに画像の説明を入力

うまくいけば、再利用可能な数式を提供できます。

おそらく、このようなシグネチャを持つ C# メソッドでしょうか?

point GetDest(size itemSize, point itemPos1, point itemPos2, size boundarySize)

到着したら、その場所がどうなるかを計算する必要があります-まだそこにないことを知っています.

ありがとうございました。

PS: アプリケーションが Windows Phone の加速度計を監視しているため、これが必要です。ユーザーがデバイスを傾けているときに、長方形内の円の動きをアニメーション化するために必要なターゲットを計算しています。

4

5 に答える 5

4

境界から半径1(y / ies)離れています。

于 2012-01-23T23:36:18.507 に答える
2

答えは X=270 Y=395

最初に勾配 V を dy/dx =(y2-y1)/(x2-x1) として定義します。あなたの例では: (35-20)/(30-20)=1.5

直線方程式は y = V * (x-x1) + y1 です。水平位置 x に興味があります: y= CH/2 OR y= H-CH/2 だから (コードではなく、数学だけ)

if (y2-y1)<0:
 x=(CH/2 -y1)/V +x1     10 for your example. OR
if (y2-y1)>0:
 x=(H-CH/2 -y1)/V +x1   270 for your example
else (that is: y2==y1)
 the upper or lower lines were not hit.

if CH/2 <= x <= W-CH/2 the circle did hit the that upper or lower side: since V>0, we use x=270 and that is within CH/2 and W-CH/2. 

したがって、あなたの質問に対する答えは y=H-CH/2 = 395 , X=270 です

サイド ラインについても同様です。

(if (x2-x1)<0)
 y=(CH/2 -x1)*V +y1   
(if (x2-x1)>0)
 y=(W-CH/2 -x1)*V +y1 
else (that is: x2==x1)
 the side lines were not hit.

if CH/2 <= y <= H-CH/2 the circle did hit that side at that y.

ゼロで除算しないように、完全に水平または垂直の動きの些細なケースに注意してください。V または 1/V を計算する場合。円がまったく動かなかった場合にも対処します。

あなたが尋ねたので、実際のメソッドに簡単に変換できるはずのメタコードを次に示します。特殊なケースも扱います。入力は、例にリストしたすべての変数です。円は楕円ではなく円であるため、ここでは円のサイズに 1 つの記号のみを使用します。

method returning a pair of doubles    getzy(x1,y1,W,H,CH){

  if (y2!=y1){ // test for hitting upper or lower edges
    Vinverse=(x2-x1)/(y2-y1)
    if ((y2-y1)<0){
       xout=(CH/2 -y1)*Vinverse +x1 
       if (CH/2 <= y <= H-CH/2) {
           yout=CH/2
           return xout,yout
       }
     }
    if ((y2-y1)>0){
       xout=(H-CH/2 -y1)*Vinverse +x1 
       if (CH/2 <= y <= H-CH/2) {
           yout=H-CH/2
           return xout,yout
       }
    }
  }     
  // reaching here means upper or lower lines were not hit.
  if (x2!=x1){ // test for hitting upper or lower edges
    V=(y2-y1)/(x2-x1)
    if ((x2-x1)<0){
       yout=(CH/2 -x1)*V +y1 
       if (CH/2 <= x <= W-CH/2) {
           xout=CH/2
           return xout,yout
       }
     }
    if ((x2-x1)>0){
       yout=(H-CH/2 -x1)*V +y1 
       if (CH/2 <= x <= W-CH/2) {
           xout=H-CH/2
           return xout,yout
       }
    }
  }     
  // if you reach here that means the circle does not move...
   deal with using exceptions or some other way.
}
于 2012-01-24T00:33:48.507 に答える
1

移動する円が壁(境界)に到達すると、円の4つの点のいずれかで接し、N、S、E、およびWと呼ばれます。初期座標がわかります。

ポイントは、既知の勾配で直線的に移動します。m =(y2-y1)/(x2-x1); ここで、あなたの例では(x1、y1)-(20,20)および(x2、y2)=(30、35)です。

あなたの問題は、任意の壁に到達する最初の点N、S、E、またはWの軌道を見つけることです。軌道は傾きmの線になります。

これを行うには、線の方向ベクトルを点N、S、E、またはWに加算(または減算)し、tでスケーリングします。

たとえば、Nは(20、15)です。方向ベクトルは(x2-x1、y2-y1)=(10、15)です。次に、(20、15)+ t *(10、15)は異なるtで境界線にぶつかります。これらを解決することができます。たとえば、20 + t * 10 = 0、20 + t * 10=400などです。

4つの軌道すべてにわたって、大きさが最小のtは、接点を示します。

于 2012-01-24T00:15:22.633 に答える
1

それは簡単です; 計算は必要ありません。

R = CW/2 = CH/2円の直径は半径であるため、円には半径がありますD = CW = CH.

接点で円を長方形の垂直エッジに接触させるには、円を右に移動する必要があります。(W - (CX1 + CW/2))

同様に、円を距離だけ下に移動すると、接点で長方形の下端に円が接触します(H - (CY1 + CH/2))

これを 2 つの別々の翻訳で行うと (たとえば、最初に指定された量だけ右に移動し、次に指定された量だけ下に移動する、またはその逆)、円が右側の垂直エッジと下の水平エッジの両方に接触することがわかります。接点で。

于 2012-01-23T23:48:34.400 に答える
0

その微積分がわからない..それは単に次のようではないでしょうか:

y> = 390の場合、長方形の上端に到達しました

x> = 490の場合、長方形の右端に到達しました

y <= 0の場合、長方形の下端に到達します

x <= 0の場合、長方形の左端に到達しました

于 2012-01-23T23:39:07.317 に答える