void Node::OptSmooth() { vector< Tri* > connectTris; GetConnectTris( connectTris ); if ( ( int )connectTris.size() < 3 ) { return; } double worst_qual = 0.0; Tri* worst_tri = NULL; for ( int i = 0 ; i < ( int )connectTris.size() ; i++ ) { double q = connectTris[i]->ComputeCosSmallAng(); if ( q > worst_qual ) { worst_qual = q; worst_tri = connectTris[i]; } } //==== Good Tris -> Don't Bother ====// //if ( worst_qual < 0.707 ) // return; vec3d orig_pos = pnt; Edge* far_edge = worst_tri->FindEdgeWithout( this ); //==== Find Target Pos ====// vec3d proj = proj_pnt_on_ray( far_edge->n0->pnt, far_edge->n1->pnt, orig_pos ); vec3d dir = orig_pos - proj; dir.normalize(); double len = 0.866 * dist( far_edge->n0->pnt, far_edge->n1->pnt ); vec3d target_pos = ( far_edge->n0->pnt + far_edge->n1->pnt ) * 0.5 + dir * len; pnt = pnt + ( target_pos - pnt ) * 0.02; // Move 1% Towards Target bool move_back = false; for ( int i = 0 ; i < ( int )connectTris.size() ; i++ ) { double q = connectTris[i]->ComputeCosSmallAng(); if ( q > worst_qual ) { move_back = true; break; } } //==== Restore Pos ====// if ( move_back ) { pnt = orig_pos; } }
//******* Project Line To Plane******// //======= NOT TESTED !!!!!!!!!!!!!!! ===// vec3d proj_pnt_to_plane(vec3d& org, vec3d& plane_ln1, vec3d& plane_ln2, vec3d& pnt) { vec3d normal = cross(plane_ln1, plane_ln2); vec3d proj_pnt = proj_pnt_on_ray(org, org+normal, pnt); vec3d proj_vec = org - proj_pnt; return(pnt + proj_vec); }