Go to the documentation of this file. 1
14
15
22
23 #define VERDICT_EXPORTS
24
25 #include "moab/verdict.h"
26 #include "VerdictVector.hpp"
27 #include <memory.h>
28
29
50
51
57
58 C_FUNC_DEF double v_knife_volume( int num_nodes, double coordinates[][3] )
59 {
60 double volume = 0;
61 VerdictVector side1, side2, side3;
62
63 if( num_nodes == 7 )
64 {
65
66
67
68 side1.set( coordinates[1][0] - coordinates[0][0], coordinates[1][1] - coordinates[0][1],
69 coordinates[1][2] - coordinates[0][2] );
70 side2.set( coordinates[3][0] - coordinates[0][0], coordinates[3][1] - coordinates[0][1],
71 coordinates[3][2] - coordinates[0][2] );
72 side3.set( coordinates[4][0] - coordinates[0][0], coordinates[4][1] - coordinates[0][1],
73 coordinates[4][2] - coordinates[0][2] );
74
75 volume = side3 % ( side1 * side2 ) / 6;
76
77 side1.set( coordinates[5][0] - coordinates[1][0], coordinates[5][1] - coordinates[1][1],
78 coordinates[5][2] - coordinates[1][2] );
79 side2.set( coordinates[3][0] - coordinates[1][0], coordinates[3][1] - coordinates[1][1],
80 coordinates[3][2] - coordinates[1][2] );
81 side3.set( coordinates[4][0] - coordinates[1][0], coordinates[4][1] - coordinates[1][1],
82 coordinates[4][2] - coordinates[1][2] );
83
84 volume += side3 % ( side1 * side2 ) / 6;
85
86 side1.set( coordinates[2][0] - coordinates[1][0], coordinates[2][1] - coordinates[1][1],
87 coordinates[2][2] - coordinates[1][2] );
88 side2.set( coordinates[3][0] - coordinates[1][0], coordinates[3][1] - coordinates[1][1],
89 coordinates[3][2] - coordinates[1][2] );
90 side3.set( coordinates[6][0] - coordinates[1][0], coordinates[6][1] - coordinates[1][1],
91 coordinates[6][2] - coordinates[1][2] );
92
93 volume += side3 % ( side1 * side2 ) / 6;
94
95 side1.set( coordinates[3][0] - coordinates[1][0], coordinates[3][1] - coordinates[1][1],
96 coordinates[3][2] - coordinates[1][2] );
97 side2.set( coordinates[5][0] - coordinates[1][0], coordinates[5][1] - coordinates[1][1],
98 coordinates[5][2] - coordinates[1][2] );
99 side3.set( coordinates[6][0] - coordinates[1][0], coordinates[6][1] - coordinates[1][1],
100 coordinates[6][2] - coordinates[1][2] );
101
102 volume += side3 % ( side1 * side2 ) / 6;
103 }
104
105 return (double)volume;
106 }
107
108
116
117 C_FUNC_DEF void v_knife_quality( int num_nodes,
118 double coordinates[][3],
119 unsigned int metrics_request_flag,
120 KnifeMetricVals* metric_vals )
121 {
122 memset( metric_vals, 0, sizeof( KnifeMetricVals ) );
123
124 if( metrics_request_flag & V_KNIFE_VOLUME ) metric_vals->volume = v_knife_volume( num_nodes, coordinates );
125 }