56 return vector1.
x * vector2.
x + vector1.
y * vector2.
y + vector1.
z * vector2.
z;
63 normal.
x = (vector1.
y * vector2.
z) - (vector2.
y * vector1.
z);
64 normal.
y = (vector2.
x * vector1.
z) - (vector1.
x * vector2.
z);
65 normal.
z = (vector1.
x * vector2.
y) - (vector2.
x * vector1.
y);
72 return sqrt(vector.
x * vector.
x + vector.
y * vector.
y + vector.
z * vector.
z);
75PLANE_EDGE_INTERSECTION PlaneEdgeVertexInterpolate(
float x1,
float y1,
float z1,
float x2,
float y2,
float z2,
S_V_DATA data1,
S_V_DATA data2,
int v1,
int v2,
double p,
EDGE_VECTOR unit_normal_vector,
double D1,
double D2)
93 t = (D -
x1 * unit_normal_vector.
x -
y1 * unit_normal_vector.
y - z1 * unit_normal_vector.
z -
p) / (((
x2 -
x1) * unit_normal_vector.
x) + ((
y2 -
y1) * unit_normal_vector.
y) + ((z2 - z1) * unit_normal_vector.
z));
113 if (D1 > 0 && D2 < 0)
119 t = (D -
x1 * unit_normal_vector.
x -
y1 * unit_normal_vector.
y - z1 * unit_normal_vector.
z -
p) / (((
x2 -
x1) * unit_normal_vector.
x) + ((
y2 -
y1) * unit_normal_vector.
y) + ((z2 - z1) * unit_normal_vector.
z));
143 if (D1 < 0 && D2 == 0)
162 if (D1 == 0 && D2 < 0)
181 if (D1 > 0 && D2 == 0)
200 if (D1 == 0 && D2 > 0)
218 return (intersection);
227 for (vector<PLANE_EDGE_INTERSECTION>::iterator existent_intsec = intsec_vector.begin(); existent_intsec < intsec_vector.end(); ++existent_intsec)
229 if (existent_intsec->intersection_at_vertex1)
231 if (existent_intsec->vertex1 == intsec.
vertex1 || existent_intsec->vertex1 == intsec.
vertex2)
236 else if (existent_intsec->intersection_at_vertex2)
238 if (existent_intsec->vertex1 == intsec.
vertex1 || existent_intsec->vertex1 == intsec.
vertex2)
259 if (existent_intsec->vertex1 == intsec.
vertex1 && existent_intsec->vertex2 == intsec.
vertex2)
265 if (existent_intsec->vertex1 == intsec.
vertex2 && existent_intsec->vertex2 == intsec.
vertex1)
271 if (existent_intsec->vertex1 == intsec.
vertex1 || existent_intsec->vertex2 == intsec.
vertex2 || existent_intsec->vertex1 == intsec.
vertex2 || existent_intsec->vertex2 == intsec.
vertex1)
275 d1.
x = x_coord_in[existent_intsec->vertex1] - x_coord_in[existent_intsec->vertex2];
276 d1.
y = y_coord_in[existent_intsec->vertex1] - y_coord_in[existent_intsec->vertex2];
277 d1.
z = z_coord_in[existent_intsec->vertex1] - z_coord_in[existent_intsec->vertex2];
282 double length1 =
length(d1);
283 double length2 =
length(d2);
284 if ((length1 > 0) && (length2 > 0))
286 double cosangle =
dot_product(d1, d2) / (length1 * length2);
287 if (
fabs(cosangle - 1.0) < 0.0001 ||
fabs(cosangle + 1.0) < 0.0001)
300PLANE_EDGE_INTERSECTION_VECTOR calculate_intersections(
float *udata_in,
float *vdata_in,
float *wdata_in,
int num_elem_in,
int *elem_in,
int num_conn_in,
int *conn_in,
float *x_coord_in,
float *y_coord_in,
float *z_coord_in,
float p,
EDGE_VECTOR unit_normal_vector)
323 for (i = 0; i < num_elem_in; i++)
325 if (i < num_elem_in - 1)
327 end = elem_in[i + 1] - 1;
331 end = num_conn_in - 1;
334 for (j = elem_in[i]; j <=
end; j++)
346 cell_vertex_1.
x = x_coord_in[conn_in[j]];
347 cell_vertex_1.
y = y_coord_in[conn_in[j]];
348 cell_vertex_1.
z = z_coord_in[conn_in[j]];
351 cell_vertex_2.
x = x_coord_in[conn_in[
index]];
352 cell_vertex_2.
y = y_coord_in[conn_in[
index]];
353 cell_vertex_2.
z = z_coord_in[conn_in[
index]];
358 data_vertex1.
v[0] = udata_in[conn_in[j]];
359 data_vertex2.
v[0] = udata_in[conn_in[
index]];
360 if (wdata_in !=
NULL)
362 data_vertex1.
v[1] = vdata_in[conn_in[j]];
363 data_vertex2.
v[1] = vdata_in[conn_in[
index]];
364 data_vertex1.
v[2] = wdata_in[conn_in[j]];
365 data_vertex2.
v[2] = wdata_in[conn_in[
index]];
369 D1 =
dot_product(unit_normal_vector, cell_vertex_1) +
p;
370 D2 =
dot_product(unit_normal_vector, cell_vertex_2) +
p;
377 if (D1 < 0 && D2 > 0)
380 intersec =
PlaneEdgeVertexInterpolate(x_coord_in[conn_in[j]], y_coord_in[conn_in[j]], z_coord_in[conn_in[j]], x_coord_in[conn_in[
index]], y_coord_in[conn_in[
index]], z_coord_in[conn_in[
index]], data_vertex1, data_vertex2, conn_in[j], conn_in[
index],
p, unit_normal_vector, D1, D2);
385 intsec_vector.push_back(intersec);
390 if (D1 > 0 && D2 < 0)
393 intersec =
PlaneEdgeVertexInterpolate(x_coord_in[conn_in[j]], y_coord_in[conn_in[j]], z_coord_in[conn_in[j]], x_coord_in[conn_in[
index]], y_coord_in[conn_in[
index]], z_coord_in[conn_in[
index]], data_vertex1, data_vertex2, conn_in[j], conn_in[
index],
p, unit_normal_vector, D1, D2);
398 intsec_vector.push_back(intersec);
407 if (D1 < 0 && D2 == 0)
410 intersec =
PlaneEdgeVertexInterpolate(x_coord_in[conn_in[j]], y_coord_in[conn_in[j]], z_coord_in[conn_in[j]], x_coord_in[conn_in[
index]], y_coord_in[conn_in[
index]], z_coord_in[conn_in[
index]], data_vertex1, data_vertex2, conn_in[j], conn_in[
index],
p, unit_normal_vector, D1, D2);
415 intsec_vector.push_back(intersec);
420 if (D1 == 0 && D2 < 0)
423 intersec =
PlaneEdgeVertexInterpolate(x_coord_in[conn_in[j]], y_coord_in[conn_in[j]], z_coord_in[conn_in[j]], x_coord_in[conn_in[
index]], y_coord_in[conn_in[
index]], z_coord_in[conn_in[
index]], data_vertex1, data_vertex2, conn_in[j], conn_in[
index],
p, unit_normal_vector, D1, D2);
428 intsec_vector.push_back(intersec);
433 if (D1 > 0 && D2 == 0)
436 intersec =
PlaneEdgeVertexInterpolate(x_coord_in[conn_in[j]], y_coord_in[conn_in[j]], z_coord_in[conn_in[j]], x_coord_in[conn_in[
index]], y_coord_in[conn_in[
index]], z_coord_in[conn_in[
index]], data_vertex1, data_vertex2, conn_in[j], conn_in[
index],
p, unit_normal_vector, D1, D2);
441 intsec_vector.push_back(intersec);
446 if (D1 == 0 && D2 > 0)
449 intersec =
PlaneEdgeVertexInterpolate(x_coord_in[conn_in[j]], y_coord_in[conn_in[j]], z_coord_in[conn_in[j]], x_coord_in[conn_in[
index]], y_coord_in[conn_in[
index]], z_coord_in[conn_in[
index]], data_vertex1, data_vertex2, conn_in[j], conn_in[
index],
p, unit_normal_vector, D1, D2);
454 intsec_vector.push_back(intersec);
459 if (D1 == 0 && D2 == 0)
466 return intsec_vector;
476 for (i = 0; i < intsec_vector.size(); i++)
481 if ((edge_vertex1 == intsec.
vertex1) && (edge_vertex2 == intsec.
vertex2))
486 if ((edge_vertex2 == intsec.
vertex1) && (edge_vertex1 == intsec.
vertex2))
492 if (intsec_vector[i].intersection_at_vertex1 ==
true)
494 if (intsec.
vertex1 == edge_vertex1 || intsec.
vertex1 == edge_vertex2)
502 if (intsec.
vertex2 == edge_vertex1 || intsec.
vertex2 == edge_vertex2)
521 for (vector<PLANE_EDGE_INTERSECTION>::iterator intsec = intsec_vector.begin(); intsec < intsec_vector.end(); ++intsec)
523 if (int_found_flag == 0)
525 if (intsec->intersection_at_vertex1 ==
false && intsec->intersection_at_vertex2 ==
false)
527 if ((edge_vertex1 == intsec->vertex1) && (edge_vertex2 == intsec->vertex2))
533 if ((edge_vertex2 == intsec->vertex1) && (edge_vertex1 == intsec->vertex2))
540 if (intsec->intersection_at_vertex1 ==
true)
542 if (intsec->vertex1 == edge_vertex1 || intsec->vertex1 == edge_vertex2)
549 if (intsec->intersection_at_vertex2 ==
true)
551 if (intsec->vertex2 == edge_vertex1 || intsec->vertex2 == edge_vertex2)
1577 return 1.0 - cosine;
1581 return 3.0 + cosine;
1592 int size = (int)intsec_vector.size();
1595 for (
int i = 0; i <
size; ++i)
1597 capping_contour.
ring.push_back(i);
1609 for (vector<PLANE_EDGE_INTERSECTION>::iterator intsec = intsec_vector.begin(); intsec < intsec_vector.end(); ++intsec)
1611 average.
x += intsec->intersection.x;
1612 average.
y += intsec->intersection.y;
1613 average.
z += intsec->intersection.z;
1615 average.
x /= double(
size);
1616 average.
y /= double(
size);
1617 average.
z /= double(
size);
1620 vector<int> vertex_index_vector;
1621 vector<double> vertex_cosine_vector;
1622 for (
int i = 0; i <
size; ++i)
1624 EDGE_VECTOR current_vector = intsec_vector[i].intersection;
1625 current_vector.
x -= average.
x;
1626 current_vector.
y -= average.
y;
1627 current_vector.
z -= average.
z;
1628 vertex_cosine_vector.push_back(
get_cosine(current_vector, plane_base_x, plane_base_y));
1629 vertex_index_vector.push_back(i);
1636 int smaller_position = 0;
1637 for (
int i = 1; i < vertex_cosine_vector.size(); ++i)
1639 if (vertex_cosine_vector[i] < vertex_cosine_vector[smaller_position])
1641 smaller_position = i;
1645 capping_contour.
ring.push_back(vertex_index_vector[smaller_position]);
1648 vertex_index_vector.erase(vertex_index_vector.begin() + smaller_position);
1649 vertex_cosine_vector.erase(vertex_cosine_vector.begin() + smaller_position);
1650 }
while (capping_contour.
ring.size() <
size);
1653 double lastCosine = 0.;
1654 bool concave =
false;
1656 for (
int i = 0; i <= capping_contour.
ring.size(); ++i)
1658 int vertex_index1 = capping_contour.
ring[concaveVertex = (i) % capping_contour.
ring.size()];
1659 int vertex_index2 = capping_contour.
ring[(i + 1) % capping_contour.
ring.size()];
1660 EDGE_VECTOR intersection1 = intsec_vector[vertex_index1].intersection;
1661 EDGE_VECTOR intersection2 = intsec_vector[vertex_index2].intersection;
1663 current_edge.
x = intersection2.
x - intersection1.
x;
1664 current_edge.
y = intersection2.
y - intersection1.
y;
1665 current_edge.
z = intersection2.
z - intersection1.
z;
1666 double cosine =
get_cosine(current_edge, plane_base_x, plane_base_y);
1670 double diff = cosine - lastCosine;
1679 lastCosine = cosine;
1691 vertex2D.
x = (float)
dot_product(intersection, plane_base_x);
1692 vertex2D.
y = (float)
dot_product(intersection, plane_base_y);
1695 vertices2d.push_back(vertex2D);
1699 capping_contour.
ring.clear();
1701 for (
int i = 0; i <
result.size(); i += 3)
1703 capping_contour.
ring.push_back(
result[i + 0]);
1704 capping_contour.
ring.push_back(
result[i + 1]);
1705 capping_contour.
ring.push_back(
result[i + 2]);
1713 for (vector<PLANE_EDGE_INTERSECTION>::iterator intsec = intsec_vector.begin(); intsec < intsec_vector.end(); ++intsec)
1715 u_data_vector.push_back(intsec->data_vertex_int.v[0]);
1716 if (intsec->data_vertex_int.dimension == 3)
1718 v_data_vector.push_back(intsec->data_vertex_int.v[1]);
1719 w_data_vector.push_back(intsec->data_vertex_int.v[2]);
#define NULL
Definition: covise_list.h:22
GLfixed GLfixed GLfixed y2
Definition: khronos-glext.h:11325
GLuint64EXT * result
Definition: khronos-glext.h:12573
GLfixed y1
Definition: khronos-glext.h:11325
GLsizeiptr size
Definition: khronos-glext.h:6610
GLuint GLuint end
Definition: khronos-glext.h:6343
const GLdouble * v
Definition: khronos-glext.h:6442
GLuint GLfloat GLfloat GLfloat x1
Definition: khronos-glext.h:13144
GLuint index
Definition: khronos-glext.h:6722
GLdouble GLdouble t
Definition: khronos-glext.h:6449
GLfixed GLfixed x2
Definition: khronos-glext.h:11325
GLfloat GLfloat p
Definition: khronos-glext.h:9861
GLenum GLsizei len
Definition: khronos-glext.h:7440
GLfloat GLfloat v1
Definition: khronos-glext.h:6753
GLfloat GLfloat GLfloat v2
Definition: khronos-glext.h:6754
std::vector< int > tr_intVector
Definition: Triangulate.h:24
std::vector< tr_vertex > tr_vertexVector
Definition: Triangulate.h:22
__host__ __device__ float2 fabs(float2 v)
Definition: cutil_math.h:1380
list of all chemical elements
Definition: coConfig.h:27
EDGE_VECTOR cross_product(EDGE_VECTOR &vector1, EDGE_VECTOR &vector2)
Definition: CuttingSurfaceGPMUtil.h:59
std::vector< PLANE_EDGE_INTERSECTION > PLANE_EDGE_INTERSECTION_VECTOR
Definition: CuttingSurfaceGPMUtil.h:51
bool test_plane_edge_intersection(PLANE_EDGE_INTERSECTION_VECTOR &intsec_vector, PLANE_EDGE_INTERSECTION &intsec, float *x_coord_in, float *y_coord_in, float *z_coord_in)
Definition: CuttingSurfaceGPMUtil.h:221
void generate_capping_contour(CONTOUR &capping_contour, PLANE_EDGE_INTERSECTION_VECTOR &intsec_vector, EDGE_VECTOR &plane_base_x, EDGE_VECTOR &plane_base_y, vector< float > &u_data_vector, vector< float > &v_data_vector, vector< float > &w_data_vector)
Definition: CuttingSurfaceGPMUtil.h:1590
int assign_int_index(PLANE_EDGE_INTERSECTION_VECTOR &intsec_vector, int edge_vertex1, int edge_vertex2)
Definition: CuttingSurfaceGPMUtil.h:469
PLANE_EDGE_INTERSECTION PlaneEdgeVertexInterpolate(float x1, float y1, float z1, float x2, float y2, float z2, S_V_DATA data1, S_V_DATA data2, int v1, int v2, double p, EDGE_VECTOR unit_normal_vector, double D1, double D2)
Definition: CuttingSurfaceGPMUtil.h:75
double length(EDGE_VECTOR &vector)
Definition: CuttingSurfaceGPMUtil.h:70
double get_cosine(EDGE_VECTOR &vector, EDGE_VECTOR &plane_base_x, EDGE_VECTOR &plane_base_y)
Definition: CuttingSurfaceGPMUtil.h:1569
double dot_product(EDGE_VECTOR &vector1, EDGE_VECTOR &vector2)
Definition: CuttingSurfaceGPMUtil.h:54
bool find_intersection(PLANE_EDGE_INTERSECTION_VECTOR &intsec_vector, int edge_vertex1, int edge_vertex2)
Definition: CuttingSurfaceGPMUtil.h:512
PLANE_EDGE_INTERSECTION_VECTOR calculate_intersections(float *udata_in, float *vdata_in, float *wdata_in, int num_elem_in, int *elem_in, int num_conn_in, int *conn_in, float *x_coord_in, float *y_coord_in, float *z_coord_in, float p, EDGE_VECTOR unit_normal_vector)
Definition: CuttingSurfaceGPMUtil.h:300
Definition: Triangulate.h:16
float x
Definition: Triangulate.h:17
float y
Definition: Triangulate.h:18
int index
Definition: Triangulate.h:19
static bool Process(const tr_vertexVector &contour, tr_intVector &result)
Definition: Triangulate.h:31
Definition: CuttingSurfaceGPMUtil.h:14
int dimension
Definition: CuttingSurfaceGPMUtil.h:16
float v[3]
Definition: CuttingSurfaceGPMUtil.h:15
Definition: CuttingSurfaceGPMUtil.h:20
double x
Definition: CuttingSurfaceGPMUtil.h:21
double z
Definition: CuttingSurfaceGPMUtil.h:23
double y
Definition: CuttingSurfaceGPMUtil.h:22
Definition: CuttingSurfaceGPMUtil.h:26
bool intersection_at_vertex1
Definition: CuttingSurfaceGPMUtil.h:27
bool intersection_at_vertex2
Definition: CuttingSurfaceGPMUtil.h:28
int vertex1
Definition: CuttingSurfaceGPMUtil.h:31
int vertex2
Definition: CuttingSurfaceGPMUtil.h:32
EDGE_VECTOR intersection
Definition: CuttingSurfaceGPMUtil.h:35
int int_flag
Definition: CuttingSurfaceGPMUtil.h:30
S_V_DATA data_vertex_int
Definition: CuttingSurfaceGPMUtil.h:34
Definition: CuttingSurfaceGPMUtil.h:38
vector< int > ring_index
Definition: CuttingSurfaceGPMUtil.h:40
vector< int > polyhedron_faces
Definition: CuttingSurfaceGPMUtil.h:41
vector< int > ring
Definition: CuttingSurfaceGPMUtil.h:39