Arcs

- XLogo library of procedures

xlogo

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

xlogo
XLogo

 

xlogo
Hearts