#ifndef _mgTL2Fans_HH_ #define _mgTL2Fans_HH_ #include #include "mg/Pvector.h" #include "Tl2/TL2Fan.h" #include "Tl2/TL2Triangle.h" /****************************************************************/ /* Copyright (c) 2017 by System fugen G.K. */ /* All rights reserved. */ /****************************************************************/ ///////////// mgTL2Fans ///////////// class MGPosition; class MGLoop; class mgTL2parameter; class mgTL2Polyline; class mgTL2FanEdges; class mgTL2LPline; class mgTL2Triangles; /** @file */ /** @addtogroup UseTessellation * @{ */ ///Defines a vector mgTL2Fan. /// private class for tessellation. class mgTL2Fans{ public: typedef MGPvector::iterator iterator; typedef MGPvector::const_iterator const_iterator; friend std::ostream& operator<< (std::ostream& out, const mgTL2Fans& fans); /////////////constructor//////////////////////// mgTL2Fans( const MGLoop& polygon ///& polylines//Edges of the polyline that are mgTL2Polyline. ); mgTL2Fans( const mgTL2LPline pline[4]///Four edges that constitute a closed polygon. ); mgTL2Fans( const mgTL2Polyline* pline[4]///Four edges that constitute a closed polygon. ); /////////////operator overload//////////////////////// const mgTL2Fan* operator[](int i)const{return m_fans[i];}; mgTL2Fan* operator[](int i){return m_fans[i];}; /////////////member function//////////////////////// const_iterator begin()const{return m_fans.begin();}; const_iterator end()const{return m_fans.end();}; iterator begin(){return m_fans.begin();}; iterator end(){return m_fans.end();}; ///3点目の頂点(id of m_fans)を求める(頂点は使用点となる) int find3rdV( int alpha, ///<エッジの始点(id of m_fans) int beta, ///<エッジの終点(id of m_fans) int& status ///<ステータス ); ///Fan生成に必要な変数の準備を行う ///edgeStackにedgeのstackを積む void init_edgeStack( mgTL2FanEdges& edgeStack ); ///Test if the edge(alpha, beta) is boundary or not. bool is_boundary(int alpha, int beta) const; ///線分(v1,v2)が既存のedgeと交点があるかどうかを調べる ///Function's return: true if had isect. bool has_isect( int v1, ///<線分1の点 int v2 ///<線分1の点 )const; void push_back(mgTL2Fan* fan){m_fans.push_back(fan);}; void push_back(mgTL2Fans& fans){m_fans.push_back(fans.m_fans);}; ///目的:中心点(center)がalphaのmgTL2Fanに対し、頂点gammaを基準betaの ///後ろに追加する void push1Vaft( int alpha, ///<中心点のインデックス int beta, ///<追加する頂点のインデックス int gamma ///<基準となる頂点のインデックス ); ///目的:中心点(center)がalphaのmgTL2Fanに対し、頂点betaを基準gammaの ///前に追加する void push1Vbefore( int alpha, ///<中心点のインデックス int beta, ///<追加する頂点のインデックス int gamma ///<基準となる頂点のインデックス ); ///目的:中心点(center)がgammaで頂点(alpha,beta)のものを新規に作成する void push2V( int gamma, ///<γのインデックス int alpha, ///<αのインデックス int beta ///<βのインデックス ); ///Set edge(alpha,j) as used. void set_edge_used(int alpha, int beta); ///Get the number of fans included. int size() const{return (int)m_fans.size();}; ///Triangulate polygon. ///The result will be appended onto triangles. void triangulate( mgTL2Triangles& triangles /// m_fans; std::vector m_polylines;///