void ISegChain::MergeInteriorIPnts() { for ( int i = 1 ; i < (int)m_ISegDeque.size() ; i++ ) { IPnt* ipe = m_ISegDeque[i-1]->m_IPnt[1]; IPnt* ipb = m_ISegDeque[i]->m_IPnt[0]; #ifdef DEBUG_CFD_MESH static double max_dist = 0.0; double d = dist( ipe->m_Pnt, ipb->m_Pnt ); if ( d > max_dist ) { max_dist = d; fprintf( cfdMeshMgrPtr->m_DebugFile, "ISegChain::MergeInteriorIPnts Max Dist = %10.10f \n", max_dist ); } #endif m_ISegDeque[i]->m_IPnt[0] = ipe; ipe->AddSegRef( m_ISegDeque[i] ); // delete ipb; } }
ISeg* ISeg::Split( Surf* sPtr, vec2d & uw ) { vec2d uwa, uwb; if ( sPtr == m_SurfA ) { double denom = dist( m_IPnt[0]->GetPuw( m_SurfA )->m_UW, m_IPnt[1]->GetPuw( m_SurfA )->m_UW ); double numer = dist( m_IPnt[0]->GetPuw( m_SurfA )->m_UW, uw ); double fract = 0.0; if ( denom ) { fract = numer / denom; } uwa = uw; uwb = m_IPnt[0]->GetPuw( m_SurfB )->m_UW + ( m_IPnt[1]->GetPuw( m_SurfB )->m_UW - m_IPnt[0]->GetPuw( m_SurfB )->m_UW ) * fract; } else { double denom = dist( m_IPnt[0]->GetPuw( m_SurfB )->m_UW, m_IPnt[1]->GetPuw( m_SurfB )->m_UW ); double numer = dist( m_IPnt[0]->GetPuw( m_SurfB )->m_UW, uw ); double fract = 0.0; if ( denom ) { fract = numer / denom; } uwb = uw; uwa = m_IPnt[0]->GetPuw( m_SurfA )->m_UW + ( m_IPnt[1]->GetPuw( m_SurfA )->m_UW - m_IPnt[0]->GetPuw( m_SurfA )->m_UW ) * fract; } if ( m_SurfA->ValidUW( uwa ) && m_SurfB->ValidUW( uwb ) ) { Puw* pwa = new Puw( m_SurfA, uwa ); CfdMeshMgr.AddDelPuw( pwa ); Puw* pwb = new Puw( m_SurfB, uwb ); CfdMeshMgr.AddDelPuw( pwb ); IPnt* ip = new IPnt( pwa, pwb ); CfdMeshMgr.AddDelIPnt( ip ); ip->CompPnt(); ISeg* sseg = new ISeg( m_SurfA, m_SurfB, ip, m_IPnt[1] ); m_IPnt[1] = ip; return sseg; } return NULL; }
void ISegChain::ApplyTess( ) { //==== Clear Old Tess ====// m_TessVec.clear(); vector< vec3d > tuwa = m_ACurve.GetUWTessPnts(); vector< vec3d > tuwb = m_BCurve.GetUWTessPnts(); assert( tuwa.size() == tuwb.size() ); //==== Add Other IPnts ====// for ( int i = 0 ; i < (int)tuwa.size() ; i++ ) { Puw* puwa = new Puw( m_SurfA, vec2d( tuwa[i][0], tuwa[i][1] ) ); cfdMeshMgrPtr->AddDelPuw( puwa ); Puw* puwb = new Puw( m_SurfB, vec2d( tuwb[i][0], tuwb[i][1] ) ); cfdMeshMgrPtr->AddDelPuw( puwb ); IPnt* ip = new IPnt( puwa, puwb ); m_CreatedIPnts.push_back( ip ); //m_CreatedPuws.push_back( puwa ); //m_CreatedPuws.push_back( puwb ); //vec3d pA = m_SurfA->CompPnt( tuwa[i][0], tuwa[i][1] ); //vec3d pB = m_SurfB->CompPnt( tuwb[i][0], tuwb[i][1] ); //double d = dist( pA, pB ); // printf( "%d Big D = %f \n",i, d ); ip->CompPnt(); m_TessVec.push_back( ip ); } //double d = dist( m_TessVec.front()->m_Pnt, m_TessVec.back()->m_Pnt ); //printf("Tess Chain Size = %d %f\n", m_TessVec.size(), d ); }
void ISegChain::Draw() { //glBegin( GL_LINES ); //deque< ISeg* >::iterator s; //for ( s = m_ISegDeque.begin() ; s != m_ISegDeque.end(); s++ ) //{ // (*s)->Draw(); //} //glEnd(); //ISeg* backSeg = m_ISegDeque.back(); //ISeg* frontSeg = m_ISegDeque.front(); //glBegin( GL_POINTS ); // glVertex3dv( backSeg->m_IPnt[1]->m_Pnt.data() ); // glVertex3dv( frontSeg->m_IPnt[0]->m_Pnt.data() ); //glEnd(); //glColor3ub( 255, 255, 0 ); //m_ACurve.Draw(); //glColor3ub( 0, 255, 255 ); //m_BCurve.Draw(); // glColor3ub( 255, 0, 255 ); glLineWidth(1.0); glBegin( GL_LINE_STRIP ); for ( int i = 0 ; i < (int)m_TessVec.size() ; i++ ) { IPnt* ip = m_TessVec[i]; vec2d uw = ip->GetPuw( m_SurfA )->m_UW; vec3d p = m_SurfA->CompPnt( uw[0], uw[1] ); glVertex3dv( p.data() ); } glEnd(); glPointSize(4.0); glBegin( GL_POINTS ); for ( int i = 0 ; i < (int)m_TessVec.size() ; i++ ) { IPnt* ip = m_TessVec[i]; vec2d uw = ip->GetPuw( m_SurfA )->m_UW; vec3d p = m_SurfA->CompPnt( uw[0], uw[1] ); glVertex3dv( p.data() ); } glEnd(); //ISeg* backSeg = m_ISegDeque.back(); //ISeg* frontSeg = m_ISegDeque.front(); //glPointSize(4.0); //glBegin( GL_POINTS ); // vec2d uw = frontSeg->m_AUW[0]; // vec3d p = frontSeg->m_SurfA->CompPnt( uw[0], uw[1] ); // glVertex3dv(p.data() ); // uw = backSeg->m_AUW[1]; // p = backSeg->m_SurfA->CompPnt( uw[0], uw[1] ); // glVertex3dv(p.data() ); //glEnd(); ////glPointSize(5.0); ////glColor3ub( 0, 255, 255 ); ////glBegin( GL_POINTS ); ////for ( int i = 0 ; i < (int)m_SplitVec.size() ; i++ ) ////{ //// glVertex3dv(m_SplitVec[i].m_Pnt.data() ); ////} ////glEnd(); }