Ответ 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.
}