3 void hkl_svector_fprintf(FILE * file
, struct hkl_svector
const * v
)
5 fprintf(file
, "|%f, %f, %f|", v
->data
[0], v
->data
[1], v
->data
[2]);
8 int hkl_svector_cmp(struct hkl_svector
const * v
, struct hkl_svector
const * v1
)
13 if ( fabs(v
->data
[i
] - v1
->data
[i
]) > HKL_EPSILON
)
18 void hkl_svector_minus_svector(struct hkl_svector
* v
, struct hkl_svector
const * v1
)
22 v
->data
[i
] -= v1
->data
[i
];
25 void hkl_svector_div_double(struct hkl_svector
* v
, double const d
)
32 void hkl_svector_times_double(struct hkl_svector
* v
, double const d
)
39 void hkl_svector_times_svector(struct hkl_svector
* v
, struct hkl_svector
const * v1
)
43 v
->data
[i
] *= v1
->data
[i
];
46 void hkl_svector_times_smatrix(struct hkl_svector
* v
, struct hkl_smatrix
const * m
)
48 struct hkl_svector tmp
;
51 v
->data
[0] = tmp
.data
[0] * m
->data
[0][0] + tmp
.data
[1] * m
->data
[1][0] + tmp
.data
[2] * m
->data
[2][0];
52 v
->data
[1] = tmp
.data
[0] * m
->data
[0][1] + tmp
.data
[1] * m
->data
[1][1] + tmp
.data
[2] * m
->data
[2][1];
53 v
->data
[2] = tmp
.data
[0] * m
->data
[0][2] + tmp
.data
[1] * m
->data
[1][2] + tmp
.data
[2] * m
->data
[2][2];
56 double hkl_svector_sum(struct hkl_svector
const * v
)
58 return v
->data
[0] + v
->data
[1] + v
->data
[2];
61 double hkl_svector_scalar_product(struct hkl_svector
const * v
, struct hkl_svector
const * v1
)
67 scalar
+= v
->data
[i
] * v1
->data
[i
];
71 void hkl_svector_vectorial_product(struct hkl_svector
* v
, struct hkl_svector
const * v1
)
73 struct hkl_svector tmp
;
76 v
->data
[0] = tmp
.data
[1] * v1
->data
[2] - tmp
.data
[2] * v1
->data
[1];
77 v
->data
[1] = tmp
.data
[2] * v1
->data
[0] - tmp
.data
[0] * v1
->data
[2];
78 v
->data
[2] = tmp
.data
[0] * v1
->data
[1] - tmp
.data
[1] * v1
->data
[0];
82 double hkl_svector_angle(struct hkl_svector
const * v
, struct hkl_svector
const * v1
)
85 double norm
= hkl_svector_norm2(v
) * hkl_svector_norm2(v1
);
87 double cosinus_angle
= hkl_svector_scalar_product(v
, v1
) / norm
;
90 if (cosinus_angle
>= 1 )
93 if (cosinus_angle
<= -1 )
96 angle
= acos(cosinus_angle
);
101 double hkl_svector_norm2(struct hkl_svector
const * v
)
103 return sqrt(v
->data
[0] * v
->data
[0] + v
->data
[1] * v
->data
[1] + v
->data
[2] * v
->data
[2]);
107 * @brief normalize a hkl_svector
108 * @return true if the hkl_svector can be normalized, false otherwise
109 * @todo check the status
111 int hkl_svector_normalize(struct hkl_svector
* v
)
113 int status
= HKL_FAIL
;
115 double norm
= hkl_svector_norm2(v
);
116 if ( norm
> HKL_EPSILON
)
118 hkl_svector_div_double(v
, norm
);
119 status
= HKL_SUCCESS
;
125 int hkl_svector_is_colinear(struct hkl_svector
const * v
, struct hkl_svector
const * v1
)
128 struct hkl_svector tmp
= *v
;
130 hkl_svector_vectorial_product(&tmp
, v1
);
131 if (hkl_svector_norm2(&tmp
) < HKL_EPSILON
)
138 void hkl_svector_randomize(struct hkl_svector
* v
)
140 v
->data
[0] = -1 + 2 * rand()/(RAND_MAX
+1.0);
141 v
->data
[1] = -1 + 2 * rand()/(RAND_MAX
+1.0);
142 v
->data
[2] = -1 + 2 * rand()/(RAND_MAX
+1.0);
145 void hkl_svector_randomize_svector(struct hkl_svector
* v
, struct hkl_svector
const * v1
)
148 hkl_svector_randomize(v
);
149 while (hkl_svector_cmp(v
, v1
) == HKL_TRUE
);
152 void hkl_svector_randomize_svector_svector(struct hkl_svector
* v
, struct hkl_svector
const * v1
, struct hkl_svector
const * v2
)
155 hkl_svector_randomize(v
);
156 while (hkl_svector_cmp(v
, v1
) == HKL_TRUE
|| hkl_svector_cmp(v
, v2
) == HKL_TRUE
);
160 void hkl_svector_rotated_around_vector(struct hkl_svector
* v
, struct hkl_svector
const * axe
, double angle
)
162 double c
= cos(angle
);
163 double s
= sin(angle
);
164 struct hkl_svector axe_n
;
165 struct hkl_svector tmp
;
168 hkl_svector_normalize(&axe_n
);
172 v
->data
[0] = (c
+ (1 - c
) * axe_n
.data
[0] * axe_n
.data
[0]) * tmp
.data
[0];
173 v
->data
[0] += ((1 - c
) * axe_n
.data
[0] * axe_n
.data
[1] - axe_n
.data
[2] * s
) * tmp
.data
[1];
174 v
->data
[0] += ((1 - c
) * axe_n
.data
[0] * axe_n
.data
[2] + axe_n
.data
[1] * s
) * tmp
.data
[2];
176 v
->data
[1] = ((1 - c
) * axe_n
.data
[0] * axe_n
.data
[1] + axe_n
.data
[2] * s
) * tmp
.data
[0];
177 v
->data
[1] += (c
+ (1 - c
) * axe_n
.data
[1] * axe_n
.data
[1]) * tmp
.data
[1];
178 v
->data
[1] += ((1 - c
) * axe_n
.data
[1] * axe_n
.data
[2] - axe_n
.data
[0] * s
) * tmp
.data
[2];
180 v
->data
[2] = ((1 - c
) * axe_n
.data
[0] * axe_n
.data
[2] - axe_n
.data
[1] * s
) * tmp
.data
[0];
181 v
->data
[2] += ((1 - c
) * axe_n
.data
[1] * axe_n
.data
[2] + axe_n
.data
[0] * s
) * tmp
.data
[1];
182 v
->data
[2] += (c
+ (1 - c
) * axe_n
.data
[2] * axe_n
.data
[2]) * tmp
.data
[2];
186 * @brief check if the hkl_svector is null
187 * @return true if all |elements| are below HKL_EPSILON, false otherwise
190 int hkl_svector_is_null(struct hkl_svector
const * v
)
194 if ( fabs(v
->data
[i
]) > HKL_EPSILON
)