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