2010-04-18 2 views
1

나는 파이썬 기반 드로잉 프로그램 인 Whyteboard을 개발합니다. 텍스트/이미지/사각형/원/다각형과 같은 캔버스에 새로운 도형을 만들 수있는 도구가 있습니다. 또한 사용자가 도형의 위치 이동, 크기 변경 또는 다각형 점의 위치 편집과 같이 이러한 도형을 수정할 수있는 선택 도구가 있습니다.이동하려는 모양으로 캔버스를 스크롤하면 모서리에 접근합니다.

캔버스 가장자리 근처의 점을 이동하거나 크기를 조정하면 캔버스가 자동으로 스크롤되는 새로운 기능이 추가됩니다. 나는 이것이 프로그램 유용성 측면에서 좋은 아이디어라고 생각하며, 다른 프로그램에이 기능이 없을 때 나를 귀찮게한다.

나는 이것을 코딩하는데 좋은 진전을 보았다. 아래는 내가하고있는 것을 보여주기위한 파이썬 코드이다. 어떤 형태가 그들의 "가장자리"를 계산하는 방법이 기능을 보여줍니다

def find_edges(self): 
    """A line.""" 
    self.edges = {EDGE_TOP: min(self.y, self.y2), EDGE_RIGHT: max(self.x, self.x2), 
        EDGE_BOTTOM: max(self.y, self.y2), EDGE_LEFT: min(self. x, self.x2)} 


def find_edges(self): 
    """An image""" 
    self.edges = {EDGE_TOP: self.y, EDGE_RIGHT: self.x + self.image.GetWidth(), 
        EDGE_BOTTOM: self.y + self.image.GetWidth(), EDGE_LEFT: self.x} 


def find_edges(self): 
    """Get the bounding rectangle for the polygon""" 
    xmin = min(x for x, y in self.points) 
    ymin = min(y for x, y in self.points) 
    xmax = max(x for x, y in self.points) 
    ymax = max(y for x, y in self.points) 
    self.edges = {EDGE_TOP: ymin, EDGE_RIGHT: xmax, EDGE_BOTTOM: ymax, EDGE_LEFT: xmin} 

그리고 여기에 내가 스크롤을 구현하기 위해 지금까지 가지고있는 코드의 모양은 가장자리에 가까워 때

def check_canvas_scroll(self, x, y, moving=False): 
    """ 
    We check that the x/y coords are within 50px from the edge of the canvas 
    and scroll the canvas accordingly. If the shape is being moved, we need 
    to check specific edges of the shape (e.g. left/right side of rectangle) 
    """ 

    size = self.board.GetClientSizeTuple() # visible area of the canvas 
    if not self.board.area > size: # canvas is too small to need to scroll 
     return 

    start = self.board.GetViewStart() # user's starting "viewport" 
    scroll = (-1, -1) # -1 means no change 

    if moving: 
     if self.shape.edges[EDGE_RIGHT] > start[0] + size[0] - 50: 
      scroll = (start[0] + 5, -1) 
     if self.shape.edges[EDGE_BOTTOM] > start[1] + size[1] - 50: 
      scroll = (-1, start[1] + 5) 
     # snip others 

    else: 
     if x > start[0] + size[0] - 50: 
      scroll = (start[0] + 5, -1) 
     if y > start[1] + size[1] - 50: 
      scroll = (-1, start[1] + 5) 
     # snip others 

    self.board.Scroll(*scroll) 

이 코드는 실제로 꽤 작동을 잘. 모양을 움직이는 경우 캔버스 가장자리에 가까워 질 때를 계산하려면 가장자리를 알아야합니다. 단일 점의 크기를 조정하면 해당 점의 x/y 좌표를 사용하여 가장자리에 가까운 지 확인합니다.

문제는 설명하기가 약간 까다 롭습니다. 기본적으로 셰이프를 왼쪽으로 이동하고 이동을 중지하면 캔버스에서 50px 내에 셰이프를 배치하면 다음 번에 "ok,이 모양이 마지막에 가깝습니까?"라고 말하는 코드를 이동하십시오. 모양이 오른쪽으로 이동하더라도 캔버스가 왼쪽으로 스크롤됩니다.

아무에게도이 문제를 어떻게 방지 할 수 있습니까? 문제를 설명하기 위해 youtube video을 만들었습니다. 약 0:54에, 나는 캔버스의 왼쪽으로 폴리곤을 이동시키고 거기에 놓습니다. 다음에 이동할 때 캔버스가 왼쪽으로 움직입니다. 오른쪽으로 옮길지라도 캔버스는 왼쪽으로 스크롤합니다.

내가 추가하고 싶은 또 다른 점은 스크롤이 운동량이 길어질수록 더 길어집니다. 스크롤? 따라서 큰 캔버스를 사용하면 한 번에 5 픽셀 씩 이동하는 2000px 거리를 처리해야 할 때 셰이프를 움직이지 않을 것입니다. 거기에 어떤 제안?

감사합니다. 매우 긴 질문에 사과드립니다.

답변

1

이것은 아이보리 타워에서 조금 들릴지 모르지만 나는 희망이 없다. 알고리즘을 위치가 아니라 벡터에 배치하면 객체가 어느 방향으로 드래그하고 있는지 알 수 있습니다. 두 가지 직책 (벡터를 구성 할 수 있음)을 사용할 수있게되면 코드가 시작됩니다. 그런 다음 사용자가 벡터에 좀 더 가장자리

에서 멀리쪽으로 이동하거나 여부를 알아낼 수있을 것입니다 : 당신이 도끼를 가지고 있기 때문에

것은, Y 좌표 시스템, 당신은 아래로 같은 깰 수 x, y 부분에 벡터. 두 점 (x1, y1)과 (x2, y2)를 취하면 두 점을 연결하는 선으로 벡터를 상상할 수 있습니다. 그 라인 및 예. x 축은 그 선이 가리키는 방향을 알려주는 각도를 형성합니다. 귀하의 경우에는 x2와 x1을 비교할 수 있습니다. x2가 커지면 사용자가 오른쪽으로 이동합니다. y2가 y1보다 크면 다른 방향의 상단 및 비슷한 비교로 이동합니다 ...

+0

어떻게해야합니까?나는 솔직하게 말할 것입니다. 수학 기술은 쓰레기입니다. 나는 OpenGL 과정에서 다소 벡터를 생각해 냈습니다. 나는 배웠던 것을 돌아볼 수 없었습니다. 추가 정보에 대해 –

+0

감사합니다. 누군가가 그들의 포스트를 편집했을 때 소원이 나를 알렸다! –

관련 문제