summaryrefslogtreecommitdiff
path: root/ipl/gprogs/spiro.icn
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2013-01-27 23:51:56 +0000
committerIgor Pashev <pashev.igor@gmail.com>2013-01-27 23:51:56 +0000
commit6ab0c0f5bf14ed9c15370407b9ee7e0b4b089ae1 (patch)
tree926065cf45450116098db664e3c61dced9e1f21a /ipl/gprogs/spiro.icn
downloadicon-6ab0c0f5bf14ed9c15370407b9ee7e0b4b089ae1.tar.gz
Initial upstream version 9.4.3upstream/9.4.3
Diffstat (limited to 'ipl/gprogs/spiro.icn')
-rw-r--r--ipl/gprogs/spiro.icn148
1 files changed, 148 insertions, 0 deletions
diff --git a/ipl/gprogs/spiro.icn b/ipl/gprogs/spiro.icn
new file mode 100644
index 0000000..42ac1b3
--- /dev/null
+++ b/ipl/gprogs/spiro.icn
@@ -0,0 +1,148 @@
+############################################################################
+#
+# File: spiro.icn
+#
+# Subject: Program to display spirograph lines
+#
+# Author: Stephen B. Wampler
+#
+# Date: June 17, 1994
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# Version: 1.0
+#
+############################################################################
+#
+#
+# Comments: This program displays spirograph-like output
+# There are two methods of drawing: epitrochoid, where
+# the secondary circle moves around the outside of the
+# primary circle, and hypotrochoid (the default here),
+# where the secondary circle moves around the inside of
+# the primary circle.
+#
+# See the procedure 'helpmsg' for command line options
+# (or run as 'spiro -help')
+#
+# Waits for a window event before closing window
+#
+############################################################################
+#
+# Links: glib, wopen
+#
+############################################################################
+#
+# Requires: Version 9 graphics and co-expressions (for glib.icn)
+#
+############################################################################
+
+link glib # need the turtle graphic stuff
+link wopen
+
+global win, mono, h, w
+global Window, XMAX, YMAX
+
+procedure main (args)
+ local a, b, k, t1, t2, N, arg, use_epi, t, alist
+
+ XMAX := YMAX := 700 # physical screen size
+ w := h := 350.0
+
+ a := 100.0
+ b := 5.0
+ k := 20.0
+ t1 := 0.0
+ t2 := 1.0 # only roll around once.
+ N := 500
+
+ while arg := get(args) do {
+ case arg of {
+ "-help"|"-h" : helpmsg()
+ "-epi" : use_epi := "yes"
+ "-a": a := real(get(args))
+ "-b": b := real(get(args))
+ "-k": k := real(get(args))
+ "-t1": t1 := real(get(args))
+ "-t2": t2 := real(get(args))
+ "-N" : N := integer(get(args))
+ }
+ }
+
+ win := WOpen("label=Spirograph", "width="||XMAX, "height="||YMAX)
+ mono := WAttrib (win, "depth") == "1"
+ Window := set_window(win, point(-w,-h), point(w,h),
+ viewport(point(0,0), point(XMAX, YMAX), win))
+
+ EraseArea(win)
+
+ t := turtle(Window, point(w/2, h/2), 0, create |"red")
+
+ # build list of arguments to pass to parametric equations
+ # (same list for both x and y equations here)
+ alist := [a,b,k]
+
+ if \use_epi then
+ draw_curve(t,epi_x,alist,epi_y,alist,t1,t2,N)
+ else
+ draw_curve(t,hypo_x,alist,hypo_y,alist,t1,t2,N)
+
+
+ # sit and wait for an event on the window.
+ Event(win)
+ close(win)
+end
+
+procedure epi_x(t,a[])
+ static twopi
+ local ab
+ initial twopi := 2*&pi
+
+ ab := a[1]+a[2]
+ return (ab)*cos(twopi*t) - a[3]*cos(twopi*((ab)*t)/a[2])
+end
+
+procedure epi_y(t,a[])
+ static twopi
+ local ab
+ initial twopi := 2*&pi
+
+ ab := a[1]+a[2]
+ return (ab)*sin(twopi*t) - a[3]*sin(twopi*((ab)*t)/a[2])
+end
+
+procedure hypo_x(t,a[])
+ static twopi
+ local ab
+ initial twopi := 2*&pi
+
+ ab := a[1]-a[2]
+ return (ab)*cos(twopi*t) + a[3]*cos(twopi*((ab)*t)/a[2])
+end
+
+procedure hypo_y(t,a[])
+ static twopi
+ local ab
+ initial twopi := 2*&pi
+
+ ab := a[1]-a[2]
+ return (ab)*sin(twopi*t) - a[3]*sin(twopi*((ab)*t)/a[2])
+end
+
+procedure helpmsg()
+ write("Usage: Spiro [-a r] [-b r] [-k r] [-t1 r] [-t2 r] [-N n] [-epi]")
+ write()
+ write("where:")
+ write("\t-a r - radius of center circle {default 100}")
+ write("\t-b r - radius of moving circle {5}")
+ write("\t-k r - distance of pen from center of moving circle {20}")
+ write("\t-t1 r - initial value for parameter {0.0}")
+ write("\t-t2 r - final value for parameter {1.0 (one revolutio)}")
+ write("\t-N n - number of intervals to draw {500}")
+ write("\t-epi - use epitrochoid instead of hypotrochoid")
+ stop()
+end