2011-12-30 2 views
0

에 포인트를 캔버스에 포인트를 매핑하는 함수를 작성합니다. 600 x 600 화면의 각 픽셀에 대해이 픽셀 (x, y)이 복소수로 만델 브로 세트에 있는지 여부를 플로팅합니다.어떻게이 파이 게임 화면에 파이썬에서 간단한 만델 브로 영상 효과를 쓰고 있어요 실제 비행기

문제가 I로 시작하는 것이 인 (0, 0)으로 설정하고 어쨌든 외부에 대부분이 (600, 600)를 통해 반복. 그래서 나는 확대하기 위해 스케일링 요소를 집어 넣었지만, 여전히 오른쪽 위 사분면 만 플로팅하고 있습니다. 내 음모가 언제나 0 + 0i를 중심으로 이루어 지도록하는 방법을 원합니다.

내가 뭘하고 싶은지 600px^2 캔버스를 y 축의 [-2, 2]에서 [-2, 2]까지의 실제 평면에 매핑하는 방법을 찾고 싶습니다. 중심선. 이는 예를 들어 복소수 0 + 0i가 화면에서 (300, 300)에 매핑된다는 것을 의미합니다. 이렇게하면 내 음모가 항상 중심에 놓이게됩니다.

답변

1

당신은 당신의 데이터에 대한 창을합니다. 600 픽셀 너비와 600 픽셀 높이라는 것을 알고 있습니다. 픽셀 좌표는 (0, 0) - (600, 600)입니다. 이렇게 할 수 있습니다 :

Point coordFromPixelLocation (pixelX, pixelY, pixelWidth, pixelHeight, minCoordX, maxCoordX, minCoordY, maxCoordY) 
{ 
    xPercent = pixelX/pixelWidth; 
    yPercent = pixelY/pixelHeight; 

    newX = minCoordX + (maxCoordX - minCoordX) * xPercent; 
    newY = minCoordY + (maxCoordY - minCoordY) * yPercent; 

    return Point (newX, newY); 
} 

pixelX 및 pixelY는 작은 범위로 변환하려는 픽셀 좌표입니다. pixelWidth 및 height는 윈도우의 폭과 높이입니다. min/maxCoordX/Y는 (-2, -2) ~ (2,2) 값입니다. 내가 좀 더 유연한 접근 방식을, 공정하게 임의의 매핑을 가능하게하는 코드를 작성하지만, 말 그대로 당신이 무엇을 물어해야 할 것 사실

+0

그러나 파이썬에서 조심해야한다! 사람들이 정수로 보낼 가능성이 매우 높으며 부서가 잔인하게 반올림됩니다. 이것을 시도하려면 명시 적으로 분자를 실수로 변환해야합니다. (xFraction이라고도 부르며, 실제로 백분율입니다). 또한 실제로 -2. + 1.993333 범위를 생성 할 것입니다. 이는 아마도 충분히 근접 할 것입니다. –

+0

'from __future__ import division'? – jrennie

1

, 당신은 시도 할 수 있습니다 : 다음

x = (float(pix_x) + 0.5 - 300.0)/150.0 

y의 동일. 이것은 온 스크린 쌍 중심 포인트로서 각 화소를 처리하지만, (+ -2, -2 +)에 대한 모서리를 화소 매핑한다. 이것은 뷰포트 전체를 복잡한 평면의 사각형 전체에 매핑하는 가장 "올바른"방법이지만,이 중 하나 단점은 0, 실제 라인 또는 상상의 선.

1
class Mapper: 
    def __init__(self, old_ul, old_lr, new_ul, new_lr): 
     self.old_ul = old_ul 
     self.old_lr = old_lr 
     self.new_ul = new_ul 
     self.new_lr = new_lr 
     self.old_diff = Point(old_lr.x - old_ul.x, 
           old_ul.y - old_lr.y) 
     self.new_diff = Point(new_lr.x - new_ul.x, 
           new_ul.y - new_lr.y) 

    def map(self, pt): 
     nx = (self.old_lr.x+pt.x) * (self.new_diff.x/self.old_diff.x) + self.new_ul.x 
     ny = (self.old_ul.y+pt.y) * (self.new_diff.y/self.old_diff.y) + self.new_lr.y 
     return Point(nx, ny) 
def main(args): 
    pixelToReal = Mapper(Point(0, 0), Point(600, 600), Point(-2, 2), Point(2, -2)) 
    realToPixel = Mapper(Point(-2, 2), Point(2, -2), Point(0, 0), Point(600, 600)) 
    print(pixelToReal.map(Point(300,300))) # prints 0.0,0.0 
    print(realToPixel.map(pixelToReal.map(Point(300,300)))) # prints 300,300 
    for x in range(0,630, 30): 
     for y in range(0,630, 30): 
      print(pixelToReal.map(Point(x,y))) 

Mapper의 생성자는 원래의 왼쪽 위 및 오른쪽 아래 모서리와 새로운 왼쪽 위 및 오른쪽 아래 모서리를 가져옵니다. Mapper.map()은 원래 공간에서 새로운 공간으로 점을 변환합니다.