2012-02-17 4 views
0

誰かが私を助けてくれることを願っています。私はゲーム用のLuaスクリプト用のコードを書くように求められています。まず私はルアスクリプタではなく、私は反抗的に数学者ではない。ランダムな点を平行四辺形で生成する関数を作成する

私がする必要があるのは、平行四辺形内にランダムな点を生成することです。時間がたつにつれて平行四辺形全体が塗りつぶされます。私はスクリプティングで試したことがあり、平行四辺形(四角形)を上下左右に90度の角度で配置して成功しました。私の問題は、平行四辺形を回転させたときに起こります。

画像でわかるように、地図エリアの中央にある座標によって物事がさらに悪化し、平行四辺形は地図エリア内のどこにでも配置できます。平行四辺形自体は、start_XとStart_Y、Height_XとHeight_Y、そしてWidth_XとWidth_Yの3つの座標で定義されます。生成されるランダムな点は、位置または方向に関係なく、これらの座標の境界内にある必要があります。

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に減らしました。また、実際には、最終使用時に開始幅と高さは任意の向きにすることができる。

私はこの作業をするために何が必要なのか説明するために患者がいるのですか?私の数学はかなり基本的なので、優しくしてください。

お返事ありがとうございます。擬似コード

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) 

で イアン

答えて

0

これは、座標xにおけるランダム点を確認する必要があり、平行四辺形内でのy

アイデアは平行四辺形内の各ポイントはどこまで言って指定することができるということです開始から最初の辺(a)の方向に、そしてどのくらい遠くに2番目の辺(b)の方向に行くかを選択します。

たとえば、a = 0、b = 0の場合は、まったく移動せずにStartに移動します。
a = 1、b = 0の場合、幅に移動します。 a = 1、b = 1の場合、反対側の角に移動します。

+0

こんにちはピーター、あなたの返信をありがとうが、私は出生時に数学の頭に恵まれず、私は最初の2行と混同しています。 aとbは0または1のどちらでもかまいませんか、start_xとheight_xの間のような座標値の間に乱数を生成する必要がありますか?正直なところ私は0 <= a <= 1ビットを得られません。説明してください。 – Ian

+0

aの乱数を生成する必要があります。この乱数は、0.0から1.0の範囲の任意の数(たとえば0.0 0.23,0.7など)です。これを行うための標準関数は、math.random() –

0

[0,1]の範囲にある「テクスチャ座標」のようなものを使用して、平行四辺形内の点のX、Yを生成することができます。次に、範囲[0,1]からランダムな数字(u,v)を生成して、ランダムなポイントを得ることができます。

これよりよく説明するために、ここでの画像です:

enter image description here

ベースはベクトルv1v2によって形成されています。 4つの点A,B,C,Dは、平行四辺形の角を表します。たとえば、A(0,0)D(1,1)の場合、ポイントの「テクスチャ座標」(これはu,vと呼ぶ)を括弧内に表示します。平行四辺形内のすべての点は、(0,0)との座標を持ちます。たとえば、平行四辺形の中心に座標は(0.5,0.5)です。

ベクトルv1,v2を取得するには、ベクトル減算:v1 = B - 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  

注 - 起動、幅、高さを。これらのパラメータでローテーションをどのように処理したいですか?

関連する問題