Вы можете использовать что-то вроде «текстурных координат», которые находятся в диапазоне [0,1]
, чтобы сгенерировать X, Y для точки внутри вашего параллелограмма. Затем вы можете сгенерировать случайные числа (u,v)
из диапазона [0,1]
и получить нужную вам случайную точку.
Чтобы объяснить это лучше, вот картинка:
База состоит из векторов 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
Обратите внимание, что это не будет работать с вашим текущим макетом - начало, ширина, высота. Как вы хотите обрабатывать вращение с этими параметрами?