需要一些数学 - 投射坡度

时间:2012-01-23 23:34:22

标签: c# math windows-phone calculus

我有一个矩形。 它的高度(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上的加速度计。我正在计算在用户倾斜设备时动画矩形内部圆圈运动所需的目标。

5 个答案:

答案 0 :(得分:4)

离边界1个半径。

答案 1 :(得分: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.
}

答案 2 :(得分:1)

这很容易;不需要微积分。

您的圆的半径为R = CW/2 = CH/2,因为圆的直径为D = CW = CH.

为了让圆圈在切点处触摸矩形的垂直边缘,您必须将圆圈向右移动距离(W - (CX1 + CW/2))

同样,当您向下移动距离(H - (CY1 + CH/2))时,圆圈将在切点处触摸矩形的下边缘。

如果您在两个单独的翻译中执行此操作(例如,首先按给定金额向右移动,然后按给定金额向下翻,或反之亦然),您将看到圆圈将同时触及右侧垂直和切点处的底部水平边缘。

答案 3 :(得分:1)

当移动圆到达墙(边界)时,它将在圆上的四个点之一切线,称为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等。

在所有四个轨迹上,幅度最小的t为您提供切点。

答案 4 :(得分:0)

不确定它的计算方法......它不会仅仅是以下内容:

如果y> = 390,则它到达矩形的上边缘

如果x> = 490,则它到达矩形的右边缘

如果y <= 0,则它到达矩形的底边

如果x <= 0,则它到达矩形的左边缘