2012-01-23 41 views
3

我有一個矩形。 其高度(RH)爲400. 其寬度(RW)爲500.需要一些數學 - 預測斜率

我有圈。 它的高度(CH)是10. 它的寬度(CW)是10. 其起始位置(CX1,CY1)爲20,20

的圓圈移動。 其新位置(CX2,CY2)爲30,35。

假設我的圓形繼續沿直線移動。 邊界到達邊界時,圓的位置是多少?

enter image description here

希望你能提供可重複使用的公式。

也許一些像這樣的簽名的C#方法?

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

我需要計算一旦它到達時該位置會是什麼 - 知道它還沒有到達。

謝謝。 PS:我需要這個,因爲我的應用程序正在觀看我的Windows Phone上的加速度計。我正在計算當用戶傾斜他們的設備時,動畫矩形內圓的運動所需的目標。

+0

我不知道的手機,但在winforws應該是這樣的:如果它要正確會像'而(circle.Location.X <(this.Width - circle.Width)){/* DO STUFF * /};' –

+0

不,您正試圖測試它是否已經到達最終位置。我試圖在達到它之前計算最終位置。 –

+1

你知道兩個圓的半徑和它們中心的位置,所以使用直線方程:'y = m * x + b',沒有微積分,只有代數。 –

回答

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或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時。也處理圓圈根本不動的情況。

既然你現在問了,這裏的元代碼,你應該很容易能夠轉換爲一個真正的方法。它也處理特殊情況。輸入是您在示例中列出的所有變量。我在這裏只使用一個符號來表示圓的大小,因爲它是一個圓而不是橢圓。

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. 
} 
+0

你可以重構一個方法嗎? –

+0

@JerryNixon我加了C類元代碼,你應該可以使用它。 –

4

距邊界(y/ies)的距離爲1。

+0

我的答案依然存在。認爲正常。 –

+1

你的答案太神祕了,無法使用。抱歉。 –

+0

@ IgnacioVazquez-Abrams。你的回答是真實的,但它只是說它在邊緣。他想知道在哪邊? –

0

不知道其calculus..wouldn't它只是如下所示:

如果y> = 390然後將其到達矩形

的頂部邊緣,如果x> = 490然後到達矩形

的右邊緣如果y < = 0那麼到達矩形的底部邊緣

如果x < = 0那麼到達矩形的左邊緣

+0

不,這是計算以確定它何時到達。但它還沒有。我需要計算它到達位置之前的最終位置。 –

1

很簡單;不需要微積分。

你圓的半徑爲R = CW/2 = CH/2,因爲圓的直徑D = CW = CH.

爲了有圓觸及矩形的垂直邊緣的切點,你必須通過一個移動圈子向右距離(W - (CX1 + CW/2))

同樣地,當您向下移動距離(H - (CY1 + CH/2))時,該圓形將在切點處觸及該矩形的底部邊緣。

如果你在兩個單獨的翻譯中做到這一點(例如,先按給定的金額先向右,然後按給定的金額向下,反之亦然),你會看到該圓會觸及右手垂直和切點處的底部水平邊緣。

1

當運動圓到達牆(邊界)時,它將在圓上四點中的一點處相切,稱它們爲N,S,E和W.您知道它們的初始座標。 m =(y2-y1)/(x2-x1); m =(y1-y2)/在你的例子中(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等。

在所有四個軌跡上,幅值最小的t爲您提供切點。