Example #1
0
void CriticalPoint::TraceMaxLineFromSaddle(SadPoint& sadP, size_t& maxP, IntArray& pathArray)
{
        /* TraceMaxLineFromSaddle : from a saddle point, find a path to a max point
         * maxP : sadP.maxPoints*
         * pathArray : sadP.maxPath*
         */
        CoordArray& vCoord = *(Global::p_coord);
        size_t nextVID = maxP;
        pathArray.clear();
        pathArray.push_back(sadP.getId());

        double lensum = 0;
        while( ((m_vtx)[nextVID])->getType() != Global::MAXPOINT)
        {
                pathArray.push_back(nextVID);
                double len = (vCoord[pathArray[pathArray.size() - 2]] - vCoord[pathArray[pathArray.size() - 1]]).abs();
                lensum += len;

                if (lensum < Global::maxLineLength)
                {
                        nextVID = FindMaxEigenValueFromVertexNeigh(nextVID);
                }
                else return;
        }
        
        pathArray.push_back(nextVID);
        maxP = nextVID;
        
}
Example #2
0
void Contour::traceContour( double zValue, PointArray& cnpts, IntArray& cnpos, IntArray& dirs )
{
    // 初始化默认三角形都没有被使用
    for( int i = 0; i < ( int )taa.size(); i++ )
    {
        taa[i]->used = false;
    }

    // 记录第1个三角形(搜索起点)
    int t0 = -1, e0 = -1;
    DT_Point p;

    while( findStartTrianlgeTwice( zValue, t0, e0, p ) )
    {
        // 添加搜索开始点
        PointArray z_cnpts;
        z_cnpts.push_back( p );

        int t1 = t0, e1 = e0, t2, e2;
        while( findNextTriangle( zValue, t1, e1, t2, e2, p ) )
        {
            t1 = t2;
            e1 = e2;
            z_cnpts.push_back( p );
        }

        // 如果只有一个点,表示追踪等值线失败
        if( z_cnpts.size() == 1 )
        {
            break;
        }

        // 表示闭合等值线方向(1或-1), 开放等值线为0
        int dir = 0;

        // 等值线是否闭合(起始边与结束边在一个三角形内)
        if( isCoedge( t0, t1, e0 ) )
        {
            getTriangleObject( t1 )->used = true;
            z_cnpts.push_back( z_cnpts.front() );

            // 等值线闭合,结束在一个三角形内,两条边共点
            dir = ( ( zValue > pa[getCoNode( e0, e1 )].z ) ? 1 : -1 );
        }

        // 复制计算得到的等值点
        std::copy( z_cnpts.begin(), z_cnpts.end(), std::back_inserter( cnpts ) );
        // 记录等值线个数
        cnpos.push_back( z_cnpts.size() );
        // 记录等值线的方向
        dirs.push_back( dir );
    }
}
Example #3
0
static BOOL ShowRetDlg()
{
	ResultDlg retDlg;
	AcStringArray datas;
	datas.append(_T("目前矿井瓦斯抽采系统正常运转,能保证生产接续"));
	datas.append(_T("建立了部分部分瓦斯抽采系统,无法保证生产接续"));
	datas.append(_T("没有建立地面固定瓦斯抽采系统"));
	datas.append(_T("其他"));
	retDlg.setItemDatas(datas);

	IntArray trueIndxs;
	trueIndxs.push_back(0);
	trueIndxs.push_back(1);
	retDlg.setTrueIndex(trueIndxs,RET_GASSYS_OBJCT_NAME,DESC_GASSYS_OBJCT_NAME);

	AcStringArray bookMks;
	bookMks.append(_T("GasSys_Ret"));
	bookMks.append(_T("GasSys_Method"));
	bookMks.append(_T("GasSys_Conclusion"));
	bookMks.append(_T("GasSys_YesOrNo"));
	retDlg.setBookMarks(bookMks);

	if(IDOK == retDlg.DoModal()) 
	{
		return TRUE;
	}
	else return FALSE;
}
Example #4
0
bool dfs_all_path(Digraph& dg, ArcFilter& arc_filter, Digraph::Node s, Digraph::Node t, IntArray& pathNums, EdgeArray& allPath)
{
    for(int k=1;k<1000;k++)
    {
        //存储搜索的路径
        EdgeArray p;
        //搜索第k路径
        //acutPrintf(_T("\nK=%d"),k);
        if(!mrp_k(dg, arc_filter, s, t, k, p))
        {
            //一旦第k次搜索不成功,后续的搜索同样也会失败!
            //所以这时候可以直接退出循环了
            break;
        }
        else
        {
            //记录路径的分支个数
            pathNums.push_back(p.size());
            //将路径复制到allPath数组中
            std::copy(p.begin(), p.end(), std::back_inserter(allPath));
        }
    }
    return (!pathNums.empty());
	//return false;
}
Example #5
0
void testPushPop() {
	IntArray a;
	a.push_back(5);
	a.push_back(6);
	assert(a[0] == 5 && a[1] == 6);
	a.pop_back();
	assert(a.size() == 1);
	a.pop_back();
	assert(a.size() == 0);
}
void KDTree<T>::KDNode::nodeSizes( IntArray &sizes, int idx ) const
{
  while ( idx >= sizes.size() )
  {
    sizes.push_back( 0 );
  }

  sizes[ idx ] = _numElements;

  if ( _left ) _left->nodeSizes( sizes, 2 * idx + 1 );
  if ( _right ) _right->nodeSizes( sizes, 2 * idx + 2 );
}
Example #7
0
void CriticalPoint::TraceMinLineFromSaddle(SadPoint& sadP,size_t& minP,IntArray& pathArray)
{
        CoordArray& vCoord = *(Global::p_coord);
        size_t nextVID = minP;
        pathArray.push_back(sadP.getId());

        double lensum = 0;
        while (m_vtx[nextVID]->getType() != Global::MINPOINT)
        {
                pathArray.push_back(nextVID);
                double len = (vCoord[pathArray[pathArray.size() - 2]] - vCoord[pathArray[pathArray.size() - 1]]).abs();
                lensum += len;

                if (lensum < Global::maxLineLength)
                {
                        nextVID = FindMinEigenValueFromVertexNeigh(nextVID);
                }
                else return;
        }
        pathArray.push_back(nextVID);
        minP = nextVID;
}
Example #8
0
//从文件中读取数据,包括拓扑数据, 巷道实际风阻,风量;通风系统总风量
static bool ReadTopologyDatas( std::istream& stream, IntArray& E, IntArray& U, IntArray& V)
{
	/* 读取分支数 */
	int n = 0;
	stream>>n;

	/* 读取网络拓扑和初始分支风阻 */
	for(int i=0;i<n;i++)
	{
		int e, u, v;
		//double r, rmin, rmax;
		stream >> e >> u >> v;

		//if(stream.fail()) break;

		E.push_back(e);
		U.push_back(u);
		V.push_back(v);
	}

	return true;
}
Example #9
0
static void ApproximatePolygon( const PointArray& cnpts, PointArray& polygon, double tolerance )
{
    if( cnpts.empty() ) return;

    int n = cnpts.size();
    // 是否封闭等值线???
    if( IsPointEqual( cnpts.front(), cnpts.back() ) )
    {
        n--;
    }
    int minEdge = n + 1, k = n;

    IntArray indexes;
    for( int i = 0; i < ( int )cnpts.size(); i++ )
    {
        indexes.push_back( i );
    }
    while( k < minEdge )
    {
        minEdge = k;
        int p = 0;
        while( p < minEdge - ( n % 2 == 0 ? 3 : 2 ) )
        {
            double distance = GetPointDistanceToLine( cnpts[indexes[p + 1]], cnpts[indexes[p]], cnpts[indexes[p + 2]] );
            if ( distance < tolerance )
            {
                indexes[p + 1] = -1;
                k -= 1;
            }
            p += 2;
        }
        UpdateIndexes( indexes );
    }

    for( int i = 0; i < ( int )indexes.size(); i++ )
    {
        polygon.push_back( cnpts[indexes[i]] );
    }
}
//在main()函数中测试fill和fill_n算法
void main ()
{
//--------------------------------------------
//	fill和fill_n算法对普通数组的计算
//---------------------------------------------
    int x[]={1,3,5,7,9};
    cout << "x[]: ";
    put_array(x,5);
    //填数处理
    fill(x+1,x+3,2);
    cout << "fill(x+1,x+3,2): "<<endl;
    put_array(x,5);
	fill_n(x,3,8);
    cout << "fill_n(x,3,8): "<<endl;
    put_array(x,5);
//--------------------------------------------
//	fill和fill_n算法对于vector容器的计算
//---------------------------------------------
    //声明intvector容器和迭代器ii
    IntArray intvector;

    //向intvector容器中插入元素
    for (int i=1; i<=10; i++) {
        intvector.push_back(i);
    };
    //显示intvector容器中的元素值和统计结果
    cout << "intvector: "<<endl;
    put_vector(intvector);
    //填数处理
    fill(intvector.begin(),intvector.begin()+3,2);
    cout << "fill(intvector.begin(),intvector.begin()+3,2): "<<endl;
    put_vector(intvector);
    fill_n(&intvector[5],3,8);
    cout << "fill_n(&intvector[5],3,8): "<<endl;
    put_vector(intvector);
}
Example #11
0
Array* Array_readLocalData(Input& fr)
{
    if (fr[0].matchWord("Use"))
    {
        if (fr[1].isString())
        {
            Object* obj = fr.getObjectForUniqueID(fr[1].getStr());
            if (obj)
            {
                fr+=2;
                return dynamic_cast<Array*>(obj);
            }
        }

        osg::notify(osg::WARN)<<"Warning: invalid uniqueID found in file."<<std::endl;
        return NULL;
    }

    std::string uniqueID;
    if (fr[0].matchWord("UniqueID") && fr[1].isString())
    {
        uniqueID = fr[1].getStr();
        fr += 2;
    }


    int entry = fr[0].getNoNestedBrackets();

    const char* arrayName = fr[0].getStr();

    unsigned int capacity = 0;
    fr[1].getUInt(capacity);
    ++fr;

    fr += 2;


    Array* return_array = 0;

    if (strcmp(arrayName,"ByteArray")==0)
    {
        ByteArray* array = new ByteArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            int int_value;
            if (fr[0].getInt(int_value))
            {
                ++fr;
                array->push_back(int_value);
            }
            else ++fr;
        }
        ++fr;

        return_array = array;
    }
    else if (strcmp(arrayName,"ShortArray")==0)
    {
        ShortArray* array = new ShortArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            int int_value;
            if (fr[0].getInt(int_value))
            {
                ++fr;
                array->push_back(int_value);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"IntArray")==0)
    {
        IntArray* array = new IntArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            int int_value;
            if (fr[0].getInt(int_value))
            {
                ++fr;
                array->push_back(int_value);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"UByteArray")==0)
    {
        UByteArray* array = new UByteArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int uint_value;
            if (fr[0].getUInt(uint_value))
            {
                ++fr;
                array->push_back(uint_value);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"UShortArray")==0)
    {
        UShortArray* array = new UShortArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int uint_value;
            if (fr[0].getUInt(uint_value))
            {
                ++fr;
                array->push_back(uint_value);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"UIntArray")==0)
    {
        UIntArray* array = new UIntArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int uint_value;
            if (fr[0].getUInt(uint_value))
            {
                ++fr;
                array->push_back(uint_value);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"UVec4bArray")==0 || strcmp(arrayName,"Vec4ubArray")==0)
    {
        Vec4ubArray* array = new Vec4ubArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int r,g,b,a;
            if (fr[0].getUInt(r) &&
                fr[1].getUInt(g) &&
                fr[2].getUInt(b) &&
                fr[3].getUInt(a))
            {
                fr+=4;
                array->push_back(osg::Vec4ub(r,g,b,a));
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"FloatArray")==0)
    {
        FloatArray* array = new FloatArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            float float_value;
            if (fr[0].getFloat(float_value))
            {
                ++fr;
                array->push_back(float_value);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"DoubleArray")==0)
    {
        DoubleArray* array = new DoubleArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            double double_value;
            if (fr[0].getFloat(double_value))
            {
                ++fr;
                array->push_back(double_value);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec2Array")==0)
    {
        Vec2Array* array = new Vec2Array;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            Vec2 v;
            if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()))
            {
                fr += 2;
                array->push_back(v);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec2dArray")==0)
    {
        Vec2dArray* array = new Vec2dArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            Vec2d v;
            if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()))
            {
                fr += 2;
                array->push_back(v);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec3Array")==0)
    {
        Vec3Array* array = new Vec3Array;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            Vec3 v;
            if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()))
            {
                fr += 3;
                array->push_back(v);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec3dArray")==0)
    {
        Vec3dArray* array = new Vec3dArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            Vec3d v;
            if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()))
            {
                fr += 3;
                array->push_back(v);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec4Array")==0)
    {
        Vec4Array* array = new Vec4Array;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            Vec4 v;
            if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()) && fr[3].getFloat(v.w()))
            {
                fr += 4;
                array->push_back(v);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec4dArray")==0)
    {
        Vec4dArray* array = new Vec4dArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            Vec4d v;
            if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()) && fr[3].getFloat(v.w()))
            {
                fr += 4;
                array->push_back(v);
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec2bArray")==0)
    {
        Vec2bArray* array = new Vec2bArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int r,g;
            if (fr[0].getUInt(r) &&
                fr[1].getUInt(g))
            {
                fr+=2;
                array->push_back(osg::Vec2b(r,g));
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec3bArray")==0)
    {
        Vec3bArray* array = new Vec3bArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int r,g,b;
            if (fr[0].getUInt(r) &&
                fr[1].getUInt(g) &&
                fr[2].getUInt(b))
            {
                fr+=3;
                array->push_back(osg::Vec3b(r,g,b));
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec4bArray")==0)
    {
        Vec4bArray* array = new Vec4bArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int r,g,b,a;
            if (fr[0].getUInt(r) &&
                fr[1].getUInt(g) &&
                fr[2].getUInt(b) &&
                fr[3].getUInt(a))
            {
                fr+=4;
                array->push_back(osg::Vec4b(r,g,b,a));
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec2sArray")==0)
    {
        Vec2sArray* array = new Vec2sArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int r,g;
            if (fr[0].getUInt(r) &&
                fr[1].getUInt(g))
            {
                fr+=2;
                array->push_back(osg::Vec2s(r,g));
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec3sArray")==0)
    {
        Vec3sArray* array = new Vec3sArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int r,g,b;
            if (fr[0].getUInt(r) &&
                fr[1].getUInt(g) &&
                fr[2].getUInt(b))
            {
                fr+=3;
                array->push_back(osg::Vec3s(r,g,b));
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }
    else if (strcmp(arrayName,"Vec4sArray")==0)
    {
        Vec4sArray* array = new Vec4sArray;
        array->reserve(capacity);
        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
        {
            unsigned int r,g,b,a;
            if (fr[0].getUInt(r) &&
                fr[1].getUInt(g) &&
                fr[2].getUInt(b) &&
                fr[3].getUInt(a))
            {
                fr+=4;
                array->push_back(osg::Vec4s(r,g,b,a));
            }
            else ++fr;
        }
        ++fr;
        return_array = array;
    }

    if (return_array)
    {
        if (!uniqueID.empty()) fr.registerUniqueIDForObject(uniqueID.c_str(),return_array);
    }

    return return_array;
}
//////////////////////////////////////////////////////////////////////
// Read a mesh
//////////////////////////////////////////////////////////////////////
Mesh *MeshReader::BuildMesh( const string &inputFile )
{
	// Open the input file
	ifstream f( inputFile.c_str() );

	Real E, v, density;
	int numGaussPoints;
	int elementType;
	int numVertices, numElements, numConstrained;

  Tuple3i divisions;

	f >> E;
	f >> v;
	f >> density;
	f >> numGaussPoints;
	f >> elementType;
	f >> numVertices;
	f >> numElements;
	f >> numConstrained;
  f >> divisions[ 0 ];
  f >> divisions[ 1 ];
  f >> divisions[ 2 ];

	Vector3Array vertices;
	for ( int i = 0; i < numVertices; i++ )
	{
		VEC3F p;

		f >> p[0];
		f >> p[1];
		f >> p[2];

		vertices.push_back( p );
	}

	// Read in elements
	if ( elementType < 0 || elementType >= Mesh::NUM_ELEMENT_TYPES )
	{
		cout << "Invalid element type!" << endl;
		return NULL;
	}

	IntArray connectivity;

	if ( elementType == Mesh::ISO_8_NODE )
	{
		for ( int i = 0; i < numElements; i++ )
		{
			for ( int j = 0; j < 8; j++ )
			{
				int nodeNum;
				f >> nodeNum;
				connectivity.push_back( nodeNum );
			}
		}
	}

	vector<bool> constrained(vertices.size());

	for (int i = 0; i < constrained.size(); i++)
	{
		constrained.at(i) = false;
	}

	// Read in constrained nodes
	for ( int i = 0; i < numConstrained; i++ )
	{
		int nodeNum;
		f >> nodeNum;
		constrained.at(nodeNum) = true;
	}

	f.close();

	// Finish building the mesh
	return new Mesh( vertices, (Mesh::ElementType)elementType, connectivity,
									 constrained, E, v, density, numGaussPoints, divisions );
}
void FstLinkedList::initFstLinkedList(
		string fstPath,
		string fileName) {
	listAllFstNodes.clear();
	finalFstLinkedList.clear();
	string line;
	StringArray words;
	ifstream fileIdFile((fstPath + "//" + fileName + ".fst").c_str());
	if (!fileIdFile.is_open()) {
		cout << "FST file missing : " << (fstPath + "//" + fileName + ".fst").c_str() << endl;
		exit(0);
	}
	IntArray lastPhoneArr;

	while (getline(fileIdFile, line)) {
		words = Dictionary::string2words(line);
		FstNode curFstNode;
		if (words.size() == 5) //FST contains weights
				{
			curFstNode.start = atoi(words[0].c_str());
			curFstNode.end = atoi(words[1].c_str());
			curFstNode.in = words[2];
			curFstNode.op = words[3];
			curFstNode.wt = AcousticModel::myLog(atof(words[4].c_str()));
			listAllFstNodes.push_back(curFstNode);
//			cout <<curFstNode.start << " " << curFstNode.end<<" " << curFstNode.in<<" " << curFstNode.op <<endl;
		} else if (words.size() == 4) //FST does not contain weights
				{
			curFstNode.start = atoi(words[0].c_str());
			curFstNode.end = atoi(words[1].c_str());
			curFstNode.in = words[2];
			curFstNode.op = words[3];
			listAllFstNodes.push_back(curFstNode);
//			cout <<curFstNode.start << " " << curFstNode.end<<" " << curFstNode.in<<" " << curFstNode.op <<endl;
		} else if (words.size() == 2) // last state has weight
				{
			curFstNode.start = atoi(words[0].c_str());
			curFstNode.end = -1;
			curFstNode.wt = atof(words[1].c_str());
			listAllFstNodes.push_back(curFstNode);
			lastPhoneArr.push_back(curFstNode.start);
//			cout <<curFstNode.start << " " << curFstNode.end<<endl;
		} else if (words.size() == 1) // last state has no weight
				{
			curFstNode.start = atoi(words[0].c_str());
			curFstNode.end = -1;
			listAllFstNodes.push_back(curFstNode);
			lastPhoneArr.push_back(curFstNode.start);
//			cout <<curFstNode.start << " " << curFstNode.end<<endl;
		} else {
			cout << "ERROR : FST network should not have reached here : " << line << endl;
			exit(0);
		}

	}

//	cout << listAllFstNodes.size() <<endl;

	// if the lastPhoneArr points to #0, then make it point the previous phone
	for (int i = 0; i < (int) listAllFstNodes.size(); i++) {
		FstNode *curFstNode = &listAllFstNodes[i];

		for (int j = 0; j < (int) lastPhoneArr.size(); j++) {
			if (curFstNode->end == lastPhoneArr[j]) {
				if (curFstNode->in.compare("#0") == 0) {
					lastPhoneArr[j] = curFstNode->start;
				}
			}
		}
	}

	int currentState = 0;
	finalFstLinkedList.push_back(listAllFstNodes[0]);
	for (int i = 1; i < (int) listAllFstNodes.size(); i++) {
		FstNode *curFstNode = &listAllFstNodes[i];

		for (int j = 0; j < (int) lastPhoneArr.size(); j++) {
			if (curFstNode->end == lastPhoneArr[j]) {
				curFstNode->lastPhone = 1;
				if (curFstNode->in.compare("SIL") == 0) {
					curFstNode->lastSIL = 1;
				}
			}
		}

		if (curFstNode->start > currentState) {
			finalFstLinkedList.push_back(*curFstNode);
			currentState = curFstNode->start;

		} else {
			FstNode *endOfLinkedList = &finalFstLinkedList[finalFstLinkedList.size() - 1];
			while (endOfLinkedList->nextFstNode != NULL) {
				endOfLinkedList = endOfLinkedList->nextFstNode;
			}
			endOfLinkedList->nextFstNode = curFstNode;

		}
//		cout <<curFstNode->start << " " << curFstNode->end<<" " << curFstNode->in<<" " << curFstNode->op << " "<<curFstNode->lastPhone <<" "<<curFstNode->lastSIL <<endl;
	}
}
Example #14
0
void Contour::searchBoundary( PointArray& bpts, IntArray& bpos )
{
    // 记录所有边界分支
    BoundaryEdgeArray bea;
    for( int i = 0; i < ( int )eaa.size(); i++ )
    {
        if( eaa[i]->isBoundary() )
        {
            BoundaryEdge be = {i, false};
            bea.push_back( be );
        }
    }
    if( bea.empty() ) return;

    // 记录搜索得到的点编号
    IntArray pia;

    // 前提:边界必然是闭合的
    // 可能存在多个边界(内外边界)
    while( true )
    {
        // 搜索可用的边界
        int bi = -1;
        for( int i = 0; i < ( int )bea.size(); i++ )
        {
            BoundaryEdge be = bea[i];
            if( !be.used )
            {
                bi = i;
                break;
            }
        }
        if( bi == -1 ) break;

        // 记录之前已搜索到的边界点个数
        int boundPts_num = pia.size();

        DT_Edge e = getEdgeObject( bea[bi].ei )->e;
        bea[bi].used = true;  // 标记为使用

        pia.push_back( e.s );
        pia.push_back( e.t );

        int nt = e.t;
        while( true )
        {
            int nbi = -1;
            for( int i = 0; i < ( int )bea.size(); i++ )
            {
                if( bea[i].used ) continue;

                DT_Edge ne = getEdgeObject( bea[i].ei )->e;
                if( nt == ne.s )
                {
                    nt = ne.t;
                    nbi = i;
                    break;
                }
                else if( nt == ne.t )
                {
                    nt = ne.s;
                    nbi = i;
                    break;
                }
            }
            if( nbi == -1 ) break;

            bea[nbi].used = true;
            pia.push_back( nt );
        }

        int n = pia.size() - boundPts_num;
        if( n >= 3 )
        {
            // 至少是3个点
            bpos.push_back( n );
        }
    }

    // 将点编号转换成实际的点坐标
    for( int i = 0; i < ( int )pia.size(); i++ )
    {
        bpts.push_back( pa[pia[i]] );
    }
}
//在main()函数中测试find()_end()算法(返回两数组相同元素的在第一个数组中的位置)
void main ()
{
//--------------------------------------------
//	find_end()算法对普通数组的处理
//---------------------------------------------
    int x[ARRAY_SIZE]={1,3,5,7,9,2,4,6,8,10};
    cout << "x[]: ";
    put_array(x,ARRAY_SIZE);
    cout<<endl;
    int y[]={5,7,9};
    cout << "y[]: ";
    put_array(y,3);
    cout<<endl;

    // find_end()算法查找,并显示查找结果
    int *p=find_end(x,x+ARRAY_SIZE,&y[0],&y[2]);
    if (p != x + ARRAY_SIZE)  {  //查到
        cout << "The first element that matches :" ;
        put_array(y,3);
        cout<< " is at location in x" << p - x<< endl;
    }
    else  {           //未查到                      
         cout << "The sequence does not contain any elements";
         cout<< " with value " ;
         put_array(&x[3],3);
    }

//--------------------------------------------
//	find_end()算法对vector容器的处理
//---------------------------------------------
   //声明intvector容器对象
    IntArray intvector;

    //向intvector容器中插入元素
    for (int i=1; i<=10; i++) {
        intvector.push_back(i);
    };

    //显示intvector容器中的元素值
    cout << "intvector: ";
    put_vector(intvector);
    cout<<endl;

    IntArray temp;
    temp.push_back(5);
    temp.push_back(6);
    temp.push_back(7);
    cout << "temp: ";
    put_vector(temp);
    cout<<endl;

    // find_end()算法查找,并显示查找结果
    IntArray::iterator pos;
    pos=find_end(intvector.begin(),intvector.end(),temp.begin(),temp.end());

    if (pos != intvector.end())  {  //查到
        cout << "The first element that matches ";
        put_vector(temp);
        cout<< " is at location in intvector " <<pos - intvector.begin()<< endl;
    }
    else  {           //未查到                      
         cout << "The sequence does not contain any elements";
         cout<< " with value ";
        put_vector(temp);
        cout<< endl ;
    }
}
Example #16
0
int Network::Dinic()
{
    int maxflow = 0;
    int u,v,e,ee,f;
    IntArray q;
    _E.resize(_E.size()+1);
    _E.back().v = _s;
    while (true)
    {
        for (u = 0;u < _V.size();u++)
            _V[u].l = -1;
        _V[_s].l = f = 0;
        _V[_s].o = _V[_s].e;
        q.clear();
        q.push_back(_s);
        while (f < (int)q.size())
        {
            u = q[f++];
            for (e = _V[u].e;e != -1;e = _E[e].n)
            {
                v = _E[e].v;
                if (_V[v].l == -1 && _E[e].c > 0)
                {
                    _V[v].o = _V[v].e;
                    _V[v].l = _V[u].l+1;
                    q.push_back(v);
                }
            }
        }
        if (_V[_t].l == -1) break;
        q.clear();
        q.push_back(_E.size()-1);
        while (!q.empty())
        {
            u = _E[q.back()].v;
            if (u == _t)
            {
                for (f = INT_MAX,e = 1;e < (int)q.size();e++)
                    if (_E[q[e]].c < f)
                        f = _E[q[e]].c,u = e;
                for (e = 1;e < q.size();e++)
                {
                    _E[q[e]].c -= f;
                    _E[q[e]^1].c += f;
                }
                maxflow += f;
                q.resize(u);
            }
            else
            {
                for (e = _V[u].o;e != -1;e = _E[e].n)
                {
                    if (_V[_E[e].v].l < 0 || _E[e].c < 1)
                        continue;
                    if (_V[_E[e].v].l == _V[u].l+1)
                        break;
                }
                if ((_V[u].o = e) != -1)
                    q.push_back(e);
                else
                {
                    q.pop_back();
                    _V[u].l = -1;
                }
            }
        }
    }
    return maxflow;
}