2012-02-17 2 views
0

Надеюсь, кто-то может помочь мне здесь, меня попросили написать код для сценария Lua для игры. Во-первых, я не Lua Scripter, и я вызывающе не математик.Создайте функцию для генерации случайных точек в параллелограмме

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

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

Map coordinates and example parallelogram

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

Start_X = 122,226 Start_Y = -523,541

Height_X = 144,113 Height_Y = -536,169

Width_X = 128,089 Width_Y = -513,825

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

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

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

ответ

0

В псевдокоде

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) 

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

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

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

+0

Привет, Питер, Спасибо за ваш ответ, но я не был благословлен математической головой при рождении, и я смущен с первыми двумя строками. Вы говорите, что a и b могут быть либо 0, либо 1, или мне нужно создать случайное число между значениями координат, например, между start_x и height_x. Честно говоря, я не получаю 0 <= a <= 1 бит, не могли бы вы объяснить. – Ian

+0

Вам нужно сгенерировать случайное число для числа, которое может быть любым числом в диапазоне от 0.0 до 1.0 (например, 0.0 0.23.0.7 и т. Д.) Обычно для выполнения этой функции обычно используется стандартная функция, так как вы называете что-то вроде math.random() –

0

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

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

enter image description here

Основание образуют векторы v1 и v2. Четыре точки A,B,C,D представляют углы параллелограмма. Вы можете увидеть «координаты текстуры» (которые я буду называть u,v) точек в круглых скобках, например A - (0,0), D - . Каждая точка внутри параллелограмма будет иметь координаты в пределах (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  

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

Смежные вопросы