Slicer 5.9
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
coordTypes.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Extract Skeleton
4 Module: $HeadURL$
5 Language: C++
6 Date: $Date$
7 Version: $Revision$
8
9 Copyright (c) Brigham and Women's Hospital (BWH) All Rights Reserved.
10
11 See License.txt or http://www.slicer.org/copyright/copyright.txt for details.
12
13==========================================================================*/
14
15#ifndef COORD_TYPES_H
16#define COORD_TYPES_H
17
18#include "math.h"
19
20#include "misc.h"
21
23{
24 int v[3];
25public:
27 {
28 v[0] = v[1] = v[2] = -1;
29 }
30 inline int & operator[](int i)
31 {
32 return v[i];
33 }
34 inline void conv(double * i)
35 {
36 i[0] = v[0]; i[1] = v[1]; i[2] = v[2];
37 };
38};
39
41{
42 float v[3];
43public:
44 inline float & operator[](int i)
45 {
46 return v[i];
47 }
48 inline void conv(float * i)
49 {
50 i[0] = v[0]; i[1] = v[1]; i[2] = v[2];
51 };
52 inline void conv(double * i)
53 {
54 i[0] = v[0]; i[1] = v[1]; i[2] = v[2];
55 };
56};
57
59{
60 double v[3];
61public:
62 inline double & operator[](int i)
63 {
64 return v[i];
65 };
66 inline void conv(int * i)
67 {
68 i[0] = (int) v[0]; i[1] = (int) v[1]; i[2] = (int) v[2];
69 };
70 inline void conv(float * i)
71 {
72 i[0] = static_cast<float>(v[0]); i[1] = static_cast<float>(v[1]); i[2] = static_cast<float>(v[2]);
73 };
74 inline void conv(double * i)
75 {
76 i[0] = v[0]; i[1] = v[1]; i[2] = v[2];
77 };
78};
79
80// Euclidean distance between two points
81// TODO: use image pixel spacing
82inline double pointdistance(Coord3i &p1, Coord3i &p2, const double spacing[3])
83{
84 return sqrt(
85 sqr((p1[0] - p2[0]) * spacing[0])
86 + sqr((p1[1] - p2[1]) * spacing[1])
87 + sqr((p1[2] - p2[2]) * spacing[2])
88 );
89}
90
91inline void normcrossprod(double *v1, double *v2, double *norm)
92// calculate normalized crossproduct
93{
94 double absval;
95
96 norm[0] = v1[1] * v2[2] - v1[2] * v2[1];
97 norm[1] = v1[2] * v2[0] - v1[0] * v2[2];
98 norm[2] = v1[0] * v2[1] - v1[1] * v2[0];
99
100 absval = sqrt(norm[0] * norm[0] + norm[1] * norm[1] + norm[2] * norm[2]);
101 norm[0] /= absval;
102 norm[1] /= absval;
103 norm[2] /= absval;
104}
105
106// calculate angle between two vectors (0..M_PI), you might want to adjust to 0..M_PI/2
107// range after call via 'if (angle > M_PI/2) angle = M_PI-angle;'
108inline double vectorangle(double *v1, double *v2)
109{
110 double prod = 0, length1 = 0, length2 = 0;
111
112 for( int k = 0; k < 3; k++ )
113 {
114 prod += v1[k] * v2[k];
115 length1 += v1[k] * v1[k];
116 length2 += v2[k] * v2[k];
117 }
118 return acos(prod / sqrt(length1 * length2) );
119}
120
121// calculate angle between two vectors (0..M_PI), you might want to adjust to 0..M_PI/2
122// range after call via 'if (angle > M_PI/2) angle = M_PI-angle;'
123inline double vectorangle(Coord3d v1, Coord3d v2)
124{
125 double prod = 0, length1 = 0, length2 = 0;
126
127 for( int k = 0; k < 3; k++ )
128 {
129 prod += v1[k] * v2[k];
130 length1 += v1[k] * v1[k];
131 length2 += v2[k] * v2[k];
132 }
133 return acos(prod / sqrt(length1 * length2) );
134}
135
136inline double vec_length(Coord3d x)
137{
138 return sqrt(sqr(x[0]) + sqr(x[1]) + sqr(x[2]) );
139}
140
141inline double vec_length(double *x)
142{
143 return sqrt(sqr(x[0]) + sqr(x[1]) + sqr(x[2]) );
144}
145
146inline double vec_length(double *x, double *y)
147{
148 return sqrt(sqr(x[0] - y[0]) + sqr(x[1] - y[1]) + sqr(x[2] - y[2]) );
149}
150
151// transform and check index, returns 0 on success and 1 if corrected location
152inline int transWorldToImage(Coord3d loc_world, int *loc_img,
153 double *origin, int *dims, double voxelsize)
154{
155 int adjust = 0;
156
157 for( int i = 0; i < 3; i++ )
158 {
159 loc_img[i] = (int) ( (loc_world[i] - origin[i]) / voxelsize);
160 if( loc_img[i] < 0 )
161 {
162 adjust = 1; loc_img[i] = 0;
163 }
164 if( loc_img[i] >= dims[i] )
165 {
166 loc_img[i] = dims[i] - 1; adjust = 1;
167 }
168 }
169
170 return adjust;
171}
172
173inline int transWorldToImage(double *loc_world, int *loc_img,
174 double *origin, int *dims, double voxelsize)
175// transform and check index, returns 0 on success and 1 if corrected location
176{
177 int adjust = 0;
178
179 for( int i = 0; i < 3; i++ )
180 {
181 loc_img[i] = (int) ( (loc_world[i] - origin[i]) / voxelsize);
182 if( loc_img[i] < 0 )
183 {
184 adjust = 1; loc_img[i] = 0;
185 }
186 if( loc_img[i] >= dims[i] )
187 {
188 loc_img[i] = dims[i] - 1; adjust = 1;
189 }
190 }
191
192 return adjust;
193}
194
195#endif
void conv(float *i)
Definition coordTypes.h:70
double & operator[](int i)
Definition coordTypes.h:62
void conv(double *i)
Definition coordTypes.h:74
void conv(int *i)
Definition coordTypes.h:66
void conv(double *i)
Definition coordTypes.h:52
float & operator[](int i)
Definition coordTypes.h:44
void conv(float *i)
Definition coordTypes.h:48
int & operator[](int i)
Definition coordTypes.h:30
void conv(double *i)
Definition coordTypes.h:34
double pointdistance(Coord3i &p1, Coord3i &p2, const double spacing[3])
Definition coordTypes.h:82
double vec_length(Coord3d x)
Definition coordTypes.h:136
double vectorangle(double *v1, double *v2)
Definition coordTypes.h:108
int transWorldToImage(Coord3d loc_world, int *loc_img, double *origin, int *dims, double voxelsize)
Definition coordTypes.h:152
void normcrossprod(double *v1, double *v2, double *norm)
Definition coordTypes.h:91
T sqr(T x)
Definition misc.h:64