Esempio n. 1
0
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;
    }

}
Esempio n. 2
0
//******* 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); 

}