#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;
	}
}