From 5547ac115e1a4e7c5b294e10c29550e8024990ae Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Fri, 30 Mar 2012 20:50:49 +0200 Subject: host/simu/inter: add draw_oval using a smooth polygon --- host/simu/inter/drawable.py | 23 ++++++++++++++++++++++- host/simu/inter/test/test_drawable.py | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/host/simu/inter/drawable.py b/host/simu/inter/drawable.py index af7c62a2..849eddd3 100644 --- a/host/simu/inter/drawable.py +++ b/host/simu/inter/drawable.py @@ -22,7 +22,7 @@ # # }}} """Drawable and DrawableCanvas.""" -from math import sqrt, degrees +from math import sqrt, degrees, pi, cos, sin import simu.utils.trans_matrix import Tkinter @@ -69,6 +69,22 @@ class Drawable: r = self.trans_apply_distance (r) return self.__onto.__draw_circle (p, r, **kw) + def __draw_oval (self, p, rx, ry, **kw): + v = [ ] + n = 8 + sx = rx / cos (pi / n) + sy = ry / cos (pi / n) + for i in xrange (0, n): + a = i * 2 * pi / n + v.append ((p[0] + cos (a) * sx, p[1] + sin (a) * sy)) + kw = kw.copy () + if 'fill' not in kw: + kw['fill'] = '' + if 'outline' not in kw: + kw['outline'] = 'black' + kw['smooth'] = True + return self.__draw_polygon (*v, **kw) + def __draw_arc (self, p, r, **kw): p = self.trans_apply (p) r = self.trans_apply_distance (r) @@ -94,6 +110,11 @@ class Drawable: """Draw a circle of the given radius centered on p.""" self.__items.append (self.__draw_circle (p, r, **kw)) + def draw_oval (self, p, rx, ry, **kw): + """Draw an oval of the given radii (rx along x, ry along y), centered + on p.""" + self.__items.append (self.__draw_oval (p, rx, ry, **kw)) + def draw_arc (self, p, r, **kw): """Draw a arc of the given radius centered on p.""" self.__items.append (self.__draw_arc (p, r, **kw)) diff --git a/host/simu/inter/test/test_drawable.py b/host/simu/inter/test/test_drawable.py index a9c1bfef..9aa56ef1 100644 --- a/host/simu/inter/test/test_drawable.py +++ b/host/simu/inter/test/test_drawable.py @@ -34,6 +34,7 @@ class Test (Drawable): self.draw_line ((20, 20), (25, 25), (80, 0), (0, 80), fill = 'green') self.draw_line ((20, 20), (25, 25), (80, 0), (0, 80), smooth = True) self.draw_circle ((40, -40), 10) + self.draw_oval ((40, -40), 10, 5) self.draw_arc ((-40, 0), 20, start = pi / 4, extent = pi / 2) class App (DrawableCanvas): -- cgit v1.2.3