atomes 1.1.14
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
yaxis.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-2024 by CNRS and University of Strasbourg */
15
22/*
23* This file: 'yaxis.c'
24*
25* Contains:
26*
27
28 - The functions to draw the y axis
29
30*
31* List of functions:
32
33 void autoscale_axis (project * this_proj, int rid, int cid, int aid);
34 void setup_yaxis_linear (cairo_t * cr, project * this_proj, int rid, int cid);
35 void setup_yaxis_log (cairo_t * cr, project * this_proj, int rid, int cid, gboolean draw_it);
36
37*/
38
39#include <math.h>
40#include <cairo.h>
41
42#include "global.h"
43#include "curve.h"
44
55void autoscale_axis (project * this_proj, int rid, int cid, int aid)
56{
57 int i, j, k, l, m, n;
58 if (! aid && (rid == RI ||rid == CH))
59 {
60 i = cid / ((this_proj -> nspec+1) * 4);
61 this_proj -> curves[rid][cid] -> axmax[aid] = (rid == RI) ? this_proj -> rsparam[i][1]: this_proj -> csparam[5];
62 this_proj -> curves[rid][cid] -> axmax[aid] += 1.0;
63 this_proj -> curves[rid][cid] -> axmin[aid] = (rid == RI) ? 2 : 1;
64 }
65 else
66 {
67 n = (activer == SP && aid == 1) ? 1 : 0;
68 this_proj -> curves[rid][cid] -> axmax[aid] = this_proj -> curves[rid][cid] -> data[aid][n];
69 this_proj -> curves[rid][cid] -> axmin[aid] = this_proj -> curves[rid][cid] -> data[aid][n];
70 for ( i=n ; i < this_proj -> curves[rid][cid] -> ndata ; i++ )
71 {
72 this_proj -> curves[rid][cid] -> axmax[aid] = max(this_proj -> curves[rid][cid] -> axmax[aid],
73 this_proj -> curves[rid][cid] -> data[aid][i]);
74 this_proj -> curves[rid][cid] -> axmin[aid] = min(this_proj -> curves[rid][cid] -> axmin[aid],
75 this_proj -> curves[rid][cid] -> data[aid][i]);
76 }
77 CurveExtra * ctmp = this_proj -> curves[rid][cid] -> extrac -> first;
78 project * that_proj;
79 for ( j=0 ; j < this_proj -> curves[rid][cid] -> extrac -> extras ; j++ )
80 {
81 m = ctmp -> id.a;
82 k = ctmp -> id.b;
83 l = ctmp -> id.c;
84 that_proj = get_project_by_id(m);
85 for ( i=n ; i < that_proj -> curves[k][l] -> ndata ; i++ )
86 {
87 this_proj -> curves[rid][cid] -> axmax[aid] = max(this_proj -> curves[rid][cid] -> axmax[aid],
88 that_proj -> curves[k][l] -> data[aid][i]);
89 this_proj -> curves[rid][cid] -> axmin[aid] = min(this_proj -> curves[rid][cid] -> axmin[aid],
90 that_proj -> curves[k][l] -> data[aid][i]);
91 }
92 if (ctmp -> next != NULL) ctmp = ctmp -> next;
93 }
94 }
95
96 if (aid == 1)
97 {
98 this_proj -> curves[rid][cid] -> cmin[aid] = this_proj -> curves[rid][cid] -> axmin[aid];
99 this_proj -> curves[rid][cid] -> cmax[aid] = this_proj -> curves[rid][cid] -> axmax[aid];
100 this_proj -> curves[rid][cid] -> axmin[aid] = this_proj -> curves[rid][cid] -> cmin[aid]
101 - fabs(this_proj -> curves[rid][cid] -> cmin[aid]) / 10.0;
102 this_proj -> curves[rid][cid] -> axmax[aid] = this_proj -> curves[rid][cid] -> cmax[aid]
103 + fabs(this_proj -> curves[rid][cid] -> cmax[aid]) / 10.0;
104 if (activer > GK && activer < MS)
105 {
106 this_proj -> curves[rid][cid] -> axmin[aid] = 0.0;
107 }
108 }
109}
110
121void setup_yaxis_linear (cairo_t * cr, project * this_proj, int rid, int cid)
122{
123 int k, i;
124 double u, v;
125
126 k = cxy[1] / mticks;
127 v = cxy[1] - k * mticks;
128 if (k * mticks < cxy[1]) v = mticks - v;
129 v = fabs(v);
130 if (k * mticks > fabs(cxy[1])) v = mticks - v;
131 i=0;
132 for ( u = 0.0 ; u < ymax ; u = u + mticks )
133 {
134 if (y_min + (u + v) * YDRAW / ymax >= y_max)
135 {
136 switch (labpos)
137 {
138 case 0:
139 ax = x_min - x_shift;
140 ay = y_min - y_shift + (u + v) * YDRAW / ymax;
141 label (cr, cxy[1] + v + u, 1, 0, this_proj);
142 break;
143 case 1:
144 ax = x_max + x_shift;
145 ay = y_min - y_shift + (u + v) * YDRAW / ymax;
146 label (cr, cxy[1] + v + u, 1, 1, this_proj);
147 break;
148 case 2:
149 ax = x_min - x_shift;
150 ay = y_min - y_shift + (u + v) * YDRAW / ymax;
151 label (cr, cxy[1] + v + u, 1, 0, this_proj);
152 ax = x_max + x_shift;
153 ay = y_min - y_shift + (u + v) * YDRAW / ymax;
154 label (cr, cxy[1] + v + u, 1, 1, this_proj);
155 break;
156 }
157 i++;
158 switch (tickpos)
159 {
160 case 0:
161 cairo_move_to(cr, x_min, y_min + (u + v) * YDRAW / ymax);
162 cairo_line_to(cr, x_min - amajt, y_min + (u + v) * YDRAW / ymax);
163 break;
164 case 1:
165 cairo_move_to(cr, x_max, y_min + (u + v) * YDRAW / ymax);
166 cairo_line_to(cr, x_max + amajt, y_min + (u + v) * YDRAW / ymax);
167 break;
168 case 2:
169 cairo_move_to(cr, x_min, y_min + (u + v) * YDRAW / ymax);
170 cairo_line_to(cr, x_min - amajt, y_min + (u + v) * YDRAW / ymax);
171 cairo_move_to(cr, x_max, y_min + (u + v) * YDRAW / ymax);
172 cairo_line_to(cr, x_max + amajt, y_min + (u + v) * YDRAW / ymax);
173 break;
174 }
175 }
176 }
177 cairo_stroke (cr);
178
179 for (u = v ; u > mticks / nticks ; u -= mticks / nticks);
180 v = u;
181 for (u = 0.0 ; u < ymax ; u = u + mticks / nticks)
182 {
183 if (y_min + (u + v) * YDRAW / ymax >= y_max)
184 {
185 if (dogrid)
186 {
187 cairo_stroke(cr);
188 cairo_set_line_width (cr, GRIDSIZE);
189 cairo_set_dash (cr, pdashed, lenp, 0.0);
190 cairo_move_to(cr, x_min, y_min + (u + v) * YDRAW / ymax);
191 cairo_line_to(cr, x_max, y_min + (u + v) * YDRAW / ymax);
192 cairo_stroke(cr);
193 prep_frame (cr, this_proj -> curves[rid][cid] -> frame_dash,
194 this_proj -> curves[rid][cid] -> frame_thickness,
195 this_proj -> curves[rid][cid] -> frame_color);
196 }
197 if (fmod(u+v, mticks) != 0.0)
198 {
199 switch (tickpos)
200 {
201 case 0:
202 cairo_move_to(cr, x_min, y_min + (u + v) * YDRAW / ymax);
203 cairo_line_to(cr, x_min - amint, y_min + (u + v) * YDRAW / ymax);
204 break;
205 case 1:
206 cairo_move_to(cr, x_max, y_min + (u + v) * YDRAW / ymax);
207 cairo_line_to(cr, x_max + amint, y_min + (u + v) * YDRAW / ymax);
208 break;
209 case 2:
210 cairo_move_to(cr, x_min, y_min + (u + v) * YDRAW / ymax);
211 cairo_line_to(cr, x_min - amint, y_min + (u + v) * YDRAW / ymax);
212 cairo_move_to(cr, x_max, y_min + (u + v) * YDRAW / ymax);
213 cairo_line_to(cr, x_max + amint, y_min + (u + v) * YDRAW / ymax);
214 break;
215 }
216 }
217 }
218 cairo_stroke (cr);
219 }
220}
221
233void setup_yaxis_log (cairo_t * cr, project * this_proj, int rid, int cid, gboolean draw_it)
234{
235 int i, k, l;
236 gboolean istrue;
237 double v;
238
239 istrue = TRUE;
240 ylog = 1;
241 if (cxy[1] != 0.0)
242 {
243 k = (ymax+cxy[1])/cxy[1];
244 }
245 while (istrue)
246 {
247 k = k/10;
248 if (k > 0)
249 {
250 ylog ++;
251 }
252 else
253 {
254 ylog ++;
255 istrue = FALSE;
256 }
257 }
258 istrue = TRUE;
259 dylog = 0;
260 i = 100;
261 while (istrue)
262 {
263 if (cxy[1] >= pow(10, i))
264 {
265 istrue = FALSE;
266 }
267 else
268 {
269 dylog ++;
270 i=i-1;
271 }
272 }
273 dylog = dylog - 100;
274 if (draw_it)
275 {
276 for ( l = 0 ; l < ylog ; l ++ )
277 {
278 v = pow (10, l-dylog);
279 if (dogrid)
280 {
281 cairo_stroke(cr);
282 cairo_set_line_width (cr, GRIDSIZE);
283 cairo_set_dash (cr, pdashed, lenp, 0.0);
284 cairo_move_to(cr, x_min, y_min + YDRAW * l / ylog);
285 cairo_line_to(cr, x_max, y_min + YDRAW * l / ylog);
286 cairo_stroke(cr);
287 prep_frame (cr, this_proj -> curves[rid][cid] -> frame_dash,
288 this_proj -> curves[rid][cid] -> frame_thickness,
289 this_proj -> curves[rid][cid] -> frame_color);
290 }
291 switch (labpos)
292 {
293 case 0:
294 ax = x_min - x_shift;
295 ay = y_min - y_shift + YDRAW *l / ylog;
296 label (cr, v, 1, 0, this_proj);
297 break;
298 case 1:
299 ax = x_max + x_shift;
300 ay = y_min - y_shift + YDRAW *l / ylog;
301 label (cr, v, 1, 1, this_proj);
302 break;
303 case 2:
304 ax = x_min - x_shift;
305 ay = y_min - y_shift + YDRAW *l / ylog;
306 label (cr, v, 1, 0, this_proj);
307 ax = x_max + x_shift;
308 ay = y_min - y_shift + YDRAW *l / ylog;
309 label (cr, v, 1, 1, this_proj);
310 break;
311 }
312 switch (tickpos)
313 {
314 case 0:
315 cairo_move_to(cr, x_min, y_min + YDRAW * l / ylog);
316 cairo_line_to(cr, x_min - amajt, y_min + YDRAW * l / ylog);
317 break;
318 case 1:
319 cairo_move_to(cr, x_max, y_min + YDRAW * l / ylog);
320 cairo_line_to(cr, x_max - amajt, y_min + YDRAW * l / ylog);
321 break;
322 case 2:
323 cairo_move_to(cr, x_min, y_min + YDRAW * l / ylog);
324 cairo_line_to(cr, x_min - amajt, y_min + YDRAW * l / ylog);
325 cairo_move_to(cr, x_max, y_min + YDRAW * l / ylog);
326 cairo_line_to(cr, x_max - amajt, y_min + YDRAW * l / ylog);
327 break;
328 }
329 for ( k = 2 ; k < 10 ; k ++ )
330 {
331 if (dogrid)
332 {
333 cairo_stroke(cr);
334 cairo_set_line_width (cr, GRIDSIZE);
335 cairo_set_dash (cr, pdashed, lenp, 0.0);
336 cairo_move_to(cr, x_min, y_min + YDRAW * (l + log(k) / log(10.0)) / ylog);
337 cairo_line_to(cr, x_max, y_min + YDRAW * (l + log(k) / log(10.0)) / ylog);
338 cairo_stroke(cr);
339 prep_frame (cr, this_proj -> curves[rid][cid] -> frame_dash,
340 this_proj -> curves[rid][cid] -> frame_thickness,
341 this_proj -> curves[rid][cid] -> frame_color);
342 }
343 switch (tickpos)
344 {
345 case 0:
346 cairo_move_to(cr, x_min, y_min + YDRAW * (l + log(k) / log(10.0)) / ylog);
347 cairo_line_to(cr, x_min - amint, y_min + YDRAW *(l + log(k) / log(10.0)) / ylog);
348 break;
349 case 1:
350 cairo_move_to(cr, x_max, y_min + YDRAW * (l + log(k) / log(10.0)) / ylog);
351 cairo_line_to(cr, x_max + amint, y_min + YDRAW *(l + log(k) / log(10.0)) / ylog);
352 break;
353 case 2:
354 cairo_move_to(cr, x_min, y_min + YDRAW * (l + log(k) / log(10.0)) / ylog);
355 cairo_line_to(cr, x_min - amint, y_min + YDRAW *(l + log(k) / log(10.0)) / ylog);
356 cairo_move_to(cr, x_max, y_min + YDRAW * (l + log(k) / log(10.0)) / ylog);
357 cairo_line_to(cr, x_max + amint, y_min + YDRAW *(l + log(k) / log(10.0)) / ylog);
358 break;
359 }
360 }
361 }
362 cairo_stroke (cr);
363 }
364}
int tickpos
Definition curve.c:83
int labpos
Definition curve.c:83
double ay
Definition curve.c:70
double cxy[2]
Definition curve.c:71
int ylog
Definition curve.c:74
int dylog
Definition curve.c:75
double YDRAW
Definition curve.c:65
double mticks
Definition curve.c:72
const double pdashed[]
Definition curve.c:124
int amajt
Definition curve.c:82
double y_max
Definition curve.c:69
double x_max
Definition curve.c:68
gboolean dogrid
Definition curve.c:80
double ax
Definition curve.c:70
int lenp
Definition curve.c:125
double y_min
Definition curve.c:69
int nticks
Definition curve.c:73
int x_shift
Definition curve.c:81
int amint
Definition curve.c:82
double x_min
Definition curve.c:68
double ymax
Definition curve.c:67
int y_shift
Definition curve.c:81
Variable declarations for the curve widget Functions for interactions with the curve widget.
void label(cairo_t *cr, double val, int axe, int p, project *this_proj)
draw axis label
Definition labels.c:56
int activer
Definition w_curve.c:74
void prep_frame(cairo_t *fr, int da, double ti, ColRGBA dcol)
draw frame line
Definition frame.c:56
#define GRIDSIZE
Definition curve.h:39
Global variable declarations Global convenience function declarations Global data structure defin...
#define RI
Definition global.h:300
#define MS
Definition global.h:303
#define min(a, b)
Definition global.h:75
#define GK
Definition global.h:297
#define SP
Definition global.h:302
#define CH
Definition global.h:301
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
#define max(a, b)
Definition global.h:74
void setup_yaxis_log(cairo_t *cr, project *this_proj, int rid, int cid, gboolean draw_it)
setup y axis using a log scale
Definition yaxis.c:233
void setup_yaxis_linear(cairo_t *cr, project *this_proj, int rid, int cid)
setup y axis using a linear scale
Definition yaxis.c:121
void autoscale_axis(project *this_proj, int rid, int cid, int aid)
autoscale axis
Definition yaxis.c:55