#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. Мне не нужна помощь с рисованием. Это для того, чтобы я мог узнать, что нужно скрыть .