Нужна математика - Проектирование склона - PullRequest
3 голосов
/ 24 января 2012

У меня есть прямоугольник. Его высота (RH) составляет 400. Его ширина (RW) составляет 500.

У меня есть круг. Его высота (СН) составляет 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 ]

4 голосов
/ 24 января 2012

Это 1 радиус от границы (да).

2 голосов
/ 24 января 2012

Ответ 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.
}
1 голос
/ 24 января 2012

Когда движущийся круг достигнет стены (границы), он будет касаться одной из четырех точек круга, назовите их 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 по всем четырем траекториям дает вам точку касания.

1 голос
/ 24 января 2012

Это легко;исчисление не требуется.

Ваш круг имеет радиус R = CW/2 = CH/2, поскольку диаметр круга D = CW = CH.

Чтобы круг коснулся вертикального края прямоугольника в точке касанияВы должны переместить круг вправо на расстояние (W - (CX1 + CW/2))

Аналогично, круг коснется нижнего края прямоугольника в точке касания, когда вы переместите его на расстояние (H - (CY1 + CH/2)).

Если вы сделаете это в двух отдельных переводах (например, сначала справа от указанной суммы, затем вниз от указанной суммы или наоборот), вы увидите, что круг коснется правой рукивертикальные и нижние горизонтальные ребра в точках касания.

0 голосов
/ 24 января 2012

Не уверен, что его исчисление .. не будет ли это следующим:

если y> = 390, то оно достигнет верхнего края прямоугольника

если x> = 490, тоон достиг правого края прямоугольника

, если y <= 0, то он достиг нижнего края прямоугольника </p>

, если x <= 0, то он достиг левого края прямоугольника </p>

...