- XLogo library of procedures
This library of procedures draws arcs in various manners. They are used by programs throughout this site including many of the shape procedures . They can be copied and pasted into the Editor window as usual.
I prefer not to use the Arc primitive directly. It is difficult to 'read', uses three arguments, often requires the Minus primitive, and uses absolute headings which are not very logo like. Instead use rArc (relarive Arc).
Download complete library of arc procedures .
rArc
Draw a clockwise arc relative to the turtles heading. The turtle turns to face the end of the arc. Both
:Angle
and
:Radius
arguments are positive. Putting the angle first makes turtle movements easier to follow.
Used in many programs instead of primitive Arc.
To
rArc
:
Angle
:
Radius
# clockwise arc drawn relative to turtle heading
Arc
:
Radius
Heading
:
Angle
+Heading Right
:
Angle
End
Arch
The Arch procedure draws a symmetrical arch relative to the turtle heading. The turtle is left unmoved. Both
:Angle
and
:Radius
arguments are positive.
To
Arch
:
Angle
:
Radius
# symmetrical arc drawn relative to turtle heading
Arc
:
Radius
Heading-
:
Angle
/2 Heading+
:
Angle
/2
End
LeftArc
(also see
RightArc
)
Move turtle along a curved arc to the left. Similar to Left with a radius of zero. Both
:Angle
and
:Radius
arguments must be positive.
To
LeftArc
:
Angle
:
Radius
# arc drawn relative to turtle position, angle & radius positive
PenUp Right 90 Back
:
Radius
Left
:
Angle
Arc
:
Radius
Heading Heading+
:
Angle
Forward
:
Radius
Left 90 PenDown
End
RightArc
(also see
LeftArc
)
Move turtle along a curved arc to the right. Similar to Right with a radius of zero. Both
:Angle
and
:Radius
arguments must be positive.
To
RightArc
:
Angle
:
Radius
# arc drawn relative to turtle position, angle & radius positive
PenUp Left 90 Back
:
Radius
Arc
:
Radius
Heading Heading+
:
Angle
Right
:
Angle
Forward
:
Radius
Right 90 PenDown
End
'Full' Arc Procedures
The above Arcs are simplified for use as library procedures in programs on this site. Below are more complete Arc procedures which allow for negative angles and angles greater than 360 degrees etc.
rArc
Allow for anti-clockwise arcs if
:Angle
is negative.
To
rArc
:
Angle
:
Radius
# arc drawn relative to turtle heading
If
:
Angle
<0
[Arc
:
Radius
:
Angle
+Heading Heading]
[Arc
:
Radius
Heading
:
Angle
+Heading]
Right
:
Angle
End
Or
To
rArc
:
Angle
:
Radius
# arc drawn relative to turtle heading
LocalMake "
H1
((Minus
:
Angle
) +Abs
:
Angle
) /-2
LocalMake "
H2
((Minus
:
Angle
) -Abs
:
Angle
) /-2
Arc
:
Radius
:
H1
+Heading
:
H2
+Heading
Right
:
Angle
End
Arch
Draw an arch behind the turtle if
:Angle
is negative.
Draw a circle if
:Angle
is greater than 360 degrees.
To
Arch
:
Angle
:
Radius
# symmetrical arc drawn relative to turtle heading
If (Absolute
:
Angle
) <360 [
If
:
Angle
<0
[Arc
:
Radius
180+Heading+
:
Angle
/2 180+Heading-
:
Angle
/2]
[Arc
:
Radius
Heading-
:
Angle
/2 Heading+
:
Angle
/2] ]
[Circle
:
Radius
]
End
LeftArc
(also see RightArc)
StopAll and show error message if
:Radius
is negative as incorrect arc will be drawn.
If
:Angle
is negative then similar to
RightArc
.
If the pen is up, no curve is drawn.
To
LeftArc
:
Angle
:
Radius
# arc drawn relative to turtle position
If
:
Radius
<0 [Print [Radius must be positive] StopAll]
If Not PenDown? [Forward
:
Radius
Left
:
Angle
Forward
:
Radius
Stop]
PenUp If
:
Angle
<0
[Left 90 Back
:
Radius
Arc
:
Radius
Heading Heading-
:
Angle
Left
:
Angle
Forward
:
Radius
Right 90]
[Right 90 Back
:
Radius
Left
:
Angle
Arc
:
Radius
Heading Heading+
:
Angle
Forward
:
Radius
Left 90]
PenDown
End
RightArc
(also see LeftArc)
StopAll and error message if
:Radius
is negative as incorrect arc will be drawn.
If
:Angle
is negative then similar to
LeftArc
.
If the pen is up, no curve is drawn.
To
RightArc
:
Angle
:
Radius
# arc drawn relative to turtle position
If
:
Radius
<0 [Print [Radius must be positive] StopAll]
If Not PenDown? [Forward
:
Radius
Right
:
Angle
Forward
:
Radius
Stop]
PenUp If
:
Angle
<0
[Right 90 Back
:
Radius
Right
:
Angle
Arc
:
Radius
Heading Heading-
:
Angle
Forward
:
Radius
Left 90]
[Left 90 Back
:
Radius
Arc
:
Radius
Heading Heading+
:
Angle
Right
:
Angle
Forward
:
Radius
Right 90]
PenDown
End
Curve
Arcs (and circles) cannot be filled using the FillPolygon primitive. They have to be drawn as a series of small steps. Here is a possible procedure to do this.
To
Curve
:
Angle
:
Radius
# curved arc drawn relative to turtle position
LocalMake "
myHeading
Heading
LocalMake "
Steps
12+Integer Absolute
:
Radius
LocalMake "
StepSize
((2*Pi*
:
Radius
) *(
:
Angle
/360)) /
:
Steps
LocalMake "
StepAngle
:
Angle
/
:
Steps
Forward :
StepSize
/2
Repeat
:
Steps
-1 [Right
:
StepAngle
Forward
:
StepSize
]
Right
:
StepAngle
Forward
:
StepSize
/2
SetH
:
myHeading
+
:
Angle
End