Slicer 5.9
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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