Зацикливание на границе прямоугольника между двумя точками на прямоугольнике?

#c# #loops #line #intersection

#c# #циклы #строка #пересечение

Вопрос:

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

Мой вопрос в том, как я могу зациклить зеленую область (в основном, самую маленькую область) прямоугольника?

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

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

Комментарии:

1. На ваш вопрос невозможно ответить. Что вы подразумеваете под «зацикливанием»? Что можно зациклить в прямоугольнике?

2. Зацикливание на каждой целочисленной координате в выделенной области.

Ответ №1:

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

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

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

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

Комментарии:

1. Итак, допустим, я обхожу все точки на границе указанного прямоугольника и проверяю каждую точку с помощью this, вернет ли это true для каждой точки в зеленой области?

2. На вашем изображении нет зеленой области. Это вернет значение true только для точек на зеленой линии , как показано в вашем вопросе…

3. Извините, я неправильно сформулировал свой вопрос. Но да, это именно то, чего я хочу.

4. Также; Я полагаю, что ‘X.y’ на самом деле является ‘C.y’?

5. Ваш тест не применяется к случаям, когда p1 / p2 находятся на одной строке. Когда я тестировал, две точки находились на верхней линии прямоугольника, но возвращаемые действительные координаты начинались с p1 и заканчивались у правого верхнего края прямоугольника.

Ответ №2:

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

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

Например, Рэндольфа Франклина. Возвращает 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) amp;amp; (y < yp[j])) ||
         ((yp[j] <= y) amp;amp; (y < yp[i]))) amp;amp;
        (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i])   xp[i]))
      c = !c;
  }
  return c;
}
  

Ответ №3:

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

Таким образом, в основном, рисуя темноту на экране без тумана войны.

Комментарии:

1. Мне не нужна помощь с рисованием. Это для того, чтобы я мог узнать, что нужно скрыть .