initial view scaling

This commit is contained in:
Josh Holtrop 2011-04-01 15:45:50 -04:00
parent 5678df7dbb
commit 6e2e19d1a5

View File

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