2010-04-18 35 views
1

我开发了一个基于Python的绘图程序,Whyteboard。我有用户可以在画布上创建新形状的工具,例如文本/图像/矩形/圆形/多边形。我还有一个Select工具,允许用户修改这些形状 - 例如,移动形状的位置,调整大小或编辑多边形的点的位置。将画布滚动为您正在移动的形状

我正在添加一个新功能,移动或调整画布边缘附近的点的位置会自动滚动画布。我认为在程序可用性方面这是一个好主意,并且在其他程序没有这个功能时会让我很烦恼。

我在编码方面取得了一些进展,下面是一些Python代码来演示我在做什么。这些功能展示一些形状如何计算它们的“边缘”:

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坐标来查看它是否接近边缘。

我遇到的问题有点棘手来描述 - 基本上,如果将形状移动到左侧,并停止移动它,如果将该形状放置在距画布50像素内,那么下一次去移动形状,说“好吧,这个形状接近尾声?”的代码?被触发,并且画布向左滚动,即使您将形状向右移动。

任何人都可以考虑如何制止这种情况吗?我创建了一个youtube video来演示这个问题。大约在0:54时,我将一个多边形移动到画布的左侧并将其放置在那里。下一次我移动它时,画布会向左滚动,即使我正在向右移动

我想添加的另一件事是,但我被卡住的是滚动获得动量,形状越长滚动?因此,使用大型画布时,您不会随着年龄移动一个形状,每次移动5像素,当需要覆盖2000像素的距离时。有什么建议吗?

谢谢大家 - 抱歉超长问题!

回答

1

这可能听起来有点象牙塔,我希望不会... 如果你不是基于一个位置而是一个矢量的算法,那么你可以注意到一个对象正在拖动的方向。一旦两个职位(您可以形成向量)可用,您的代码就会启动。然后,你应该能够找出用户是否正在移动朝向或远离边缘

一些更上的矢量:

由于你有斧,y坐标系统中,可以分解例如一个向量放入它的x,y部分。取任意两点(x1,y1)和(x2,y2),然后可以将矢量想象成连接两点的线。该线和例如x轴会形成一个角度,告诉您该线指向哪个方向。在你的情况下,你会逃避比较x2和x1。如果x2更大,则用户正在向右移动。是y2大于y1它是移动到顶部和其他方向的类似比较...

+0

任何建议如何做到这一点?我会诚实 - 我的数学技能是垃圾,我回想起我从OpenGL课程中学习的一些向量,并且我永远无法理解正在教授的内容。 – 2010-04-18 14:42:03

+0

感谢您的额外信息。希望当有人编辑他们的帖子时通知我! – 2010-04-18 19:33:10