]> granicus.if.org Git - python/commitdiff
Reimplement turtle.circle using a polyline, to allow correct
authorMartin v. Löwis <martin@v.loewis.de>
Mon, 3 Jul 2006 10:05:30 +0000 (10:05 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Mon, 3 Jul 2006 10:05:30 +0000 (10:05 +0000)
filling of arcs. Also fixes #1514693.

Lib/lib-tk/turtle.py
Misc/NEWS

index b5bad592ab5a9d2431e9cc3fd33c1890d78c7c96..cc5ffa104952e8424c8eb34e64fbcba18c70ed8c 100644 (file)
@@ -344,7 +344,7 @@ class RawPen:
         """
         self.fill(0)
 
-    def circle(self, radius, extent=None):
+    def circle(self, radius, extent = None):
         """ Draw a circle with given radius.
         The center is radius units left of the turtle; extent
         determines which part of the circle is drawn. If not given,
@@ -360,53 +360,19 @@ class RawPen:
         >>> turtle.circle(120, 180)  # half a circle
         """
         if extent is None:
-            extent = self._fullcircle
-        x0, y0 = self._position
-        xc = x0 - radius * sin(self._angle * self._invradian)
-        yc = y0 - radius * cos(self._angle * self._invradian)
-        if radius >= 0.0:
-            start = self._angle - (self._fullcircle / 4.0)
-        else:
-            start = self._angle + (self._fullcircle / 4.0)
-            extent = -extent
-        if self._filling:
-            if abs(extent) >= self._fullcircle:
-                item = self._canvas.create_oval(xc-radius, yc-radius,
-                                                xc+radius, yc+radius,
-                                                width=self._width,
-                                                outline="")
-                self._tofill.append(item)
-            item = self._canvas.create_arc(xc-radius, yc-radius,
-                                           xc+radius, yc+radius,
-                                           style="chord",
-                                           start=start,
-                                           extent=extent,
-                                           width=self._width,
-                                           outline="")
-            self._tofill.append(item)
-        if self._drawing:
-            if abs(extent) >= self._fullcircle:
-                item = self._canvas.create_oval(xc-radius, yc-radius,
-                                                xc+radius, yc+radius,
-                                                width=self._width,
-                                                outline=self._color)
-                self._items.append(item)
-            item = self._canvas.create_arc(xc-radius, yc-radius,
-                                           xc+radius, yc+radius,
-                                           style="arc",
-                                           start=start,
-                                           extent=extent,
-                                           width=self._width,
-                                           outline=self._color)
-            self._items.append(item)
-        angle = start + extent
-        x1 = xc + abs(radius) * cos(angle * self._invradian)
-        y1 = yc - abs(radius) * sin(angle * self._invradian)
-        self._angle = (self._angle + extent) % self._fullcircle
-        self._position = x1, y1
-        if self._filling:
-            self._path.append(self._position)
-        self._draw_turtle()
+            extent = self._fullcircle 
+        frac = abs(extent)/self._fullcircle 
+        steps = 1+int(min(11+abs(radius)/6.0, 59.0)*frac)
+        w = 1.0 * extent / steps
+        w2 = 0.5 * w
+        l = 2.0 * radius * sin(w2*self._invradian) 
+        if radius < 0:
+            l, w, w2 = -l, -w, -w2
+        self.left(w2)
+        for i in range(steps):
+            self.forward(l)
+            self.left(w)
+        self.right(w2)
 
     def heading(self):
         """ Return the turtle's current heading.
index 63e4b75e190b1d7349a832d2fb9430b54e3be7d1..764f7e0db96cb6c12ca5e9959f068fb94b75ec01 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -19,6 +19,9 @@ Core and builtins
 Library
 -------
 
+- Reimplement turtle.circle using a polyline, to allow correct
+  filling of arcs. Also fixes #1514693.
+
 - Bug #1514703: Only setup canvas window in turtle when the canvas
   is created.