1 //      Routines for drawing error bars and tick marks.
2 //
3 // Copyright (C) 2004-2014 Alan W. Irwin
4 //
5 // This file is part of PLplot.
6 //
7 // PLplot is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU Library General Public License as published
9 // by the Free Software Foundation; either version 2 of the License, or
10 // (at your option) any later version.
11 //
12 // PLplot is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU Library General Public License for more details.
16 //
17 // You should have received a copy of the GNU Library General Public License
18 // along with PLplot; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 //
21 
22 #include "plplotP.h"
23 
24 //--------------------------------------------------------------------------
25 // void plwxtik()
26 //
27 // Draws a tick parallel to x, using world coordinates
28 //--------------------------------------------------------------------------
29 void
plwxtik(PLFLT x,PLFLT y,PLBOOL minor,PLBOOL invert)30 plwxtik( PLFLT x, PLFLT y, PLBOOL minor, PLBOOL invert )
31 {
32     PLINT length, below, above;
33     PLFLT height;
34     if ( minor )
35     {
36         // Minor tick
37         height = plsc->minht;
38     }
39     else
40     {
41         // Major tick
42         height = plsc->majht;
43     }
44     length = MAX( ROUND( height * plsc->ypmm ), 1 );
45 
46     if ( invert )
47     {
48         below = 0;
49         above = length;
50     }
51     else
52     {
53         below = length;
54         above = 0;
55     }
56     // Actually draw the tick
57     plxtik( plP_wcpcx( x ), plP_wcpcy( y ), below, above );
58 }
59 
60 //--------------------------------------------------------------------------
61 // void plwytik()
62 //
63 // Draws a tick parallel to y, using world coordinates
64 //--------------------------------------------------------------------------
65 void
plwytik(PLFLT x,PLFLT y,PLBOOL minor,PLBOOL invert)66 plwytik( PLFLT x, PLFLT y, PLBOOL minor, PLBOOL invert )
67 {
68     PLINT length, below, above;
69     PLFLT height;
70     if ( minor )
71     {
72         // Minor tick
73         height = plsc->minht;
74     }
75     else
76     {
77         // Major tick
78         height = plsc->majht;
79     }
80     length = MAX( ROUND( height * plsc->xpmm ), 1 );
81 
82     if ( invert )
83     {
84         below = 0;
85         above = length;
86     }
87     else
88     {
89         below = length;
90         above = 0;
91     }
92     // Actually draw the tick
93     plytik( plP_wcpcx( x ), plP_wcpcy( y ), below, above );
94 }
95 
96 //--------------------------------------------------------------------------
97 // void plxtik()
98 //
99 // Draws a tick parallel to x.
100 //--------------------------------------------------------------------------
101 
102 void
plxtik(PLINT x,PLINT y,PLINT below,PLINT above)103 plxtik( PLINT x, PLINT y, PLINT below, PLINT above )
104 {
105     plP_movphy( x, y - below );
106     plP_draphy( x, y + above );
107 }
108 
109 //--------------------------------------------------------------------------
110 // void plytik()
111 //
112 // Draws a tick parallel to y.
113 //--------------------------------------------------------------------------
114 
115 void
plytik(PLINT x,PLINT y,PLINT left,PLINT right)116 plytik( PLINT x, PLINT y, PLINT left, PLINT right )
117 {
118     plP_movphy( x - left, y );
119     plP_draphy( x + right, y );
120 }
121 
122 //--------------------------------------------------------------------------
123 // void plstik()
124 //
125 // Draws a slanting tick at position (mx,my) (measured in mm) of
126 // vector length (dx,dy).
127 //--------------------------------------------------------------------------
128 
129 void
plstik(PLFLT mx,PLFLT my,PLFLT dx,PLFLT dy)130 plstik( PLFLT mx, PLFLT my, PLFLT dx, PLFLT dy )
131 {
132     plP_movphy( plP_mmpcx( mx ), plP_mmpcy( my ) );
133     plP_draphy( plP_mmpcx( (PLFLT) ( mx + dx ) ), plP_mmpcy( (PLFLT) ( my + dy ) ) );
134 }
135 
136 //--------------------------------------------------------------------------
137 // void plerx1()
138 //
139 // Plot single horizontal error bar.
140 //--------------------------------------------------------------------------
141 
142 static void
plerx1(PLFLT xmin,PLFLT xmax,PLFLT y)143 plerx1( PLFLT xmin, PLFLT xmax, PLFLT y )
144 {
145     PLINT yminor;
146 
147     yminor = (PLINT) ( MAX( 1.0, plsc->minht * plsc->ypmm ) );
148     plxtik( plP_wcpcx( xmin ), plP_wcpcy( y ), yminor, yminor );
149     plP_movwor( xmin, y );
150     plP_drawor( xmax, y );
151     plxtik( plP_wcpcx( xmax ), plP_wcpcy( y ), yminor, yminor );
152 }
153 
154 //--------------------------------------------------------------------------
155 // void plery1()
156 //
157 // Plot single vertical error bar.
158 //--------------------------------------------------------------------------
159 
160 static void
plery1(PLFLT x,PLFLT ymin,PLFLT ymax)161 plery1( PLFLT x, PLFLT ymin, PLFLT ymax )
162 {
163     PLINT xminor;
164 
165     xminor = (PLINT) ( MAX( 1.0, plsc->minht * plsc->xpmm ) );
166     plytik( plP_wcpcx( x ), plP_wcpcy( ymin ), xminor, xminor );
167     plP_movwor( x, ymin );
168     plP_drawor( x, ymax );
169     plytik( plP_wcpcx( x ), plP_wcpcy( ymax ), xminor, xminor );
170 }
171 
172 //--------------------------------------------------------------------------
173 // void plerrx()
174 //
175 // Plot horizontal error bars (xmin(i),y(i)) to (xmax(i),y(i)).
176 //--------------------------------------------------------------------------
177 
178 void
c_plerrx(PLINT n,PLFLT_VECTOR xmin,PLFLT_VECTOR xmax,PLFLT_VECTOR y)179 c_plerrx( PLINT n, PLFLT_VECTOR xmin, PLFLT_VECTOR xmax, PLFLT_VECTOR y )
180 {
181     PLINT i;
182 
183     if ( plsc->level < 3 )
184     {
185         plabort( "plerrx: Please set up window first" );
186         return;
187     }
188 
189     for ( i = 0; i < n; i++ )
190         plerx1( xmin[i], xmax[i], y[i] );
191 }
192 
193 //--------------------------------------------------------------------------
194 // void plerry()
195 //
196 // Plot vertical error bars (x,ymin(i)) to (x(i),ymax(i)).
197 //--------------------------------------------------------------------------
198 
199 void
c_plerry(PLINT n,PLFLT_VECTOR x,PLFLT_VECTOR ymin,PLFLT_VECTOR ymax)200 c_plerry( PLINT n, PLFLT_VECTOR x, PLFLT_VECTOR ymin, PLFLT_VECTOR ymax )
201 {
202     PLINT i;
203 
204     if ( plsc->level < 3 )
205     {
206         plabort( "plerry: Please set up window first" );
207         return;
208     }
209 
210     for ( i = 0; i < n; i++ )
211         plery1( x[i], ymin[i], ymax[i] );
212 }
213