Kaydet (Commit) 4c4300de authored tarafından Martin v. Löwis's avatar Martin v. Löwis

Reimplement turtle.circle using a polyline, to allow correct

filling of arcs. Also fixes #1514693.
üst bd39c03c
...@@ -344,7 +344,7 @@ class RawPen: ...@@ -344,7 +344,7 @@ class RawPen:
""" """
self.fill(0) self.fill(0)
def circle(self, radius, extent=None): def circle(self, radius, extent = None):
""" Draw a circle with given radius. """ Draw a circle with given radius.
The center is radius units left of the turtle; extent The center is radius units left of the turtle; extent
determines which part of the circle is drawn. If not given, determines which part of the circle is drawn. If not given,
...@@ -360,53 +360,19 @@ class RawPen: ...@@ -360,53 +360,19 @@ class RawPen:
>>> turtle.circle(120, 180) # half a circle >>> turtle.circle(120, 180) # half a circle
""" """
if extent is None: if extent is None:
extent = self._fullcircle extent = self._fullcircle
x0, y0 = self._position frac = abs(extent)/self._fullcircle
xc = x0 - radius * sin(self._angle * self._invradian) steps = 1+int(min(11+abs(radius)/6.0, 59.0)*frac)
yc = y0 - radius * cos(self._angle * self._invradian) w = 1.0 * extent / steps
if radius >= 0.0: w2 = 0.5 * w
start = self._angle - (self._fullcircle / 4.0) l = 2.0 * radius * sin(w2*self._invradian)
else: if radius < 0:
start = self._angle + (self._fullcircle / 4.0) l, w, w2 = -l, -w, -w2
extent = -extent self.left(w2)
if self._filling: for i in range(steps):
if abs(extent) >= self._fullcircle: self.forward(l)
item = self._canvas.create_oval(xc-radius, yc-radius, self.left(w)
xc+radius, yc+radius, self.right(w2)
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()
def heading(self): def heading(self):
""" Return the turtle's current heading. """ Return the turtle's current heading.
......
...@@ -19,6 +19,9 @@ Core and builtins ...@@ -19,6 +19,9 @@ Core and builtins
Library 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 - Bug #1514703: Only setup canvas window in turtle when the canvas
is created. is created.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment