initial view scaling
This commit is contained in:
parent
5678df7dbb
commit
6e2e19d1a5
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user