(FILECREATED "18-FEB-83 13:35:14" {DSK}VECTOR.LSP;13 8596
changes to: (GLISPOBJECTS VECTOR)
previous date: "10-FEB-83 13:44:17" {DSK}VECTOR.LSP;12)
(PRETTYCOMPRINT VECTORCOMS)
(RPAQQ VECTORCOMS ((GLISPOBJECTS DEGREES DOLPHINREGION GRAPHICSOBJECT RADIANS REGION RVECTOR SYMMETRY
VECTOR)
(FNS DRAWRECT GRAPHICSOBJECTMOVE NEWSTART NEWPOINT REGION-CENTEROFFSET REGION-CONTAINS
REGION-INTERSECT REGION-SETPOSITION REGION-UNION VECTORPLUS VECTORDIFF VECTORDOTPRODUCT
VECTORGREATERP VECTORLEQP VECTORTIMES VECTORQUOTIENT VECTORMOVE)
(PROP DRAWFN RECTANGLE)))
[GLISPOBJECTS
(DEGREES
REAL
PROP ((RADIANS (self * (3.1415926 / 180.0))
RESULT RADIANS)
(DISPLAYPROPS (T))) )
(DOLPHINREGION
(LIST (LEFT INTEGER)
(BOTTOM INTEGER)
(WIDTH INTEGER)
(HEIGHT INTEGER))
PROP ((START (self)
RESULT VECTOR)
(SIZE ((CDDR self))
RESULT VECTOR))
SUPERS (REGION) )
(GRAPHICSOBJECT
(LIST (SHAPE ATOM)
(START VECTOR)
(SIZE VECTOR))
PROP ((LEFT (START:X))
(BOTTOM (START:Y))
(RIGHT (LEFT+WIDTH))
(TOP (BOTTOM+HEIGHT))
(WIDTH (SIZE:X))
(HEIGHT (SIZE:Y))
(CENTER (START + SIZE / 2))
(AREA (WIDTH*HEIGHT)))
MSG ([DRAW ((APPLY* (GETPROP SHAPE 'DRAWFN)
self
(QUOTE PAINT]
[ERASE ((APPLY* (GETPROP SHAPE 'DRAWFN)
self
(QUOTE ERASE]
(MOVE GRAPHICSOBJECTMOVE OPEN T)) )
(RADIANS
REAL
PROP ((DEGREES (self* (180.0 / 3.1415926))
RESULT DEGREES)
(DISPLAYPROPS (T))) )
(REGION
(LIST (START VECTOR)
(SIZE VECTOR))
PROP ((LEFT (START:X))
(BOTTOM (START:Y))
(RIGHT (LEFT+WIDTH))
(TOP (BOTTOM+HEIGHT))
(WIDTH (SIZE:X))
(HEIGHT (SIZE:Y))
(CENTER (START + SIZE / 2))
(TOPCENTER ((A VECTOR WITH X = LEFT + WIDTH / 2 Y = TOP)))
(BOTTOMCENTER ((A VECTOR WITH X = LEFT + WIDTH / 2 Y = BOTTOM)))
(AREA (WIDTH*HEIGHT)))
ADJ ((EMPTY (WIDTH IS ZERO OR HEIGHT IS ZERO))
(ZERO (self IS EMPTY)))
MSG ((CONTAINS? REGION-CONTAINS OPEN T)
(SETPOSITION REGION-SETPOSITION OPEN T)
(CENTEROFFSET REGION-CENTEROFFSET OPEN T)) )
(RVECTOR
(LIST (X REAL)
(Y REAL))
SUPERS (VECTOR) )
(SYMMETRY
INTEGER
PROP ((SWAPXY ((LOGAND self 4)
<>0))
(INVERTY ((LOGAND self 2)
<>0))
(INVERTX ((LOGAND self 1)
<>0))) )
(VECTOR
(LIST (X INTEGER)
(Y INTEGER))
PROP [(MAGNITUDE ((SQRT X↑2 + Y↑2)))
(IMAGNITUDE ((FIX MAGNITUDE + .9999)))
(ANGLE ((ARCTAN2 Y X T))
RESULT RADIANS)
(UNITVECTOR ((A RVECTOR WITH X = X / MAGNITUDE Y = Y / MAGNITUDE]
ADJ ((ZERO (X IS ZERO AND Y IS ZERO))
(NORMALIZED (MAGNITUDE = 1.0)))
MSG [(+ VECTORPLUS OPEN T ARGTYPES (VECTOR))
(- VECTORDIFF OPEN T ARGTYPES (VECTOR))
(* VECTORTIMES OPEN T ARGTYPES (NUMBER))
(* VECTORDOTPRODUCT OPEN T ARGTYPES (VECTOR))
(/ VECTORQUOTIENT OPEN T ARGTYPES (NUMBER))
(> VECTORGREATERP OPEN T ARGTYPES (VECTOR))
(<= VECTORLEQP OPEN T ARGTYPES (VECTOR))
(←+ VECTORMOVE OPEN T ARGTYPES (VECTOR))
(PRIN1 ((PRIN1 "(")
(PRIN1 X)
(PRIN1 ",")
(PRIN1 Y)
(PRIN1 ")")))
(PRINT ((← self PRIN1)
(TERPRI] )
]
(DEFINEQ
(DRAWRECT
(GLAMBDA ((A GRAPHICSOBJECT)
DSPOP:ATOM) (* edited: "11-JAN-82 12:40")
(PROG (OLDDS)
(OLDDS ←(CURRENTDISPLAYSTREAM DSPS))
(DSPOPERATION DSPOP)
(MOVETO LEFT BOTTOM)
(DRAWTO LEFT TOP)
(DRAWTO RIGHT TOP)
(DRAWTO RIGHT BOTTOM)
(DRAWTO LEFT BOTTOM)
(CURRENTDISPLAYSTREAM OLDDS))))
(GRAPHICSOBJECTMOVE
(GLAMBDA (self:GRAPHICSOBJECT DELTA:VECTOR) (* edited: "11-JAN-82 16:07")
(← self ERASE)
(START ←+
DELTA)
(← self DRAW)))
(NEWSTART
[GLAMBDA (START:VECTOR SIZE:VECTOR SYM:SYMMETRY) (* GSN "30-JAN-83 15:44")
(* Transform the starting point of an object as
appropriate for the specified symmetry transform.)
(PROG (W H TMP)
(W←SIZE:X)
(H←SIZE:Y)
(IF SYM:SWAPXY
THEN TMP←W
W←H
H←TMP)
(IF ~SYM:INVERTY
THEN H←0)
(IF ~SYM:INVERTX
THEN W←0)
(RETURN (A (TYPEOF START)
WITH X = START:X+W Y = START:Y+H])
(NEWPOINT
[GLAMBDA (START:VECTOR POINT:VECTOR SYM:SYMMETRY) (* GSN "30-JAN-83 15:44")
(* Transform a given relative POINT for specified
symmetry transform.)
(PROG (W H TMP)
(W←POINT:X)
(H←POINT:Y)
(IF SYM:SWAPXY
THEN TMP←W
W←H
H←TMP)
(IF ~SYM:INVERTY
THEN H ← - H)
(IF ~SYM:INVERTX
THEN W ← - W)
(RETURN (A (TYPEOF POINT)
WITH X = START:X+W Y = START:Y+H])
(REGION-CENTEROFFSET
(GLAMBDA (R:REGION V:VECTOR) (* GSN " 2-FEB-83 14:00")
(A (TYPEOF V)
WITH X =(R:WIDTH - V:X) / 2 Y =(R:HEIGHT - V:Y) / 2)))
(REGION-CONTAINS
(GLAMBDA (AREA P) (* edited: "26-OCT-82 11:45")
(* Test whether an area contains a point P.)
(P:X>=AREA:LEFT AND P:X<=AREA:RIGHT AND P:Y>=AREA:BOTTOM AND P:Y<=AREA:TOP)))
(REGION-INTERSECT
(GLAMBDA (P:AREA Q:AREA) (* GSN "30-JAN-83 15:45")
(RESULT (TYPEOF P)) (* Produce an AREA which is the intersection of two
given AREAs.)
(PROG (NEWBOTTOM NEWLEFT NEWAREA XSIZE YSIZE)
(NEWBOTTOM ←(IMAX P:BOTTOM Q:BOTTOM))
(YSIZE ←(IMIN P:TOP Q:TOP)
- NEWBOTTOM)
(NEWLEFT ←(IMAX P:LEFT Q:LEFT))
(XSIZE ←(IMIN P:RIGHT Q:RIGHT)
- NEWLEFT)
(NEWAREA ←(A (TYPEOF P)))
(IF XSIZE>0 AND YSIZE>0
THEN NEWAREA:LEFT←NEWLEFT
NEWAREA:BOTTOM←NEWBOTTOM
NEWAREA:WIDTH←XSIZE
NEWAREA:HEIGHT←YSIZE)
(RETURN NEWAREA))))
(REGION-SETPOSITION
(GLAMBDA (AREA APOS:VECTOR NEWPOS:VECTOR) (* GSN "14-JAN-83 11:52")
(* Change the START point of AREA so that the position
APOS relative to the area will have the position
NEWPOS.)
(AREA:START ←+
NEWPOS - APOS)))
(REGION-UNION
(GLAMBDA (P:AREA Q:AREA) (* GSN "30-JAN-83 15:46")
(RESULT (TYPEOF P)) (* Produce an AREA which is the union of two given
AREAs.)
(PROG (NEWBOTTOM NEWLEFT XSIZE YSIZE NEWAREA)
(NEWBOTTOM ←(IMIN P:BOTTOM Q:BOTTOM))
(YSIZE ←(IMAX P:TOP Q:TOP)
- NEWBOTTOM)
(NEWLEFT ←(IMIN P:LEFT Q:LEFT))
(XSIZE ←(IMAX P:RIGHT Q:RIGHT)
- NEWLEFT)
(NEWAREA ←(A (TYPEOF P)))
(NEWAREA:LEFT←NEWLEFT)
(NEWAREA:BOTTOM←NEWBOTTOM)
(NEWAREA:WIDTH←XSIZE)
(NEWAREA:HEIGHT←YSIZE)
(RETURN NEWAREA))))
(VECTORPLUS
(GLAMBDA (V1:VECTOR V2:VECTOR) (* GSN "10-FEB-83 13:41")
(A (TYPEOF V1)
WITH X = V1:X + V2:X Y = V1:Y + V2:Y)))
(VECTORDIFF
(GLAMBDA (V1:VECTOR V2:VECTOR) (* GSN "10-FEB-83 13:41")
(A (TYPEOF V1)
WITH X = V1:X - V2:X Y = V1:Y - V2:Y)))
(VECTORDOTPRODUCT
(GLAMBDA (V1:VECTOR V2:VECTOR) (* GSN "10-FEB-83 13:42")
(A (TYPEOF V1)
WITH X = V1:X * V2:X Y = V1:Y * V2:Y)))
(VECTORGREATERP
(GLAMBDA (U:VECTOR V:VECTOR) (* GSN "14-JAN-83 12:33")
(* This version of > tests whether one box will fit
inside the other.)
(U:X>V:X OR U:Y>V:Y)))
(VECTORLEQP
(GLAMBDA (U:VECTOR V:VECTOR) (* GSN "14-JAN-83 12:31")
(U:X<=V:X AND U:Y<=V:Y)))
(VECTORTIMES
(GLAMBDA (V:VECTOR N:NUMBER) (* GSN "10-FEB-83 13:41")
(A (TYPEOF V)
WITH X = X*N Y = Y*N)))
(VECTORQUOTIENT
(GLAMBDA (V:VECTOR N:NUMBER) (* GSN "10-FEB-83 13:42")
(A (TYPEOF V)
WITH X = X / N Y = Y / N)))
(VECTORMOVE
(GLAMBDA (V:VECTOR DELTA:VECTOR) (* GSN "10-FEB-83 13:43")
(V:X ←+
DELTA:X)
(V:Y ←+
DELTA:Y)
V))
)
(PUTPROPS RECTANGLE DRAWFN DRAWRECT)
(DECLARE: DONTCOPY
(FILEMAP (NIL (3214 8536 (DRAWRECT 3224 . 3644) (GRAPHICSOBJECTMOVE 3646 . 3820) (NEWSTART 3822 . 4383
) (NEWPOINT 4385 . 4928) (REGION-CENTEROFFSET 4930 . 5117) (REGION-CONTAINS 5119 . 5414) (
REGION-INTERSECT 5416 . 6128) (REGION-SETPOSITION 6130 . 6474) (REGION-UNION 6476 . 7163) (VECTORPLUS
7165 . 7329) (VECTORDIFF 7331 . 7495) (VECTORDOTPRODUCT 7497 . 7667) (VECTORGREATERP 7669 . 7943) (
VECTORLEQP 7945 . 8073) (VECTORTIMES 8075 . 8223) (VECTORQUOTIENT 8225 . 8380) (VECTORMOVE 8382 . 8534
)))))
STOP