Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/eXene/graph-util/ellipse.sml
ViewVC logotype

Annotation of /sml/trunk/src/eXene/graph-util/ellipse.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (view) (download)

1 : monnier 2 (* ellipse.sml
2 :     *
3 :     * COPYRIGHT (c) 1992 by AT&T Bell Laboratories
4 :     *
5 :     * Code for producing rotated ellipses.
6 :     *
7 :     * Based on an ellipse generator, written by James Tough, 7th May 92
8 :     *
9 :     *)
10 :    
11 :     structure Ellipse : ELLIPSE =
12 :     struct
13 :     structure G = Geometry
14 :    
15 :     exception BadAxis
16 :    
17 :     fun round x = if (x > 0.0) then floor (x+0.5) else ~1*floor(~x+0.5)
18 :    
19 :     fun doEllipse (G.PT{x=cx,y=cy}, radius_x, radius_y, angle) = let
20 :     val a = real radius_x
21 :     val b = real radius_y
22 :     val cphi = Math.cos angle
23 :     val sphi = Math.sin angle
24 :     val cphisqr = cphi*cphi
25 :     val sphisqr = sphi*sphi
26 :     val asqr = a*a
27 :     val bsqr = b*b
28 :     val cphisphi = cphi*sphi
29 :     val c1 = (cphisqr/asqr)+(sphisqr/bsqr)
30 :     val c2 = ((cphi*sphi/asqr)-(cphi*sphi/bsqr))/c1
31 :     val c3 = (bsqr*cphisqr) + (asqr*sphisqr)
32 :     val c4 = a * b / c3
33 :    
34 :     fun mkp (x,y) = G.PT{x = cx + round x, y = cy + y}
35 :    
36 :     (* val ymax = truncate(sqrt c3) *)
37 :     val v1 = c4 * c4
38 :     val c6 = v1 + v1
39 :     val c3' = c3 * v1 - v1
40 :     val d = c4 * (Math.sqrt c3)
41 :     val firstp = mkp(~d,0)
42 :    
43 :     fun flipOn ([],l) = l
44 :     | flipOn (i::rest,l) = flipOn(rest,i::l)
45 :    
46 :     fun merge(l1, l2, l3, l4) = flipOn(l1,l2 @ (flipOn(l3,l4)))
47 :    
48 :     fun loop (l1, l2, l3, l4, y, c3, c5, v1) =
49 :     if c3 < 0.0 then merge(l1,l2,l3,l4)
50 :     else let
51 :     val d = Math.sqrt c3
52 :     val xleft = c5 - d
53 :     val xright = c5 + d
54 :     in
55 :     loop(
56 :     mkp(xleft,y)::l1,
57 :     mkp(xright,y)::l2,
58 :     mkp(~xleft,~y)::l3,
59 :     mkp(~xright,~y)::l4,
60 :     y + 1,
61 :     c3 - v1,
62 :     c5 + c2,
63 :     v1 + c6
64 :     )
65 :     end
66 :    
67 :     in
68 :     loop([firstp], [mkp(d,0)], [], [firstp], 1, c3', c2, v1 + c6)
69 :     end
70 :    
71 :     (* ellipse (pt, a, b, phi) produces a list of points
72 :     * describing the ellipse x^2 / a^2 + y^2 / b^2 = 1
73 :     * translated to point pt and rotated phi radians
74 :     * counterclockwise. If a = 0 or b = 0, it returns [].
75 :     * Raises BadAxis if a < 0 or b < 0.
76 :     *)
77 :     fun ellipse (arg as (_, radius_x, radius_y, _)) =
78 :     if ((radius_x < 0) orelse (radius_y < 0))
79 :     then raise BadAxis
80 :     else if ((radius_x = 0) orelse (radius_y = 0))
81 :     then []
82 :     else doEllipse arg
83 :    
84 :     end (* Ellipse *)
85 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0