1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
############################################################################
#
# File: randarea.icn
#
# Subject: Procedures to generate random points in areas
#
# Author: Ralph E. Griswold
#
# Date: May 2, 2001
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# These procedures generate randomly selected points with specified
# areas.
#
############################################################################
#
# Links: gobject
#
############################################################################
link gobject
procedure randrect(x, y, w, h)
w := integer(w) | stop("*** bad value")
h := integer(h) | stop("*** bad value")
x -:= 1
y -:= 1
suspend Point(x + ?|w, y + ?h)
end
procedure randellip(x, y, w, h)
local r1, r2, xc, yc, xp, yp, xq, yq, theta, rp, r
w := integer(w) | stop("*** bad value")
h := integer(h) | stop("*** bad value")
r1 := w / 2
r2 := h / 2
xc := x + r1
yc := y + r2
x -:= 1
y -:= 1
repeat {
xq := x + ?w
yq := y + ?h
xp := xq - xc
yp := yq - yc
theta := -atan(yp, xp)
rp := sqrt(xp ^ 2 + yp ^ 2)
r := sqrt((r1 * cos(theta)) ^ 2 + (r2 * sin(theta)) ^ 2)
if r > rp then suspend Point(xq, yq)
}
end
|