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];
25
26public:
27 Coord3i() { v[0] = v[1] = v[2] = -1; }
28 inline int& operator[](int i) { return v[i]; }
29 inline void conv(double* i)
30 {
31 i[0] = v[0];
32 i[1] = v[1];
33 i[2] = v[2];
34 };
35};
36
38{
39 float v[3];
40
41public:
42 inline float& operator[](int i) { return v[i]; }
43 inline void conv(float* i)
44 {
45 i[0] = v[0];
46 i[1] = v[1];
47 i[2] = v[2];
48 };
49 inline void conv(double* i)
50 {
51 i[0] = v[0];
52 i[1] = v[1];
53 i[2] = v[2];
54 };
55};
56
58{
59 double v[3];
60
61public:
62 inline double& operator[](int i) { return v[i]; };
63 inline void conv(int* i)
64 {
65 i[0] = (int)v[0];
66 i[1] = (int)v[1];
67 i[2] = (int)v[2];
68 };
69 inline void conv(float* i)
70 {
71 i[0] = static_cast<float>(v[0]);
72 i[1] = static_cast<float>(v[1]);
73 i[2] = static_cast<float>(v[2]);
74 };
75 inline void conv(double* i)
76 {
77 i[0] = v[0];
78 i[1] = v[1];
79 i[2] = v[2];
80 };
81};
82
83// Euclidean distance between two points
84// TODO: use image pixel spacing
85inline double pointdistance(Coord3i& p1, Coord3i& p2, const double spacing[3])
86{
87 return sqrt(sqr((p1[0] - p2[0]) * spacing[0]) + sqr((p1[1] - p2[1]) * spacing[1]) + sqr((p1[2] - p2[2]) * spacing[2]));
88}
89
90inline void normcrossprod(double* v1, double* v2, double* norm)
91// calculate normalized crossproduct
92{
93 double absval;
94
95 norm[0] = v1[1] * v2[2] - v1[2] * v2[1];
96 norm[1] = v1[2] * v2[0] - v1[0] * v2[2];
97 norm[2] = v1[0] * v2[1] - v1[1] * v2[0];
98
99 absval = sqrt(norm[0] * norm[0] + norm[1] * norm[1] + norm[2] * norm[2]);
100 norm[0] /= absval;
101 norm[1] /= absval;
102 norm[2] /= absval;
103}
104
105// calculate angle between two vectors (0..M_PI), you might want to adjust to 0..M_PI/2
106// range after call via 'if (angle > M_PI/2) angle = M_PI-angle;'
107inline double vectorangle(double* v1, double* v2)
108{
109 double prod = 0, length1 = 0, length2 = 0;
110
111 for (int k = 0; k < 3; k++)
112 {
113 prod += v1[k] * v2[k];
114 length1 += v1[k] * v1[k];
115 length2 += v2[k] * v2[k];
116 }
117 return acos(prod / sqrt(length1 * length2));
118}
119
120// calculate angle between two vectors (0..M_PI), you might want to adjust to 0..M_PI/2
121// range after call via 'if (angle > M_PI/2) angle = M_PI-angle;'
122inline double vectorangle(Coord3d v1, Coord3d v2)
123{
124 double prod = 0, length1 = 0, length2 = 0;
125
126 for (int k = 0; k < 3; k++)
127 {
128 prod += v1[k] * v2[k];
129 length1 += v1[k] * v1[k];
130 length2 += v2[k] * v2[k];
131 }
132 return acos(prod / sqrt(length1 * length2));
133}
134
135inline double vec_length(Coord3d x)
136{
137 return sqrt(sqr(x[0]) + sqr(x[1]) + sqr(x[2]));
138}
139
140inline double vec_length(double* x)
141{
142 return sqrt(sqr(x[0]) + sqr(x[1]) + sqr(x[2]));
143}
144
145inline double vec_length(double* x, double* y)
146{
147 return sqrt(sqr(x[0] - y[0]) + sqr(x[1] - y[1]) + sqr(x[2] - y[2]));
148}
149
150// transform and check index, returns 0 on success and 1 if corrected location
151inline int transWorldToImage(Coord3d loc_world, int* loc_img, double* origin, int* dims, double voxelsize)
152{
153 int adjust = 0;
154
155 for (int i = 0; i < 3; i++)
156 {
157 loc_img[i] = (int)((loc_world[i] - origin[i]) / voxelsize);
158 if (loc_img[i] < 0)
159 {
160 adjust = 1;
161 loc_img[i] = 0;
162 }
163 if (loc_img[i] >= dims[i])
164 {
165 loc_img[i] = dims[i] - 1;
166 adjust = 1;
167 }
168 }
169
170 return adjust;
171}
172
173inline int transWorldToImage(double* loc_world, int* loc_img, double* origin, int* dims, double voxelsize)
174// transform and check index, returns 0 on success and 1 if corrected location
175{
176 int adjust = 0;
177
178 for (int i = 0; i < 3; i++)
179 {
180 loc_img[i] = (int)((loc_world[i] - origin[i]) / voxelsize);
181 if (loc_img[i] < 0)
182 {
183 adjust = 1;
184 loc_img[i] = 0;
185 }
186 if (loc_img[i] >= dims[i])
187 {
188 loc_img[i] = dims[i] - 1;
189 adjust = 1;
190 }
191 }
192
193 return adjust;
194}
195
196#endif
void conv(float *i)
Definition coordTypes.h:69
double & operator[](int i)
Definition coordTypes.h:62
void conv(double *i)
Definition coordTypes.h:75
void conv(int *i)
Definition coordTypes.h:63
void conv(double *i)
Definition coordTypes.h:49
float & operator[](int i)
Definition coordTypes.h:42
void conv(float *i)
Definition coordTypes.h:43
int & operator[](int i)
Definition coordTypes.h:28
void conv(double *i)
Definition coordTypes.h:29
double pointdistance(Coord3i &p1, Coord3i &p2, const double spacing[3])
Definition coordTypes.h:85
double vec_length(Coord3d x)
Definition coordTypes.h:135
double vectorangle(double *v1, double *v2)
Definition coordTypes.h:107
int transWorldToImage(Coord3d loc_world, int *loc_img, double *origin, int *dims, double voxelsize)
Definition coordTypes.h:151
void normcrossprod(double *v1, double *v2, double *norm)
Definition coordTypes.h:90
T sqr(T x)
Definition misc.h:65