atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
xaxis.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-2026 by CNRS and University of Strasbourg */
15
21
22/*
23* This file: 'xaxis.c'
24*
25* Contains:
26*
27
28 - The functions to draw the x axis
29
30*
31* List of functions:
32
33 void setup_xaxis_linear (cairo_t * cr, Curve * this_curve);
34 void setup_xaxis_log (cairo_t * cr, Curve * this_curve, gboolean draw_it);
35
36*/
37
38#include <math.h>
39#include <cairo.h>
40
41#include "global.h"
42#include "curve.h"
43
52void setup_xaxis_linear (cairo_t * cr, Curve * this_curve)
53{
54 int k;
55 double u, v;
56
57 k = cxy[0] / mticks;
58 v = cxy[0] - k * mticks;
59 if (k * mticks < cxy[0]) v = mticks - v;
60 v = fabs(v);
61 for ( u = 0.0 ; u < xmax; u = u + mticks )
62 {
63 if (x_min + (u + v) * XDRAW / xmax <= x_max)
64 {
65 switch (labpos)
66 {
67 case 0:
68 ax = x_min - x_shift + (u + v) * XDRAW / xmax;
69 ay = y_min + y_shift;
70 label_curve (cr, cxy[0] + u + v, 0, 0, this_curve);
71 break;
72 case 1:
73 ax = x_min - x_shift + (u + v) * XDRAW / xmax;
74 ay = y_max - y_shift;
75 label_curve (cr, cxy[0] + u + v, 0, 1, this_curve);
76 break;
77 case 2:
78 ax = x_min - x_shift + (u + v) * XDRAW / xmax;
79 ay = y_min + y_shift;
80 label_curve (cr, cxy[0] + u + v, 0, 0, this_curve);
81 ax = x_min - x_shift + (u + v) * XDRAW / xmax;
82 ay = y_max - y_shift;
83 label_curve (cr, cxy[0] + u + v, 0, 1, this_curve);
84 break;
85 }
86 switch (tickpos)
87 {
88 case 0:
89 cairo_move_to(cr, x_min + (u + v) * XDRAW / xmax, y_min);
90 cairo_line_to(cr, x_min + (u + v) * XDRAW / xmax, y_min + amajt);
91 break;
92 case 1:
93 cairo_move_to(cr, x_min + (u + v) * XDRAW / xmax, y_max);
94 cairo_line_to(cr, x_min + (u + v) * XDRAW / xmax, y_max - amajt);
95 break;
96 case 2:
97 cairo_move_to(cr, x_min + (u + v) * XDRAW / xmax, y_min);
98 cairo_line_to(cr, x_min + (u + v) * XDRAW / xmax, y_min + amajt);
99 cairo_move_to(cr, x_min + (u + v) * XDRAW / xmax, y_max);
100 cairo_line_to(cr, x_min + (u + v) * XDRAW / xmax, y_max - amajt);
101 break;
102 }
103 }
104 }
105 cairo_stroke (cr);
106
107 for (u = v ; u > mticks / nticks ; u -= mticks / nticks);
108 v = u;
109 for ( u = 0.0 ; u < xmax ; u = u + mticks / nticks )
110 {
111 if (x_min + (u + v) * XDRAW / xmax <= x_max)
112 {
113 if (dogrid)
114 {
115 cairo_stroke(cr);
116 cairo_set_dash (cr, pdashed, lenp, 0.0);
117 cairo_set_line_width (cr, GRIDSIZE);
118 cairo_move_to(cr, x_min + (u + v) * XDRAW / xmax, y_min);
119 cairo_line_to(cr, x_min + (u + v)* XDRAW / xmax, y_max);
120 cairo_stroke(cr);
121 prep_frame (cr, this_curve -> frame_dash, this_curve -> frame_thickness, this_curve -> frame_color);
122 }
123 if (fmod(u+v, mticks) != 0.0)
124 {
125 switch (tickpos)
126 {
127 case 0:
128 cairo_move_to(cr, x_min + (u + v) * XDRAW / xmax, y_min);
129 cairo_line_to(cr, x_min + (u + v) * XDRAW / xmax, y_min + amint);
130 break;
131 case 1:
132 cairo_move_to(cr, x_min + (u + v) * XDRAW / xmax, y_max);
133 cairo_line_to(cr, x_min + (u + v) * XDRAW / xmax, y_max - amint);
134 break;
135 case 2:
136 cairo_move_to(cr, x_min + (u + v) * XDRAW / xmax, y_min);
137 cairo_line_to(cr, x_min + (u + v) * XDRAW / xmax, y_min + amint);
138 cairo_move_to(cr, x_min + (u + v) * XDRAW / xmax, y_max);
139 cairo_line_to(cr, x_min + (u + v) * XDRAW / xmax, y_max - amint);
140 break;
141 }
142 }
143 }
144 cairo_stroke(cr);
145 }
146}
147
159void setup_xaxis_log (cairo_t * cr, Curve * this_curve, int rid, int cid, gboolean draw_it)
160{
161 int i, k, l;
162 gboolean istrue;
163 double v;
164 istrue = TRUE;
165 xlog = 1;
166 if (cxy[0] != 0.0)
167 {
168 k = (xmax+cxy[0])/cxy[0];
169 }
170 while (istrue)
171 {
172 k = k/10;
173 if (k > 0)
174 {
175 xlog ++;
176 }
177 else
178 {
179 istrue = FALSE;
180 }
181 }
182 istrue = TRUE;
183 dxlog = 0;
184 i = 100;
185 while (istrue)
186 {
187 if (cxy[0] >= pow(10, i))
188 {
189 istrue = FALSE;
190 dxlog --;
191 }
192 else
193 {
194 dxlog ++;
195 i=i-1;
196 }
197 }
198 dxlog = dxlog - 100;
199 if (draw_it)
200 {
201 for ( l = 0 ; l < xlog ; l = l + 1 )
202 {
203 v = pow (10, l-dxlog);
204 if (dogrid)
205 {
206 cairo_stroke(cr);
207 cairo_set_line_width (cr, GRIDSIZE);
208 cairo_set_dash (cr, pdashed, lenp, 0.0);
209 cairo_move_to(cr, x_min + l * XDRAW / xlog, y_min);
210 cairo_line_to(cr, x_min + l * XDRAW / xlog, y_max);
211 cairo_stroke(cr);
212 prep_frame (cr, this_curve -> frame_dash,
213 this_curve -> frame_thickness,
214 this_curve -> frame_color);
215 }
216 switch (labpos)
217 {
218 case 0:
219 ax = x_min - x_shift + l * XDRAW / xlog;
220 ay = y_min + y_shift;
221 label_curve (cr, v, 0, 0, this_curve);
222 break;
223 case 1:
224 ax = x_min - x_shift + l * XDRAW / xlog;
225 ay = y_max - y_shift;
226 label_curve (cr, v, 0, 1, this_curve);
227 break;
228 case 2:
229 ax = x_min - x_shift + l * XDRAW / xlog;
230 ay = y_min + y_shift;
231 label_curve (cr, v, 0, 0, this_curve);
232 ax = x_min - x_shift + l * XDRAW / xlog;
233 ay = y_max - y_shift;
234 label_curve (cr, v, 0, 1, this_curve);
235 break;
236 }
237 switch (tickpos)
238 {
239 case 0:
240 cairo_move_to(cr, x_min + l * XDRAW / xlog, y_min);
241 cairo_line_to(cr, x_min + l * XDRAW / xlog, y_min + amajt);
242 break;
243 case 1:
244 cairo_move_to(cr, x_min + l * XDRAW / xlog, y_max);
245 cairo_line_to(cr, x_min + l * XDRAW / xlog, y_max - amajt);
246 break;
247 case 2:
248 cairo_move_to(cr, x_min + l * XDRAW / xlog, y_min);
249 cairo_line_to(cr, x_min + l * XDRAW / xlog, y_min + amajt);
250 cairo_move_to(cr, x_min + l * XDRAW / xlog, y_max);
251 cairo_line_to(cr, x_min + l * XDRAW / xlog, y_max - amajt);
252 break;
253 }
254 for ( k = 2 ; k < 10 ; k = k + 1 )
255 {
256 if (dogrid)
257 {
258 cairo_stroke(cr);
259 cairo_set_line_width (cr, GRIDSIZE);
260 cairo_set_dash (cr, pdashed, lenp, 0.0);
261 cairo_move_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_min);
262 cairo_line_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_max);
263 cairo_stroke(cr);
264 prep_frame (cr, this_curve -> frame_dash,
265 this_curve -> frame_thickness,
266 this_curve -> frame_color);
267 }
268 switch (tickpos)
269 {
270 case 0:
271 cairo_move_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_min);
272 cairo_line_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_min + amint);
273 break;
274 case 1:
275 cairo_move_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_max);
276 cairo_line_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_max - amint);
277 break;
278 case 2:
279 cairo_move_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_min);
280 cairo_line_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_min + amint);
281 cairo_move_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_max);
282 cairo_line_to(cr, x_min + XDRAW * (l + log(k) / log(10.0)) / xlog, y_max - amint);
283 break;
284 }
285 }
286 }
287 cairo_stroke (cr);
288 }
289}
int tickpos
Definition curve.c:84
int xlog
Definition curve.c:75
int labpos
Definition curve.c:84
double ay
Definition curve.c:71
double cxy[2]
Definition curve.c:72
double xmax
Definition curve.c:68
double mticks
Definition curve.c:73
const double pdashed[]
Definition curve.c:125
double XDRAW
Definition curve.c:66
int amajt
Definition curve.c:83
double y_max
Definition curve.c:70
double x_max
Definition curve.c:69
gboolean dogrid
Definition curve.c:81
double ax
Definition curve.c:71
int lenp
Definition curve.c:126
double y_min
Definition curve.c:70
int dxlog
Definition curve.c:76
int nticks
Definition curve.c:74
int x_shift
Definition curve.c:82
int amint
Definition curve.c:83
double x_min
Definition curve.c:69
int y_shift
Definition curve.c:82
Variable declarations for the curve widget Functions for interactions with the curve widget.
void label_curve(cairo_t *cr, double val, int axe, int p, Curve *this_curve)
draw axis label
Definition labels.c:56
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...
void setup_xaxis_linear(cairo_t *cr, Curve *this_curve)
setup x axis using a linear scale
Definition xaxis.c:52
void setup_xaxis_log(cairo_t *cr, Curve *this_curve, int rid, int cid, gboolean draw_it)
setup x axis using a log scale
Definition xaxis.c:159