コード例 #1
0
ファイル: difference.cpp プロジェクト: HEShuang/SFCGAL
static void filter_self_intersection( const GeometrySet<Dim>& input, GeometrySet<Dim>& output )
{
    {
        typedef std::list< CollectionElement<typename Point_d<Dim>::Type> > PointList;
        PointList points;

        std::copy( input.points().begin(), input.points().end(), std::back_inserter( points ) );

        typename PointList::iterator it = points.begin();

        while ( it != points.end() ) {
            bool intersectsA = false;

            for ( typename PointList::iterator it2 = points.begin(); it2 != points.end(); ++it2 ) {
                if ( it == it2 ) {
                    continue;
                }

                PrimitiveHandle<Dim> pa1( &it->primitive() );
                PrimitiveHandle<Dim> pa2( &it2->primitive() );

                if ( CGAL::do_overlap( it->primitive().bbox(), it2->primitive().bbox() ) &&
                        algorithm::intersects( pa1, pa2 ) ) {
                    intersectsA = true;
                    GeometrySet<Dim> temp;
                    algorithm::intersection( pa1, pa2, temp );
                    std::copy( temp.points().begin(), temp.points().end(), std::back_inserter( points ) );
                    // erase it2
                    points.erase( it2 );
                    break;
                }
            }

            if ( ! intersectsA ) {
                output.addPrimitive( it->primitive() );
            }

            // suppress A
            it = points.erase( it );
        }
    }
    {
        typedef std::list< CollectionElement<typename Segment_d<Dim>::Type> > SegmentList;
        SegmentList segments;

        std::copy( input.segments().begin(), input.segments().end(), std::back_inserter( segments ) );

        typename SegmentList::iterator it = segments.begin();

        while ( it != segments.end() ) {
            bool intersectsA = false;

            for ( typename SegmentList::iterator it2 = segments.begin(); it2 != segments.end(); ++it2 ) {
                if ( it == it2 ) {
                    continue;
                }

                PrimitiveHandle<Dim> pa1( &it->primitive() );
                PrimitiveHandle<Dim> pa2( &it2->primitive() );

                if ( CGAL::do_overlap( it->primitive().bbox(), it2->primitive().bbox() ) &&
                        algorithm::intersects( pa1, pa2 ) ) {
                    intersectsA = true;
                    GeometrySet<Dim> temp;
                    algorithm::intersection( pa1, pa2, temp );
                    std::copy( temp.segments().begin(), temp.segments().end(), std::back_inserter( segments ) );
                    // erase it2
                    segments.erase( it2 );
                    break;
                }
            }

            if ( ! intersectsA ) {
                output.addPrimitive( it->primitive() );
            }

            // suppress A
            it = segments.erase( it );
        }
    }
}
コード例 #2
0
//ネット抽出
SSingleNetList* SNetList::NetList1()
{
	//printf("newnet\n");
	SNlPin*		pPin;
	SPoint		point;
	NlPinList	listPin;							//ネットに含まれるピン
	stringList  listSignalNameAll;					//ネットに関わる未処理信号名
	stringList  listSignalName;						//ネットに関わる未処理信号名
	PointList	listPoint;							//ネットに関わる座標

	XBSchObjListIterator ite1;
	SSingleNetList* pSingleNet;
	
	NlPinListIterator itePin = m_listNlPin.begin();	//ピンのリストからピンをひとつ取り出す
	if(itePin == m_listNlPin.end()) return NULL;	//ピンがなければ何もせずに戻る

	pPin=(*itePin);
	m_listNlPin.erase(itePin);						//取り出したピンは元のリストから消去して
	pSingleNet = new SSingleNetList;
	listPin.push_back(pPin);						//ネットに登録
	listPoint.push_back(pPin->m_point);				//ピン位置を座標のリストに登録する。
	
	//ピンの信号名を取得して、すべて信号名のリストに登録する。
	stringListIterator iteStr=pPin->m_listSigName.begin();
	while(iteStr!=pPin->m_listSigName.end()){
		listSignalNameAll.push_back(*iteStr);
		listSignalName.push_back(*iteStr);
		iteStr++;
	}

	//処理が発生しなくなるまで1. 2.を繰り返す
	//1.未処理信号名がなくなるまで(1)(2)を繰り返し実行する。
	//	(1)信号名によるピンの抽出
	//	    同じ信号名を持つピンの取り出し
	//	    取り出したピンが持つ別の信号名の追加登録
	//	    取り出したピンの座標の登録
	//	(2)信号名によるワイヤーの抽出
	//	    同じ信号名を持つワイヤーの取り出し
	//		取り出したワイヤーが持つ別の信号名の追加登録
	//	    取り出したワイヤーの座標の登録
	//
	//2.未処理座標がなくなるまで(3)(4)を繰り返し実行する。
	//	(3)座標によるピンの抽出
	//		その座標を持つピンの取り出し
	//		取り出したピンが持つ別の信号名の追加登録
	//	(4)座標によるワイヤーの取り出し
	//		その座標を持つワイヤーの取り出し
	//		取り出したワイヤーが持つ別の信号名の追加登録
	//		取り出したワイヤーの座標の登録
	//

	stringListIterator iteSignalName;
	PointListIterator  itePoint;

	bool fDone = true;
	int  loopCount = 0;
	while(fDone){
		//printf("%d\n",loopCount);
		fDone = false;
		//***** 1.信号名処理 *****
		iteSignalName = listSignalName.begin();
		while(iteSignalName != listSignalName.end()){
			//printf("SigName");
			fDone = true;
			string strSignalName = (*iteSignalName);
			
			//***** (1)信号名によるピンの抽出 *****
			NlPinListIterator itePin = m_listNlPin.begin();
			NlPinListIterator itePinBackUp;
			while(itePin != m_listNlPin.end()){				//信号名について全てのピンをスキャンする
				SNlPin* pPin =(*itePin);
				itePinBackUp = itePin;
				itePin++;
				if(quaryExist(pPin->m_listSigName,strSignalName)){							//ピンが持つ信号名のひとつが検索中の信号名に合致
					m_listNlPin.erase(itePinBackUp);										//ピンのリストからはずす
					listPin.push_back(pPin);												//ネットのピンのリストに追加する
					stringListIterator itePinSignalName = pPin->m_listSigName.begin();		//ピンが持つ信号名をすべて、ネットの信号名に登録
					while(itePinSignalName != pPin->m_listSigName.end()){					//
						if(!quaryExist(listSignalNameAll,(*itePinSignalName))){				//ただし、新規に登録するのは、未登録のものだけ
							listSignalNameAll.push_back(*itePinSignalName);
							listSignalName.push_back(*itePinSignalName);
						}
						itePinSignalName++;
					}
					if(!quaryExist(listPoint,pPin->m_point)){
						listPoint.push_back(pPin->m_point);
					}
				}
    		}// ***** (1)信号名によるピンの抽出 *****
	

			// ***** (2)信号名によるワイヤーの抽出 *****
			XBSchObjListIterator iteWire = m_listWire.begin();
			XBSchObjListIterator iteWireBackUp;
			while(iteWire != m_listWire.end()){				//信号名について全てのワイヤーをスキャンする
				SXBSchWireNl* pWire =(SXBSchWireNl*)(*iteWire);
				iteWireBackUp = iteWire;
				iteWire++;
				if(quaryExist(pWire->m_listSignalName,strSignalName)){						//ワイヤーが持つ信号名のひとつが検索中の信号名に合致
					m_listWire.erase(iteWireBackUp);										//ワイヤーのリストからはずす
					stringListIterator iteWireSignalName = pWire->m_listSignalName.begin();	//ワイヤーが持つ信号名をすべて、ネットの信号名に登録
					while(iteWireSignalName != pWire->m_listSignalName.end()){					//
						if(!quaryExist(listSignalNameAll,(*iteWireSignalName))){	//ただし、新規に登録するのは、未登録のものだけ
							listSignalNameAll.push_back(*iteWireSignalName);
							listSignalName.push_back(*iteWireSignalName);
						}
						iteWireSignalName++;
					}
					if(!quaryExist(listPoint,pWire->p1())){
						listPoint.push_back(pWire->p1());
					}
					if(!quaryExist(listPoint,pWire->p2())){
						listPoint.push_back(pWire->p2());
					}
					delete pWire;
				}
			} // ***** (2)信号名によるワイヤーの抽出 *****
			iteSignalName = listSignalName.erase(iteSignalName);
		}// ここまで ***** 1.信号名処理 *****

		itePoint = listPoint.begin();
		// ***** 2.座標処理 *****
		while(itePoint != listPoint.end()){//座標処理繰り返し
			//printf("Point");
			fDone = true;
			SPoint point = (*itePoint);
			// ***** (3)座標によるピンの抽出 *****
			NlPinListIterator itePin = m_listNlPin.begin();
			NlPinListIterator itePinBackUp;
			while(itePin != m_listNlPin.end()){	//座標について全てのピンをスキャンする
				SNlPin* pPin =(*itePin);
				itePinBackUp = itePin;
				itePin++;
				if(pPin->m_point == point){													//ピンの座標が検索中の座標と合致
					m_listNlPin.erase(itePinBackUp);										//ピンのリストからはずす
					listPin.push_back(pPin);												//ネットのピンのリストに追加する
					stringListIterator itePinSignalName = pPin->m_listSigName.begin();		//ピンが持つ信号名をすべて、ネットの信号名に登録
					while(itePinSignalName != pPin->m_listSigName.end()){					//
						if(!quaryExist(listSignalNameAll,(*itePinSignalName))){	//ただし、新規に登録するのは、未登録のものだけ
							listSignalNameAll.push_back(*itePinSignalName);
							listSignalName.push_back(*itePinSignalName);
						}
						itePinSignalName++;
					}
				}
			} //ここまで***** (3)座標によるピンの抽出 *****

			// ***** (4)座標によるワイヤーの抽出 *****
			XBSchObjListIterator iteWire = m_listWire.begin();
			XBSchObjListIterator iteWireBackUp;
			while(iteWire != m_listWire.end()){		//座標について全てのワイヤーをスキャンする
				SXBSchWireNl* pWire =(SXBSchWireNl*)(*iteWire);
				iteWireBackUp = iteWire;
				iteWire++;
				bool fHit=false;
				if(pWire->p1() == point){
					fHit=true;
					if(!quaryExist(listPoint,pWire->p2())){
						listPoint.push_back(pWire->p2());
					}
				}else if(pWire->p2() == point){
					fHit=true;
					if(!quaryExist(listPoint,pWire->p1())){
						listPoint.push_back(pWire->p1());
					}
				}
				if(fHit){
					stringListIterator iteWireSignalName = pWire->m_listSignalName.begin();	//ワイヤーが持つ信号名をすべて、ネットの信号名に登録
					while(iteWireSignalName != pWire->m_listSignalName.end()){				//
						if(!quaryExist(listSignalName,(*iteWireSignalName))){	//ただし、新規に登録するのは、未登録のものだけ
							listSignalNameAll.push_back(*iteWireSignalName);
							listSignalName.push_back(*iteWireSignalName);
						}
						iteWireSignalName++;
					}
					delete pWire;
					m_listWire.erase(iteWireBackUp);										//ワイヤーのリストからはずす
				}
    		}// ***** (4)座標によるワイヤーの抽出 *****
		
			itePoint=listPoint.erase(itePoint);
		}// while(itePoint != listPoint.end()){
		loopCount++ ;
	}

	if(listSignalNameAll.size()>0) pSingleNet->m_SignalName=listSignalNameAll.front();

	pSingleNet->m_nPinCount=listPin.size();
	if(pSingleNet->m_nPinCount>0){
		pSingleNet->m_pPinArray = new PSNlPin[pSingleNet->m_nPinCount];
	
		NlPinListIterator itePin=listPin.begin();
		int n=0;
		while(itePin!=listPin.end()){
			pSingleNet->m_pPinArray[n++]=(*itePin++);
		}
		qsort(pSingleNet->m_pPinArray,pSingleNet->m_nPinCount, sizeof(PSNlPin), CompareSNlPin );
	}
	return pSingleNet;
}