41 lines
1.4 KiB
C++
41 lines
1.4 KiB
C++
#include "stt_class.h"
|
|
|
|
int SttGenerator::InTriangleCircle(QuadTreeNode* node){
|
|
// If no constraint circle, return false
|
|
if (array_control_circle_.empty()){
|
|
return 0;
|
|
}
|
|
else{
|
|
int node_depth;
|
|
double node_resolution, center_degree;
|
|
|
|
Triangle temp_tri;
|
|
for (int j = 0; j < 3; j++){
|
|
temp_tri.ids[j] = node->tri.ids[j];
|
|
}
|
|
|
|
node_depth = node->depth;
|
|
|
|
node_resolution = 0;
|
|
for (int i = 0; i < 3; i++){
|
|
node_resolution += acos(DotProduct(array_stt_vert_[temp_tri.ids[i]].posic,array_stt_vert_[temp_tri.ids[(i+1)%3]].posic)
|
|
/(ModuleLength(array_stt_vert_[temp_tri.ids[i]].posic)*ModuleLength(array_stt_vert_[temp_tri.ids[(i+1)%3]].posic)));
|
|
}
|
|
node_resolution = node_resolution*60/Pi;
|
|
|
|
for (int i = 0; i < array_control_circle_.size(); i++){
|
|
for (int j = 0; j < 3; j++){
|
|
// calculate the geocentric angle between a vertex of the triangle and the center of the circle
|
|
center_degree = acos(DotProduct(array_control_circle_[i].circle_center.posic,array_stt_vert_[temp_tri.ids[j]].posic)
|
|
/(ModuleLength(array_control_circle_[i].circle_center.posic)*ModuleLength(array_stt_vert_[temp_tri.ids[j]].posic)))*180.0/Pi;
|
|
|
|
if (center_degree <= array_control_circle_[i].circle_cap_degree
|
|
&& array_control_circle_[i].max_depth >= node_depth && node_resolution >= array_control_circle_[i].minimal_resolution){
|
|
node->tri.physic_group = array_control_circle_[i].physic_group;
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
} |