-
Notifications
You must be signed in to change notification settings - Fork 2
/
Surface.cpp
73 lines (60 loc) · 1.86 KB
/
Surface.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <cmath>
#include <limits>
#include "Surface.h"
void surface::scoreTally(Part_ptr p , double xs) {
// for each EstimatorCollection
// for each attribute
// get the index of the Estimator to score
// score the estimator
};
void surface::endTallyHist() {
for(auto est : estimators) {
est->endHist();
}
};
double plane::eval( point p ) {
return a * p.x + b * p.y + c * p.z - d;
}
double plane::distance( point p, point u ) {
double dist = ( d - a * p.x - b * p.y - c * p.z ) / ( a * u.x + b * u.y + c * u.z );
if ( dist > 0.0 ) { return dist; }
else { return std::numeric_limits<double>::max(); }
}
point plane::getNormal(point pt){
if(eval(pt) == 0) {
point normal(a , b , c);
return( normal / std::sqrt(normal * normal) );
}
else {
// if the point is not on the surface, return a null vector
// client must check for this condition
point p(0 , 0 ,0);
return(p);
}
}
double sphere::eval( point p ) {
return std::pow( p.x - x0, 2 ) + std::pow( p.y - y0, 2 ) + std::pow( p.z - z0, 2 ) - rad*rad;
}
double sphere::distance( point p, point u ) {
// difference between each coordinate and current point
point q( p.x - x0, p.y - y0, p.z - z0 );
double b = 2.0 * ( q.x * u.x + q.y * u.y + q.z * u.z);
double c = eval( p );
return Utility::quadSolve( 1.0, b, c );
}
point sphere::getNormal(point pt){
// check if the crossing point is on the surface
if(eval(pt) == 0) {
// make a point at the center of the sphere
point center(x0 , y0 , z0);
// make an outward facing surface normal ray from the center to the edge
ray normal(pt , center - pt);
return(normal.dir);
}
else {
// if the point is not on the surface, return a null vector
// client must check for this condition
point p(0 , 0 ,0);
return(p);
}
}