2012-02-17 82 views
0

我希望有人能幫助我,我被要求爲一個遊戲編寫一些Lua腳本的代碼。首先,我不是Lua Scripter,我敢肯定沒有數學家。創建函數在平行四邊形中生成隨機點

我需要做的是在平行四邊形內生成隨機點,所以隨着時間的推移,整個平行四邊形變得充滿。我玩過腳本,並且在平行四邊形(矩形)上直線上下或90度時取得了一些成功。旋轉平行四邊形時出現問題。

正如您在圖像中看到的,事情會因地圖區域中心的座標而變得更糟,平行四邊形可以放置在地圖區域的任何位置。平行四邊形本身由3對座標定義,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

在我的腳本測試中,我已經將小數點減少到了.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) 

這應該做一個隨機座標爲x點,y中的平行四邊形內

的想法是,平行四邊形內的每個點都可以說指定多遠你從第一個邊(a)的方向開始,沿第二個邊(b)的方向走多遠。

例如,如果您有a = 0和b = 0,那麼您根本不會移動並仍處於開始位置。
如果你有a = 1,b = 0,那麼你移動到寬度。 如果你有a = 1,b = 1,那麼你移動到對面的角落。

+0

嗨,彼得,謝謝你的回覆,但我沒有在出生時得到一個數學頭的幸運,我對前兩行感到困惑。 你是說a和b可以是0或1,或者我需要在座標值之間生成一個像start_x和height_x之間的隨機數。誠實地說,我沒有得到0 <= a <= 1位,請你解釋一下。 – Ian 2012-02-18 10:27:25

+0

您需要爲一個可以是0.0到1.0範圍內的任意數字(例如0.0 0.23,0.7等)的隨機數產生一個隨機數。通常有一個標準函數爲您執行此操作,如math.random() – 2012-02-19 09:41:33

0

您可以使用類似於「紋理座標」(在[0,1]範圍內)的內容來爲平行四邊形內的點生成X,Y。然後,您可以從範圍[0,1]生成隨機數(u,v)並獲得您想要的隨機點。

爲了解釋這更好,這裏是一個圖:

enter image description here

基數由矢量v1v2形成。四點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。當爲隨機點r生成隨機座標u,v時,可以使用以下矢量公式獲取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  

注意,這不會影響您當前的佈局工作 - 開始,寬度,高度。你想如何處理這些參數的旋轉?