Создать функцию для генерации случайных точек в параллелограмме - PullRequest
0 голосов
/ 18 февраля 2012

Я надеюсь, что кто-то может помочь мне здесь, меня попросили написать код для Lua-скрипта для игры.Во-первых, я не Lua Scripter, и я демонстративно не математик.

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

Как вы можете видеть на изображении, все становится еще хуже благодаря координатам, исходящим из центра области карты, и параллелограмм можно расположить в любом месте карты.площадь.Сам параллелограмм определяется 3 парами координат: start_X и Start_Y, Height_X и Height_Y и, наконец, Width_X и Width_Y.Произведенные случайные точки должны находиться в пределах этих координат независимо от положения или ориентации.

Координаты карты и пример параллелограмма

Примером координат являются ...

Start_X = 122,226 Start_Y = -523,541

Высота_X = 144,113 Высота_Y = -536,169

Width_X = 128,089 Width_Y = -513,825

В моем тестировании сценария iудалили десятичные дроби до .5, так как любое меньшее, кажется, не влияет на конечный результат.Кроме того, в реальном выражении начальная ширина и высота могут быть в любой ориентации при окончательном использовании.

Есть ли кто-нибудь с пациентами, чтобы объяснить, что мне нужно сделать, чтобы это работало, моя математика довольно простаПожалуйста, будьте нежны.

Спасибо за чтение и в ожидании ответа.Ian

Ответы [ 2 ]

0 голосов
/ 18 февраля 2012

Вы можете использовать что-то вроде «текстурных координат», которые находятся в диапазоне [0,1], чтобы сгенерировать X, Y для точки внутри вашего параллелограмма. Затем вы можете сгенерировать случайные числа (u,v) из диапазона [0,1] и получить нужную вам случайную точку.

Чтобы объяснить это лучше, вот картинка:

enter image description here

База состоит из векторов v1 и v2. Четыре точки A,B,C,D представляют углы параллелограмма. Вы можете увидеть «текстурные координаты» (которые я назову u,v) точек в скобках, например A это (0,0), D это (1,1). Каждая точка внутри параллелограмма будет иметь координаты в пределах (0,0) и (1,1), например, центр параллелограмма имеет координаты (0.5,0.5).

Чтобы получить векторы v1,v2, вам нужно сделать векторное вычитание: v1 = B - A, v2 = C - A. Когда вы генерируете случайные координаты u,v для случайной точки r, вы можете вернуть X, Y, используя эту векторную формулу: r = A + u*v1 + v*v2.

В Lua вы можете сделать это следующим образом:

 -- let's say that you have A,B,C,D defined as the four corners as {x=...,y=...}
 -- (actually, you do not need D, as it is D=v1+v2)

 -- returns the vector a+b
 function add(a,b)
   return {x = a.x + b.x, y = a.y + b.y} end
 end
 -- returns the vector a-b
 function sub(a,b)
   return {x = a.x - b.x, y = a.y - b.y} end
 end
 -- returns the vector v1*u + v2*v
 function combine(v1,u,v2,v)
   return {x = v1.x*u + v2.x*v, y = v1.y*u + v2.y*v}
 end
 -- returns a random point in parallelogram defined by 2 vectors and start
 function randomPoint(s,v1,v2)
   local u,v = math.random(), math.random() -- these are in range [0,1]
   return add(s, combine(v1,u,v2,v))
 end

 v1 = sub(B,A) -- your basis vectors v1, v2
 v2 = sub(C,A)
 r = randomPoint(A,v1,v2) -- this will be in your parallelogram defined by A,B,C     

Обратите внимание, что это не будет работать с вашим текущим макетом - начало, ширина, высота. Как вы хотите обрабатывать вращение с этими параметрами?

0 голосов
/ 18 февраля 2012

в псевдокоде

a= random number with 0<=a<=1
b= random number with 0<=b<=1
x= Start_X + a*(Width_X-Start_X) + b*(Height_X-Start_X)
y= Start_Y + a*(Width_Y-Start_Y) + b*(Height_Y-Start_Y)

это должно сделать случайную точку в координатах x, y внутри параллелограмма

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

Например, если у вас есть a = 0 и b = 0, вы вообще не двигаетесь и все еще находитесь на старте.
Если у вас есть a = 1 и b = 0, то вы переходите к ширине. Если у вас есть a = 1 и b = 1, то вы двигаетесь в противоположный угол.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...