41 using vec3 = std::array<double, 3>;
42 using mat3 = std::array<vec3, 3>;
43 using vec36 = std::array<vec3, 6>;
44 using vec32 = std::array<vec3, 2>;
47 const vec3 orientation_;
52 const double amplitude_;
57 return {vec3({
ca, -
sa, 0.0}), vec3({
sa,
ca, 0.0}), vec3({0.0, 0.0, 1.0})};
60 mat3 pitch(
double b) {
63 return {vec3({
cb, 0.0,
sb}), vec3({0.0, 1.0, 0.0}), vec3({-
sb, 0.0,
cb})};
69 return {vec3({1.0, 0.0, 0.0}), vec3({0.0,
cc, -
sc}), vec3({0.0,
sc,
cc})};
72 mat3 mult3(
const mat3 &
A,
const mat3 &
B) {
74 for (
int i = 0;
i < 3;
i++) {
75 for (
int j = 0;
j < 3;
j++) {
76 for (
int k = 0;
k < 3;
k++) {
84 vec3 mult3(
const mat3 &
A,
const vec3 &
b) {
86 for (
int i = 0;
i < 3;
i++) {
87 for (
int j = 0;
j < 3;
j++) {
95 const double s = 1.0 /
sqrt(2.0);
96 const vec3
q1 = {
s,
s, 0};
97 const vec3
q2 = {
s, 0,
s};
98 const vec3
q3 = {0,
s,
s};
99 const vec3
q4 = {
s, 0, -
s};
100 const vec3
q5 = {
s, -
s, 0};
101 const vec3
q6 = {0,
s, -
s};
105 mat3
R = mult3(
Ra, mult3(
Rb,
Rc));
106 const vec36
q = {mult3(
R,
q1), mult3(
R,
q2), mult3(
R,
q3),
107 mult3(
R,
q4), mult3(
R,
q5), mult3(
R,
q6)};
120 inline bool is_inside_bbox(
const vec3 &
location)
const {
121 const vec32
bbox = get_bbox();
127 double get_radius()
const {
return radius_; }
128 double get_rho()
const {
return rho_; }
129 double get_amplitude()
const {
return amplitude_; }
130 vec3 get_location()
const {
return location_; }
131 vec36 get_q()
const {
return q_; }
132 vec32 get_bbox()
const {
return bbox_; }
141 bool is_inside(
const vec3 &
X)
const {
147 const vec3
Y = get_location();
148 double x =
X[0] -
Y[0];
149 double y =
X[1] -
Y[1];
150 double z =
X[2] -
Y[2];
151 double r = get_radius();
153 return x *
x +
y *
y +
z *
z <
r *
r;
156 double get_value(
const vec3 &
location)
const {
160 double u = get_rho();
161 double a = get_amplitude();
163 for (
int i = 0;
i < 6;
i++) {