« GoogleSketcUpのカメラ設定をComicStudioに | メイン | SketchUpのシーンをComicStudioに »

●ランダム生成した頂点を結んで三角ポリゴンに

2010年4月 7日    

後々のために計算で生成した頂点座標から
三角ポリゴンで分割した形状を作るためのテストプログラムを書き捨て

#ランダム生成した頂点を結んで三角ポリゴンに
import random #ランダム生成のモジュール
import math

#交差判定
def closs_line(pos_1_1, pos_1_2, pos_2_1, pos_2_2):
#交差を判定するベクトルを求める
vec_0 = [pos_1_2[0] - pos_1_1[0], pos_1_2[1] - pos_1_1[1]]
vec_1 = [pos_2_1[0] - pos_1_1[0], pos_2_1[1] - pos_1_1[1]]
vec_2 = [pos_2_2[0] - pos_1_1[0], pos_2_2[1] - pos_1_1[1]]
#外積計算
normal_1 = vec_0[0]* vec_1[1]-vec_0[1]* vec_1[0]
normal_2 = vec_0[0]* vec_2[1]-vec_0[1]* vec_2[0]
#法線の方向が異なる場合延長線とは交差している
if normal_1* normal_2 < 0:
vec_4 = [pos_2_2[0] - pos_2_1[0], pos_2_2[1] - pos_2_1[1]]
vec_5 = [pos_1_1[0] - pos_2_1[0], pos_1_1[1] - pos_2_1[1]]
vec_6 = [pos_1_2[0] - pos_2_1[0], pos_1_2[1] - pos_2_1[1]]
#外積計算
normal_1 = vec_4[0]* vec_5[1]-vec_4[1]* vec_5[0]
normal_2 = vec_4[0]* vec_6[1]-vec_4[1]* vec_6[0]
if normal_1* normal_2 < 0:return 1
else:return 0
else:return 0

#点の座標を生成
vec2_point_list = []
for i in xrange(50):
pos_x = random.uniform(-100,100)
pos_y = random.uniform(-100,100)
vec2_point_list.append([pos_x, pos_y])
#print vec2_point_list
###稜線情報生成
##点列の頭から頂点同士の接続を調べる
edge_dic = {}#頂点番号:[接続先の頂点番号リスト] の辞書
for i in xrange(len(vec2_point_list)):
edge_i = []
pos_1_1 = vec2_point_list[i]#基準の頂点座標
#for j in xrange(i+1,len(vec2_point_list)):
for j in xrange(len(vec2_point_list)):
if i == j :continue
pos_1_2 = vec2_point_list[j]#接続確認先の頂点座標
#引く線分の長さ
length_1 = math.hypot(pos_1_2[0]- pos_1_1[0],pos_1_2[1]- pos_1_1[1])
closs_flag = 0
for k in xrange(i):
if closs_flag != 0 :continue
closs_list = []
edge_k_list = edge_dic[k]
edge_k_list2 = edge_k_list
pos_2_1 = vec2_point_list[k] #交差する線分の頂点1
for l in edge_k_list:
if l == i or l == j : continue
if l in closs_list: continue
pos_2_2 = vec2_point_list[l]#交差する線分の頂点2
#これまで生成された線分と新しく生成する線分の交差を判定
#交差した線がある場合 短い線を残し長い方の稜線を削除
closs = closs_line(pos_1_1, pos_1_2, pos_2_1, pos_2_2)
if closs == 1:
length_2 = math.hypot(pos_2_2[0]- pos_2_1[0],pos_2_2[1]- pos_2_1[1])
if length_1 closs_list.append(l)
#print "del: %i => %i(closs %i %i)" % (k,l,i,j)
else:closs_flag += 1
if closs_flag == 0:
#交差方向のエッジをリストから取り除く
for m in closs_list:edge_k_list2.remove(m)
edge_dic[k] = edge_k_list2
if closs_flag == 0:
edge_i.append(j)
edge_i = list(set(edge_i))
edge_dic[i] = edge_i

#Shadeのポリゴンメッシュ生成
xshade.scene().begin_creating()
xshade.scene().begin_polygon_mesh(None)
for i in vec2_point_list:
pos = [i[0], 0, i[1]]
xshade.scene().append_polygon_mesh_vertex(pos)
for i in xrange(len(edge_dic)):
if edge_dic[i]:
for j in edge_dic[i]:
xshade.scene().append_polygon_mesh_edge(i, j)
xshade.scene().end_polygon_mesh()
xshade.scene().end_creating()


投稿者 Yukimi` : 2010年4月 7日 01:50