2016-12-16 5 views
3

私はそれを必要としているので、記事またはこのトピックの周りのstackoverflow質問を見つけることができませんでした。Python - 中心(x、y)位置の周りにランダムな頂点を生成します。

私は2Dゲームを作っています。ランダムな小惑星を生成したいと思います。すべての小惑星は、私はtは今、私はランダムを追加したい私は、この形状を達成することができた場合のは、その周りの8つの頂点(頂点の数が可変である)

enter image description here

を言わせて生成したい、中央、X, Y位置を持っています要素では、ランダムな岩の形を作るために、中心からの変数とランダムな距離を考えてみましょう。

enter image description here

私はCartisian座標にポーラーと呼ばれるいくつかの三角法の概念を研究してきましたが、この目標にそれを適用する方法を見つけ出すことができませんでした。 Javascriptにはチュートリアルがありますが、Pythonで最初から作成しなければならないライブラリと関数が使用されています。

EDIT: だからあなたの答えは、これらが

1、私はすでに行う方法を知っているものです、中心付近の頂点を取得するための式を説明するに焦点を当てている)グラフィックスでポリゴンを描画ライブラリを使用しています 2)乱数を取得

あらかじめありがとうございました!

+0

の独自の同様のバージョンを書き込むことができますか? –

+2

私は正確に何を必要としているか説明しようとしました。それでは、あなたが何を理解していないのか教えてください。ありがとう –

+0

"私はPolar to Cartisian Coordinatesという三角法の概念を研究しましたが、この目標にどのように適用するかを理解できませんでした"というのは不明な部分です。私は極座標が何であるかを知っていますが、私はあなたがそれらで何をしたいか分かりません。 –

答えて

4

randomライブラリを使用すると、無作為に極座標でサンプリングすることができます。方向をサンプリングし、半径方向の距離をサンプリングします。次の例では、オリエンテーションが[0, 2*pi]に均一に分散され、半径が通常、ユーザー入力の平均と標準偏差で分布することを選択しました。あなたはポイントが特定の順序で巻くことにしたい場合は、私がサンプリングする時計​​回りまたは反時計回りを歩いてnumpy.linspaceのようなものを使用することになり

>>> generate_points(5.0, 7.0, 1.0, 0.1, 8) 
[[4.4478263120757875, 6.018608023032151], 
[4.407825651072504, 6.294849028359581], 
[5.0570272843718085, 6.17834681191539], 
[5.307793789416231, 6.156715230672773], 
[4.368508167422119, 7.712616387293795], 
[5.327972045495855, 5.917733119760926], 
[5.748935178651789, 6.437863588580371], 
[3.9312163910881033, 6.388093041756519]] 

それをコールする方法の一例として、

import random 
import math 

def generate_points(center_x, center_y, mean_radius, sigma_radius, num_points): 
    points = [] 
    for i in range(num_points): 
     theta = random.uniform(0, 2*math.pi) 
     radius = random.gauss(mean_radius, sigma_radius) 
     x = center_x + radius * math.cos(theta) 
     y = center_y + radius * math.sin(theta) 
     points.append([x,y]) 
    return points 

シータ。あなたがnumpyをインストールしたくない場合の例

import random 
import math 
import numpy as np 

def generate_points(center_x, center_y, mean_radius, sigma_radius, num_points): 
    points = [] 
    for theta in np.linspace(0, 2*math.pi - (2*math.pi/num_points), num_points): 
     radius = random.gauss(mean_radius, sigma_radius) 
     x = center_x + radius * math.cos(theta) 
     y = center_y + radius * math.sin(theta) 
     points.append([x,y]) 
    return points 

のためにあなたがここに正確に何を求めているlinspace

def linspace(start, stop, num_steps): 
    values = [] 
    delta = (stop - start)/num_steps 
    for i in range(num_steps): 
     values.append(start + i * delta) 
    return values 
+0

私たちがそれを微調整する必要があるかどうかを試してみてください。 –

+0

ありがとう、このリンクでは、私のコードとアルゴリズムを見ることができます。私は期待された結果を得ていません。おそらく私は正しいデータをどこかに置いていません。 http://imgur.com/a/2aWl7 –

+0

ありがとうございます!どのように私はそれらを順番に描かれるつもりなので、時計回りまたは反時計回りに生成することができますか?多分この行に:theta = random.uniform(0、2 * math.pi)現在のインデックスに基づいていくつかの制限を追加 –

0

ランダムに1つまたは2つまたは3つの隣接していない頂点を選択し、最も近い頂点までの距離以下のランダムな量だけ移動するのが簡単な方法です。

関連する問題