Зацикливание границы прямоугольника между двумя точками на прямоугольнике? - PullRequest
0 голосов
/ 02 мая 2011

Вот так, это было большое.
Diagram
Итак, у меня есть две точки, на границе прямоугольника, а также на двух линиях, отлитых от начала координат. Для простоты расположение P1 / P2 произвольно.

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

Реализация: я хочу создать эффект поля зрения в игре, которую я создаю. Источником является игрок, который может находиться в любом месте текущего окна просмотра (прямоугольник). Направления линий смещены относительно направления, на которое смотрит игрок. Я намерен проследить все позиции в зеленой зоне от начала координат, проверяя наличие препятствий.

Я бы предпочел ответ на примере кода, любой язык, но желательно C #

Ответы [ 3 ]

1 голос
/ 02 мая 2011

Я думаю, что вы хотите что-то вроде этого:

Все координаты C со следующими критериями находятся на зеленой линии, которая является частью прямоугольника R:

(P1.y == P2.y)
?
(
    C.x >= P1.x && C.x <= P2.x
)
:
(
  (C.x >= P2.x && C.x <= R.right && C.y == P2.y) || 
  (C.x >= P1.x && C.x <= R.right && C.y == P1.y) || 
  (C.x == R.x && C.y <= P1.y && C.y >= P2.y)
)

Этопредполагается, что P1 будет ниже P2, если они не находятся на одной и той же строке, и что P1 будет раньше P2, если они находятся на одной и той же линии.

1 голос
/ 02 мая 2011

Если вы хотите узнать, какие объекты находятся в «зеленой зоне» ...

Если вы знаете размер прямоугольника, вы можете вычислить вершины интересующего вас многоугольника (origin, P1, P2 и видимые углы прямоугольника), затем вы можете перебрать свои объекты, чтобы найти, которые находятся внутри, используя точки при обнаружении многоугольника.

Рэндольф Франклин, например.Возвращает 1 для внутренних точек и 0 для внешних точек ...

int pnpoly(int npol, float *xp, float *yp, float x, float y)
{
  int i, j, c = 0;
  for (i = 0, j = npol-1; i < npol; j = i++) {
    if ((((yp[i] <= y) && (y < yp[j])) ||
         ((yp[j] <= y) && (y < yp[i]))) &&
        (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
      c = !c;
  }
  return c;
}
0 голосов
/ 02 мая 2011

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

...