diff --git a/SketchWidget.py b/SketchWidget.py index cd711e7..84b92fc 100644 --- a/SketchWidget.py +++ b/SketchWidget.py @@ -11,6 +11,9 @@ from Circle import Circle class SketchWidget: def __init__(self, sketch): self.sketch = sketch + self.view_center = (0, 0) + self.view_width = 5.0 + self.size = (1, 1) try: # try double-buffered self.glconfig = gtk.gdkgl.Config(mode = (gtk.gdkgl.MODE_RGB | @@ -51,10 +54,11 @@ class SketchWidget: if not gldrawable.gl_begin(glcontext): return x, y, width, height = glarea.get_allocation() + self.size = (width, height) glViewport(0, 0, width, height) glMatrixMode(GL_PROJECTION) - glOrtho(-2, 2, -1.5, 1.5, 1.0, -1.0) + glOrtho(0, width, 0, height, 1.0, -1.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() @@ -75,9 +79,9 @@ class SketchWidget: for shape in self.sketch: if isinstance(shape, Line): - self.drawLine(shape, 0.03) + self.drawLine(shape, 1.5) elif isinstance(shape, Circle): - self.drawCircle(shape, 0.03) + self.drawCircle(shape, 1.5) if gldrawable.is_double_buffered(): gldrawable.swap_buffers() @@ -88,16 +92,26 @@ class SketchWidget: return True + def ptToScreenPt(self, pt): + return ((pt[0] - self.view_center[0]) / self.view_width * self.size[0] + + self.size[0] / 2, + (pt[1] - self.view_center[1]) / + (self.view_width * self.size[1] / self.size[0] + * self.size[1] + self.size[1] / 2)) + + def distToScreenDist(self, dist): + return dist / self.view_width * self.size[0] + def drawLine(self, shape, size): - pt0 = shape.getPt(0) - pt1 = shape.getPt(1) + pt0 = self.ptToScreenPt(shape.getPt(0)) + pt1 = self.ptToScreenPt(shape.getPt(1)) self.drawFilledLine(pt0[0], pt0[1], pt1[0], pt1[1], size) def drawCircle(self, shape, size): steps = 16 step = 2 * math.pi / steps - center = shape.getCenter() - rad = shape.getRadius() + center = self.ptToScreenPt(shape.getCenter()) + rad = self.distToScreenDist(shape.getRadius()) for i in range(steps + 1): angle = i * step next_angle = (i + 1) * step