получить вектор между 2 прямоугольниками - PullRequest
2 голосов
/ 29 сентября 2011

предположим, у меня есть 2 прямоугольника следующим образом:

  1. один окружает другой
  2. они имеют как минимум 2 стороны (3 или все 4 также возможны)

как мне получить вектор, который описывает смещение, необходимое для перемещения внутреннего прямоугольника вверх по не общей стороне (сторонам)?

Ответы [ 2 ]

3 голосов
/ 29 сентября 2011

Если я вас правильно понял, то вам следует выполнить следующие шаги:

  1. Найти угол, который разделяют обе стороны.
  2. Получите угол oposit из внутреннего и внешнего прямоугольников.
  3. vector = outerRecCorner - innerRecCorner
2 голосов
/ 29 сентября 2011

Это больше похоже на математику, чем на вопрос программирования:)

Предположим, у вас есть два прямоугольника: A (внутри) и B (снаружи).У них есть 4 угла:

Point [] GetCorners (Rectangle rect)
{
   Point [] corners = new Point[4];

   Point corners[0] = new Point(rect.X, rect.Y);
   Point corners[1] = new Point(rect.X + rect.Width, rect.Y);
   Point corners[2] = new Point(rect.X, rect.Y + rect.Height);
   Point corners[3] = new Point(rect.X + rect.Width + rect.Width, rect.Y);

   return corners;
}

Сначала найдите первый общий угол:

Point [] cornersListA = GetCorners(A);
Point [] cornersListB = GetCorners(B);

int sharedCornerIndex = 0;
for (int i=0; i<4; i++)
{
  if(cornersListA[i].X==cornersListB[i].X && cornersListA[i].Y==cornersListB[i].Y)
  {
     sharedCornerIndex = i;
     break;
  }
}

Затем найдите противоположный угол:

int oppositeCornerIndex = 0;
if(sharedCornerIndex ==0) oppositeCornerIndex = 3;
if(sharedCornerIndex ==3) oppositeCornerIndex = 0;
if(sharedCornerIndex ==1) oppositeCornerIndex = 2;
if(sharedCornerIndex ==2) oppositeCornerIndex = 1;

Наконец, получитевектор (я не проверял эту часть кода, но она должна работать):

Vector v = new Vector();
v.X = cornersListB[oppositeCornerIndex].X - cornersListA[oppositeCornerIndex].X;
v.Y = cornersListB[oppositeCornerIndex].Y - cornersListA[oppositeCornerIndex].Y;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...