home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
mprocs
/
viewpack.icn
< prev
Wrap
Text File
|
2001-05-02
|
7KB
|
330 lines
############################################################################
#
# File: viewpack.icn
#
# Subject: Procedures to visualize color streams
#
# Author: Ralph E. Griswold
#
# Date: May 2, 2001
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# These procedures provide various ways of visualizing a stream of colors.
#
############################################################################
#
# Requires: Version 9 graphics
#
############################################################################
$define Hold 300
# blinking light
procedure beacon(win, color, value) #: 1C visualization as blinking light
Fg(win, color)
FillCircle(win, width / 2, height / 2, width / 2)
WDelay(win, Hold)
end
# random curves
procedure curves(win, color, value) #: 1C visualization as random curves
local x0, y0
Fg(win, color)
DrawCurve ! [
win,
x0 := ?width, y0 := ?height,
?width, ?height,
?width, ?height,
?width, ?height,
?width, ?height,
?width, ?height,
?width, ?height,
.x0, .y0
]
WDelay(win, Hold)
return
end
# "haystack"
procedure haystack(win, color, value) #: 2CS visualization as "haystack"
static angle, xcenter, ycenter, xorg, yorg, fullcircle
initial {
fullcircle := 2 * &pi
ycenter := height / 2
xcenter := width / 2
}
Fg(win, color)
angle := ?0 * fullcircle # angle for locating starting point
xorg := xcenter + ?xcenter * cos(angle)
yorg := ycenter + ?ycenter * sin(angle)
angle := ?0 * fullcircle # angle for locating end point
DrawLine(win, xorg, yorg, value * cos(angle) +
xorg, value * sin(angle) + yorg)
return
end
# "nova"
$define Scale 1.5
$define Rays 360
procedure nova(win, color, value) #: 1C visualization as exploding star
local clear, xorg, yorg, radius, arc, oldlength, length
static fullcircle, radians, advance, erase
initial {
fullcircle := 2 * &pi
radians := 0
advance := fullcircle / Rays # amount to advance
erase := list(Rays)
}
Fg(win, color)
xorg := width / 2
yorg := height / 2
radius := ((height < width) | height) / 2.0
length := value * Scale
put(erase, length)
oldlength := get(erase)
# The following are to erase old ray at that angle
# DrawLine(Background, xorg, yorg, \oldlength * cos(radians) + xorg,
# oldlength * sin(radians) + yorg)
DrawLine(win, xorg, yorg, length * cos(radians) +
xorg, length * sin(radians) + yorg)
radians +:= advance
radians %:= fullcircle
return
end
# "pinwheel"
$define Sectors 240
procedure pinwheel(win, color, value) #: 1C visualization as radar sweep
static clear, xorg, yorg, radius, offset
static arc, advance, blank, max, xratio, yratio
static fullcircle, background
initial {
fullcircle := 2 * &pi
max := real((width < height) | width)
xratio := width / max
yratio := height / max
offset := 0
advance := fullcircle / Sectors
blank := 2 * advance
xorg := width / 2
yorg := height / 2
radius := max / 2
# This belongs elsewhere
background := Clone(win, "bg=" || default_color)
}
Fg(win, color)
FillArc(background, 0, 0, width, height, offset + advance, blank)
FillArc(win, 0, 0, width, height, offset, advance)
DrawLine(background, xorg, yorg, xratio * radius * cos(offset) +
xorg, yratio * radius * sin(offset) + yorg)
offset +:= advance
offset %:= fullcircle
return
end
# random polygons
procedure polygons(win, color, value) #: 1C visualization as random polygons
local x0, y0
Fg(win, color)
FillPolygon ! [
win,
x0 := ?width, y0 := ?height,
?width, ?height,
?width, ?height,
?width, ?height,
?width, ?height,
?width, ?height,
?width, ?height,
.x0, .y0
]
WDelay(win, Hold)
return
end
# random dots
procedure splatter(win, color, value) #: 2CS visualization as random dots
local radius, xplace, yplace
Fg(win, color)
radius := sqrt(value)
xplace := ?width - 1 - (radius / 2)
yplace := ?height - 1 - (radius / 2)
FillCircle(win, xplace, yplace, radius)
return
end
# scrolling strip
procedure strip(win, color, value) #: 2CS visualization as scrolling lines
local count
Fg(win, color) | "black"
if /value | (value = 0) then return
count := log(value, 10) + 1
every 1 to count do {
CopyArea(win, 1, 0, width - 1, height, 0, 0)
EraseArea(win, width - 1, 0, width - 1, height)
FillRectangle(win, width - 1, 0, 1, height)
}
return
end
procedure symdraw(W, mid, x, y, r)
FillCircle(W, mid + x, mid + y, r)
FillCircle(W, mid + x, mid - y, r)
FillCircle(W, mid - x, mid + y, r)
FillCircle(W, mid - x, mid - y, r)
FillCircle(W, mid + y, mid + x, r)
FillCircle(W, mid + y, mid - x, r)
FillCircle(W, mid - y, mid + x, r)
FillCircle(W, mid - y, mid - x, r)
return
end
# symmetric random dots
procedure symsplat(win, color, value) #: 2CS visualization as symmetric random dots
local radius
static xplace, yplace, oscale
Fg(win, color)
radius := sqrt(value)
xplace := ?width - 1
yplace := ?height - 1
symdraw(win, width / 2, xplace, yplace, radius)
return
end
# evolving vortex
procedure vortex(win, color, value) #: 1C visualization as an aspirating vortex
local count
static x1, x2, y1, y2
initial {
x1 := y1 := 0
x2 := width
y2 := height
}
Fg(win, color)
if value = 0 then return
count := log(value, 10) + 1
every 1 to count do {
if (x2 | y2) < 0 then {
x1 := y1 := 0
x2 := width
y2 := height
}
DrawRectangle(win, x1, y1, x2 - x1, y2 - y1)
x1 +:= 1
x2 -:= 1
y1 +:= 1
y2 -:= 1
}
return
end
# random walk
#
# This procedure is suspect -- it seems to wander off the display area.
$define Delta 30
procedure web(win, color, value) #: 2CS visualization as a random walk
static xorg, yorg, x, y, angle, degrees, radians, resid
initial {
resid := 0
xorg := ?(width - 1) # starting point
yorg := ?(height - 1)
}
Fg(win, color)
if resid <= 1 then {
angle := ?0 * 2 * &pi # initial direction for new walk
resid := value
}
x := xorg + resid * cos(angle)
y := yorg + resid * sin(angle)
if x > width then {
x := width
}
if y > height then {
y := height
}
if x < 0 then {
x := 0
}
if y < 0 then {
y := 0
}
DrawLine(win, xorg, yorg, x, y)
resid -:= sqrt((x - xorg) ^ 2 + (y - yorg) ^ 2)
xorg := x # move to new point
yorg := y
angle := -angle # reflect
return
end