/usr/share/gnudatalanguage/astrolib/tvcircle.pro is in gdl-astrolib 2018.02.16+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | Pro Tvcircle, radius, xc, yc, color, COLOR = TheColor, Device=device, $
DATA= data, FILL=fill,_Extra = _extra
;+
; NAME:
; TVCIRCLE
; PURPOSE:
; Draw circle(s) of specified radius at specified position(s)
; EXPLANATION:
; If a position is not specified, and device has a cursor, then a circle
; is drawn at the current cursor position. By default, TVCIRCLE now
; (since Jan 2012) assumes data coordinates if !X.crange is set.
;
; CALLING SEQUENCE:
; TVCIRCLE, rad, x, y, color, [ /DATA, /FILL, _EXTRA = ]
;
; INPUTS:
; RAD - radius of circle(s) to be drawn, positive numeric scalar
;
; OPTIONAL INPUT:
; X - x position for circle center, vector or scalar
; Y - y position for circle center, vector or scalar
; If X and Y are not specified, and the device has a cursor,
; then program will draw a circle at the current cursor position
; COLOR - color name or intensity value(s) (0 - !D.N_COLORS) used to draw
; the circle(s). If COLOR is a scalar then all circles are drawn
; with the same color value. Otherwise, the Nth circle is drawn
; with the Nth value of color. See cgCOLOR() for a list of color
; names. Default = 'opposite' (i.e. color opposite the
; background).
;
; OPTIONAL KEYWORD INPUTS:
; /DATA - if this keyword is set and non-zero, then the circle width and
; X,Y position center are interpreted as being in DATA
; coordinates. Note that data coordinates must be previously
; defined (with a PLOT or CONTOUR call). TVCIRCLE will
; internally convert to device coordinates before drawing the
; circle, in order to maintain optimal smoothness. The default
; is to assume data coordinates if !X.CRANGE is set. Force
; device coordinates by setting DATA = 0 or /DEVICE
; /DEVICE - If set, then force use of device coordinates..
; /FILL - If set, fill the circle using cgCOLORFILL
;
; Any keyword recognized by cgPLOTS (or cgCOLORFILL if /FILL is
; set) is also recognized by TVCIRCLE. In particular, the color,
; linestyle, thickness and clipping of the circles are controlled
; by the COLOR, LINESTYLE, THICK and NOCLIP keywords. (Clipping
; is turned off by default, set NOCLIP=0 to activate it.)
; If /FILL is set then available keywords are LINE_FILL and
; FILL_PATTERN.
; OUTPUTS:
; None
;
; RESTRICTIONS:
; (1) Some round-off error may occur when non-integral values are
; supplied for both the radius and the center coordinates
; (2) TVCIRCLE does not accept /NORMAL coordinates.
; (3) TVCIRCLE always draws a circle --- even when in data coordinates
; and the X and Y data scales are unequal. (The X data scale is
; used to define the circle radius.) If this is not the behaviour
; you want, then use TVELLIPSE instead.
; EXAMPLE:
; (1) Draw circles of radius 9 pixels at the positions specified by
; X,Y vectors, using double thickness lines
;
; IDL> tvcircle, 9, x, y, THICK = 2
;
; Now fill in the circles using the LINE_FILL method
;
; IDL> tvcircle, 9, x, y, /FILL, /LINE_FILL
; METHOD:
; The method used is that of Michener's, modified to take into account
; the fact that IDL plots arrays faster than single points. See
; "Fundamental of Interactive Computer Graphics" by Foley and Van Dam"
; p. 445 for the algorithm.
;
; REVISON HISTORY:
; Original version written by B. Pfarr STX 10-88
; Major rewrite adapted from CIRCLE by Allyn Saroyan LNLL
; Wayne Landsman STX Sep. 91
; Added DATA keyword Wayne Landsman HSTX June 1993
; Added FILL keyword. R. S. Hill, HSTX, 4-Nov-1993
; Always convert to device coords, add _EXTRA keyword, allow vector
; colors. Wayne Landsman, HSTX, May 1995
; Allow one to set COLOR = 0, W. Landsman, HSTX, November 1995
; Check if data axes reversed. P. Mangifico, W. Landsman May 1996
; Use strict_extra to check input keywords W. Landsman July 2005
; Update documentation to note NOCLIP=0 option W.L. Oct. 2006
; Make all integers default to LONG W. Landsman Dec 2006
; Use Coyote Graphics procedures W. Landsman Feb 2011
; Default to data coordinates if !X.crange present WL Jan 2012
; Add /DEVICE coords, fix Jan 2012 update. Mar 2012
;-
On_Error, 2 ; Return to caller
compile_opt idl2
if ( N_params() LT 1) then begin
print, 'Syntax - TVCIRCLE, rad, [ xc, yc, color, /DATA, /FILL, _EXTRA= ]'
return
endif
; Default to data coordinates if !X.crange is set (previous plot)
if keyword_set(device) then datacoord = 0 else begin
if N_elements(data) eq 0 then datacoord = !x.crange[0] NE !x.crange[1] $
else datacoord = logical_true(data)
endelse
if N_elements(radius) NE 1 then message, $
'ERROR - Circle radius (first parameter) must be a scalar'
if N_elements(TheColor) EQ 0 then begin
IF N_Elements( Color ) EQ 0 THEN Color = cgcolor('opposite')
endif else color = TheColor
if N_params() LT 3 then begin
if (!D.WINDOW EQ -1) then message, $
'ERROR - Cursor not available for device ' + !D.NAME
cursor, xc, yc, /DEVICE, /NOWAIT
if (xc LT 0) || (yc LT 0) then begin
message,'Position cursor in window ' + strtrim(!D.WINDOW,2) + $
' -- then hit mouse button',/INF
cursor, xc, yc, /DEVICE, /WAIT
message,'Circle is centered at (' + strtrim(xc,2) + ',' + $
strtrim(yc,2) + ')',/INF
endif
endif
N_circle = min( [ N_elements(xc), N_elements(yc) ] )
if datacoord then begin
coord = abs(convert_coord(radius,0,/data,/to_dev) - $
convert_coord(0,0,/data,/to_dev))
irad = round( coord[0] )
endif else $
irad = round(radius)
x = 0
y = irad
d = 3 - 2 * irad
; Find the x and y coordinates for one eighth of a circle.
; The maximum number of these coordinates is the radius of the circle.
xHalfQuad = Make_Array( irad + 1, /Long, /NoZero )
yHalfQuad = xHalfQuad
path = 0
WHILE x lt y $
DO BEGIN
xHalfQuad[path] = x
yHalfQuad[path] = y
path++
IF d lt 0 $
THEN d += 4*x + 6 $
ELSE BEGIN
d += 4*(x-y) + 10
y--
END
x++
END
IF x eq y $
THEN BEGIN ; Fill in last point
xHalfQuad[path] = x
yHalfQuad[path] = y
path++
END ; Filling in last point
; Shrink the arrays to their correct size
xHalfQuad = xHalfQuad[ 0:path-1 ]
yHalfQuad = yHalfQuad[ 0:path-1 ]
; Convert the eighth circle into a quadrant
xQuad = [ xHalfQuad, Rotate(yHalfQuad, 5) ]
yQuad = [ yHalfQuad, Rotate(xHalfQuad, 5) ]
; Prepare for converting the quadrants into a full circle
xQuadRev = Rotate( xQuad[0:2*path-2], 5 )
yQuadRev = Rotate( yQuad[0:2*path-2], 5 )
; Create full-circle coordinates
x = [ xQuad, xQuadRev, -xQuad[1:*], -xQuadRev ]
y = [ yQuad, -yQuadRev, -yQuad[1:*], yQuadRev ]
; Plot the coordinates about the given center
if datacoord then begin ;Convert to device coordinates
coord = convert_coord( xc, yc, /DATA, /TO_DEVICE)
xcen = round(coord[0,*]) & ycen = round(coord[1,*])
endif else begin
xcen = round(xc) & ycen = round(yc)
endelse
Ncolor1 = N_elements(color) -1
for i = 0l, N_circle-1 do begin
j = i < Ncolor1
if keyword_set(fill) then begin
cgcolorfill, x+xcen[i], y + ycen[i], COLOR=color[j], /DEV, $
_STRICT_Extra = _extra
endif else begin
cgPlotS, x + xcen[i], y+ ycen[i], COLOR = Color[j], /DEV, $
_STRICT_Extra = _extra
endelse
endfor
Return
End; TVcircle
|