27 double second_point[3];
30 if (fabs(fabs(point_coords[2]) - 1.0) <
tol) {
34 }
else if (point_coords[2] > 0) {
44 int through_cell_corner;
46 through_cell_corner = 0;
59 point_coords, second_point, p, q);
62 if ((ret_value == -1) || (ret_value == 0))
continue;
65 if ((ret_value & ((1 << 0) + (1 << 2))) != (1 << 0) + (1 << 2)) {
68 if ((ret_value & ((1 << 1) + (1 << 3))) == (1 << 1) + (1 << 3))
69 p[0] = q[0], p[1] = q[1], p[2] = q[2];
105 edge_crossings += through_cell_corner / 2;
109 return ( (edge_crossings & 1) || (through_cell_corner & 1) );
119 double cross_edges[3][3];
125 double sq_sin_edge[3] = {
126 cross_edges[0][0] * cross_edges[0][0] +
127 cross_edges[0][1] * cross_edges[0][1] +
128 cross_edges[0][2] * cross_edges[0][2],
129 cross_edges[1][0] * cross_edges[1][0] +
130 cross_edges[1][1] * cross_edges[1][1] +
131 cross_edges[1][2] * cross_edges[1][2],
132 cross_edges[2][0] * cross_edges[2][0] +
133 cross_edges[2][1] * cross_edges[2][1] +
134 cross_edges[2][2] * cross_edges[2][2]};
145 double sin_point_edge[3] = {
146 cross_edges[0][0] * point_coords[0] +
147 cross_edges[0][1] * point_coords[1] +
148 cross_edges[0][2] * point_coords[2],
149 cross_edges[1][0] * point_coords[0] +
150 cross_edges[1][1] * point_coords[1] +
151 cross_edges[1][2] * point_coords[2],
152 cross_edges[2][0] * point_coords[0] +
153 cross_edges[2][1] * point_coords[1] +
154 cross_edges[2][2] * point_coords[2]};
156 int cell_corner_order =
157 cross_edges[0][0] * c[0] + cross_edges[0][1] * c[1] + cross_edges[0][2] * c[2] >= 0;
159 if (cell_corner_order)
180 double sin_point_edge_1 =
181 cross_edges[1][0] * point_coords[0] +
182 cross_edges[1][1] * point_coords[1] +
183 cross_edges[1][2] * point_coords[2];
200 double sin_point_edge_0 =
201 cross_edges[0][0] * point_coords[0] +
202 cross_edges[0][1] * point_coords[1] +
203 cross_edges[0][2] * point_coords[2];
352 double sq_sin_edge[4] = {
353 cross[0][0]*cross[0][0]+cross[0][1]*cross[0][1]+cross[0][2]*cross[0][2],
354 cross[1][0]*cross[1][0]+cross[1][1]*cross[1][1]+cross[1][2]*cross[1][2],
355 cross[2][0]*cross[2][0]+cross[2][1]*cross[2][1]+cross[2][2]*cross[2][2],
356 cross[3][0]*cross[3][0]+cross[3][1]*cross[3][1]+cross[3][2]*cross[3][2]};
int yac_intersect_vec(enum yac_edge_type edge_type_a, double const a[3], double const b[3], enum yac_edge_type edge_type_b, double const c[3], double const d[3], double p[3], double q[3])