2013-01-07 5 views
0

pygame을 사용하여 Koch Koch snow flake을 구현하고 싶습니다. 내가 http://en.wikipedia.org/wiki/File:KochFlake.svgpygame을 사용하여 Python으로 Koch 눈송이 구현

Figures of snowflakes

내 알고리즘에서 이미지의 다음과 같은 일련의 작업을하고

  1. 삼각형 3 분의 1의 포인트를 계산 삼각형을 그립니다 자사의 크기를 줄이고 가운데 선을 삭제하십시오.
  2. 외부 점을 찾으십시오 (두 번째 그림과 같이). 위의 이미지의 URE)
  3. 다각형을 사용하여 모든 엔드 포인트
  4. 의 목록을 확인 내가 두 번째 단계까지 수행 한

모든 점을 가입 할 수 있습니다. 그러나 세 번째 단계에서 어려움을 겪고 있습니다. 외부 지점을 찾는 방법을 알아낼 수 없으므로 어떤 조언을 드릴까요?

여기에 두 번째 정확히 단계

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() 
+0

게시물을 쉽게 읽을 수 있도록 몇 가지 수정을했지만, 포인트 2에 대한 코드를 작성하고 포인트 3에 대해 시도한 코드가 –

+0

감사합니다. Jon Clements – Hacker

+0

환영합니다. 그러나 질문을 편집하여 2 단계로 가려면 수행 한 작업과 3 단계에서 시도한 작업을 포함하십시오. –

답변

0

포인트를 계산하려면 벡터 방식을 사용합니다. 삼각형의 모서리가 a1, a2 및 a3 인 경우 a1에서 a2까지의 모든 점에 대한 방정식을 얻을 수 있습니다. 이 방정식을 사용하면 a1과 a2 사이의 점을 1/3과 2/3으로 찾을 수 있습니다. 이 두 점 사이의 거리가 생성하려는 새 삼각형의면을 제공합니다. 그 정보와 a1과 a2 사이의 1/2 점을 사용하여 세 번째 새로운 점의 좌표를 계산할 수 있습니다.

+0

미셸에게 감사드립니다. 그 세 번째를 찾는 데 어려움을 겪고 있습니다. 점 – Hacker

+0

주어진 점 a1과 a2를 연결하는 선은 p (i) = a1 + i * (a2 - a1)입니다. i = 1/3 및 i = 2/3의 경우 줄을 끊는 지점을 얻습니다. i = 1/2로하면 그 선의 중간을 가리키는 벡터를 얻을 수 있습니다. 벡터를 확장하면 세 번째 점을 얻을 수 있습니다. 트릭은 길이를 (1 + 새 삼각형의 높이)로 곱하는 것입니다. pythagoras 정리와 p (1/3)와 p (2/3) 사이의 거리를 사용하면 –

1

하지 대답하지만 더 큰 문제와 관련된 뭔가를 내 코드의 업입니다.

L-system 도형 (여기에서 그려야하는 것과 같은)은 기초적인 L 시스템 파서를 사용하는 것이 가장 좋습니다. Koch 눈송이의 경우 '공리'(초기 모양에 대한 설명은 D++D++D++입니다.) D은 "한 단위 씩 앞으로 이동"을 의미하고 "시계 방향으로 30도 회전"은 +을 나타냅니다. 지침은 커서와 같은 turtle에 의해 "해석"됩니다. 이것을하는 것은 그리 어렵지 않습니다.

일단 공리가 그려지면 D을 대체하는 세그먼트가 있습니다. koch 찌꺼기 들어, 그것은 "앞으로 단위 이동, 반 시계 방향으로 30도, 앞으로, 시계 방향으로 60, 앞으로, 반 시계 방향으로 30 앞으로"를 의미 D-D++D-D입니다. 그러면 초기 삼각형의 변을 대체하는 _/\_ 모양이 생깁니다. 하나의 "단위"는 모든 반복에서 원래 길이의 3 분의 1까지 줄입니다.

이제 원하는만큼 원하는만큼 반복하십시오. 이것은 나의 초기 파이썬 프로그램 중 하나 였고 나는 github에 대한 원저자/해석기를 가지고있다. 그것은 파이 게임을 사용하지 않지만 그 부분을 아주 쉽게 교환 할 수 있어야합니다.