Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/post/src/glaux/vect3d.c
3203 views
1
/* vect3d.c */
2
3
/* Routines to manipulate 3 dimensional vectors. All these routines
4
* should work even if the input and output vectors are the same.
5
*/
6
7
#include <stdio.h>
8
#include <stdlib.h>
9
#include <math.h>
10
11
#include <GL/gl.h>
12
#include <GL/glu.h>
13
14
#include "3d.h"
15
16
#if defined(__cplusplus) || defined(c_plusplus)
17
#define class c_class
18
#endif
19
20
void (*errfunc)(char *) = 0;
21
22
void seterrorfunc(void (*func)(char *))
23
{
24
errfunc = func;
25
}
26
27
void glaux_error(char *s)
28
{
29
if (errfunc)
30
(*errfunc)(s);
31
else {
32
fprintf(stderr, s);
33
fprintf(stderr, "\n");
34
exit(1);
35
}
36
}
37
38
void diff3(GLdouble p[3], GLdouble q[3], GLdouble diff[3])
39
{
40
diff[0] = p[0] - q[0];
41
diff[1] = p[1] - q[1];
42
diff[2] = p[2] - q[2];
43
}
44
45
void add3(GLdouble p[3], GLdouble q[3], GLdouble sum[3])
46
{
47
sum[0] = p[0] + q[0];
48
sum[1] = p[1] + q[1];
49
sum[2] = p[2] + q[2];
50
}
51
52
void scalarmult(GLdouble s, GLdouble v[3], GLdouble vout[3])
53
{
54
vout[0] = v[0]*s;
55
vout[1] = v[1]*s;
56
vout[2] = v[2]*s;
57
}
58
59
GLdouble dot3(GLdouble p[3], GLdouble q[3])
60
{
61
return p[0]*q[0] + p[1]*q[1] + p[2]*q[2];
62
}
63
64
GLdouble length3(GLdouble v[3])
65
{
66
return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
67
}
68
69
GLdouble dist3(GLdouble p[3], GLdouble q[3])
70
{
71
GLdouble d[3];
72
73
diff3(p, q, d);
74
return length3(d);
75
}
76
77
void copy3(GLdouble old[3], GLdouble new[3])
78
{
79
new[0] = old[0], new[1] = old[1], new[2] = old[2];
80
}
81
82
void crossprod(GLdouble v1[3], GLdouble v2[3], GLdouble prod[3])
83
{
84
GLdouble p[3]; /* in case prod == v1 or v2 */
85
86
p[0] = v1[1]*v2[2] - v2[1]*v1[2];
87
p[1] = v1[2]*v2[0] - v2[2]*v1[0];
88
p[2] = v1[0]*v2[1] - v2[0]*v1[1];
89
prod[0] = p[0]; prod[1] = p[1]; prod[2] = p[2];
90
}
91
92
void normalize(GLdouble v[3])
93
{
94
GLdouble d;
95
96
d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
97
if (d == 0.0) {
98
glaux_error("normalize: zero length vector");
99
v[0] = d = 1.0;
100
}
101
d = 1/d;
102
v[0] *= d; v[1] *= d; v[2] *= d;
103
}
104
105
void print3(GLdouble v[3])
106
{
107
GLdouble len;
108
109
len = length3(v);
110
printf("(%g %g %g); len: %g\n", v[0], v[1], v[2], len);
111
}
112
113
void printmat3(GLdouble m[3][3])
114
{
115
int i, j;
116
117
for (i=0; i<3; i++) {
118
for (j=0; j<3; j++)
119
printf("%7.4f ", m[i][j]);
120
printf("\n");
121
}
122
}
123
124
void identifymat3(GLdouble m[3][3])
125
{
126
int i, j;
127
128
for (i=0; i<3; i++)
129
for (j=0; j<3; j++)
130
m[i][j] = (i == j) ? 1.0 : 0.0;
131
}
132
133
void copymat3(GLdouble *to, GLdouble *from)
134
{
135
int i;
136
137
for (i=0; i<9; i++) {
138
*to++ = *from++;
139
}
140
}
141
142
void xformvec3(GLdouble v[3], GLdouble m[3][3], GLdouble vm[3])
143
{
144
GLdouble result[3]; /* in case v == vm */
145
int i;
146
147
for (i=0; i<3; i++) {
148
result[i] = v[0]*m[0][i] + v[1]*m[1][i] + v[2]*m[2][i];
149
}
150
for (i=0; i<3; i++) {
151
vm[i] = result[i];
152
}
153
}
154
155
long samepoint(GLdouble p1[3], GLdouble p2[3])
156
{
157
if (p1[0] == p2[0] && p1[1] == p2[1] && p1[2] == p2[2])
158
return 1;
159
return 0;
160
}
161
162
void perpnorm(GLdouble p1[3], GLdouble p2[3], GLdouble p3[3], GLdouble n[3])
163
{
164
GLdouble d1[3], d2[3];
165
166
diff3(p2, p1, d1);
167
diff3(p2, p3, d2);
168
crossprod(d1, d2, n);
169
normalize(n);
170
}
171
172
173