0

pygameを使ってKochKochスノーフレーク実装したいと思います。

私はhttp://en.wikipedia.org/wiki/File:KochFlake.svgからの次の一連の画像を使用しています

雪片の図

私のアルゴリズムはこれです

  1. 三角形を描く
  2. サイズの3分の1の三角形の点を計算し、中心線を削除します
  3. 外側のポイントを見つけます(上の画像の2番目の図に示されているように)
  4. すべてのエンドポイントのリストを作成します
  5. ポリゴンを使用してすべてのポイントを結合

私は2番目のステップまで完了しました。しかし、私は3番目のステップで苦労しています-外側のポイントを見つける方法がわからないので-ヒントはありますか?

これが2番目のステップまでの私のコードです

import pygame

from pygame.locals import *


pygame.init()

fpsClock = pygame.time.Clock()


screen = pygame.display.set_mode((600,600))

pygame.display.set_caption('Koch snowflake')


white = (255, 255, 255)

black = (0, 0 ,0)



def midpoints(pt1 , pt2):
   (x1, y1) = pt1
   (x2, y2) = pt2
   return ((x1+x2)/2, (y1 + y2)/2)

def midline(pt1, pt2):
(x1, y1) = pt1
(x2, y2) = pt2
return [(x1 + float(x2-x1)/3.0,y1 + float(y2-y1)/3.0), (x1 + float(x2-x1)*2.0/3,y1+ float(y2-y1)*2.0/3)]

def drawline(pt1, pt2):
   pygame.draw.line(screen, white, pt1, pt2)

def clearline(pt1,pt2):
   pygame.draw.line(screen, black, pt1, pt2, 4)

a = [(150,150), (450,150), (300,410), (150,150)]



pygame.draw.polygon(screen, white ,(a[0], a[1], a[2]), 1)
i = 0
order = 0
length = len(a)
while order < length - 1:
   pts = midline(a[i], a[i+1])
   clearline(pts[0], pts[1])
   a = a[:i+1] + pts + a[i+1:]
   print a
   if order < 3:
      i = i+3
   order = order + 1
#pygame.draw.polygon(screen, white ,Tup, 1)



pygame.display.update()
4

2 に答える 2

1

正確には答えではありませんが、より大きな質問に関連するものです。

Lシステムフラクタル(ここで描画しようとしているものなど)は、基本的なLシステムパーサーを使用して行うのが最適です。コッホスノーフレークの場合、「公理」(初期形状の説明は次のようなものです)D++D++D++D「1単位前進」と+「時計回りに30度回転」の略です。指示は、カメのようなカーソルによって「解釈」されます。これを行うのはそれほど難しいことではありません。

公理が描かれると、を置き換えるセグメントができますD。コッホフレークの場合、D-D++D-D「1ユニット前方に移動し、反時計回りに30度回転し、前方に、時計回りに60度、前方に、反時計回りに30度前方に回転する」という意味です。これにより_/\_、最初の三角形の辺を置き換える形状が得られます。1つの「ユニット」は、反復ごとに元の長さの3分の1に減少します。

さて、これを何度でも繰り返して、探しています。これは私の最も初期のPythonプログラムの1つであり、githubに大まかなパーサー/インタープリターがあります。pygameは使用しませんが、その部分を非常に簡単に交換できるはずです。

于 2013-01-07T11:24:48.387 に答える
0

ポイントを計算するには、ベクトルアプローチを使用します。三角形の角がa1、a2、a3の場合、線a1からa2上のすべての点の方程式を得ることができます。その方程式を使用して、a1とa2の間の1/3と2/3の点を見つけることができます。これらのポイント間の距離により、作成する新しい三角形の辺がわかります。その情報と、a1とa2の間の1/2のポイントを使用して、3番目の新しいポイントの座標を計算できます。

于 2013-01-07T11:41:12.737 に答える