public static GameObject createDebuger(zz2DConcave pPolygon, string pName)
    {
        GameObject lPolygonDebugerObject = new GameObject(pName);
        zz2DConcaveDebuger lPolygonDebuger = lPolygonDebugerObject.AddComponent<zz2DConcaveDebuger>();

        lPolygonDebuger.setConcave(pPolygon);
        return lPolygonDebugerObject;
    }
 void setConcave(zz2DConcave pConcave)
 {
     concave = pConcave;
     gameObject.AddComponent<zzSimplyPolygonDebuger>().polygon = concave.getOutSidePolygon();
     foreach (var lHole in concave.getHole())
     {
         var lPolygonDebuger = gameObject.AddComponent<zzSimplyPolygonDebuger>();
         lPolygonDebuger.polygon = lHole;
         lPolygonDebuger.lineColor = holeLineColor;
     }
 }
    //创建的模型位移 -pBounds.min
    GameObject createFlatMesh(zz2DConcave pConcave, List<Vector2[]> pSurfaceList,
        string pName, Vector2 pPointOffset, float zThickness, Vector2 pUvScale)
    {
        Debug.Log(pName+" UvScale:"+pUvScale.ToString("f8")+" PointOffset:"+pPointOffset.ToString("f8"));
        GameObject lOut = new GameObject(pName);
        MeshFilter lMeshFilter = lOut.AddComponent<MeshFilter>();
        MeshRenderer lMeshRenderer = lOut.AddComponent<MeshRenderer>();
        Mesh lMesh = new Mesh();

        if (Application.isPlaying)
            lMeshFilter.mesh = lMesh;
        else
            lMeshFilter.sharedMesh = lMesh;

        var lEdgeList = new List<Vector2[]>(pConcave.getHoleNum() + 1);
        lEdgeList.Add(pConcave.getOutSidePolygon().getShape());
        foreach (var lHole in pConcave.getHole())
        {
            lEdgeList.Add(lHole.getShape());
        }

        draw(lMesh, pSurfaceList, lEdgeList, zThickness, pUvScale, pPointOffset);
        return lOut;
    }
    public override void sweepPicture()
    {
        pointNumber = 0;
        polygonNumber = 0;
        holeNumber = 0;
        var lPatternResult = zzOutlineSweeper.sweeper(activeChart);
        imagePatterns = new Texture2D[lPatternResult.Count];
        imagePatternBounds = new zzPointBounds[lPatternResult.Count];

        //拾取图块
        for (int i = 0; i < lPatternResult.Count; ++i)
        {
            zzPointBounds lBounds = lPatternResult.sweeperPointResults[i].Bounds;
            imagePatternBounds[i] = lBounds;
            var lBoundMin = lBounds.min;
            var lBoundMax = lBounds.max;
            zzPoint lPatternSize = new zzPoint(
                Mathf.NextPowerOfTwo(lBoundMax.x - lBoundMin.x + 1),
                Mathf.NextPowerOfTwo(lBoundMax.y - lBoundMin.y + 1)
                );
            imagePatterns[i] = zzImagePatternPicker.pick(lPatternResult.patternMark, i + 1,
                picture, lBounds, lPatternSize);
        }
        //var lSweeperResults = zzOutlineSweeper.sweeper(activeChart, ignoreDistanceInSweeping);
        var lSweeperResults = zzOutlineSweeper
            .simplifySweeperResult(lPatternResult.sweeperPointResults, ignoreDistanceInSweeping);
        modelsSize = new Vector2((float)activeChart.width, (float)activeChart.height);

        //存储结果
        concaves = new List<zz2DConcave>();
        var lNewImagePatterns =new List<Texture2D>(lPatternResult.Count);
        var lNewPatternBounds = new List<zzPointBounds>(lPatternResult.Count);
        for (int i = 0; i < lSweeperResults.Count; ++i)
        {
            var lSweeperResult = lSweeperResults[i];
            var lImage = imagePatterns[i];
            if (lSweeperResult.edge.Length < 2 || lImage.width < 3 || lImage.height<3)
                continue;
            lNewImagePatterns.Add(lImage);
            lNewPatternBounds.Add(imagePatternBounds[i]);
            zzSimplyPolygon lPolygon = new zzSimplyPolygon();
            lPolygon.setShape(lSweeperResult.edge);

            zz2DConcave lConcave = new zz2DConcave();
            lConcave.setShape(lPolygon);
            ++polygonNumber;

            foreach (var lHole in lSweeperResult.holes)
            {
                if (lHole.Length < 2)
                    continue;
                zzSimplyPolygon lHolePolygon = new zzSimplyPolygon();
                lHolePolygon.setShape(lHole);
                lConcave.addHole(lHolePolygon);
                ++holeNumber;
            }

            concaves.Add(lConcave);
        }

        imagePatterns = lNewImagePatterns.ToArray();
        imagePatternBounds = lNewPatternBounds.ToArray();
    }
Example #5
0
    /// <summary>
    /// 凸剖凹边形,输出连接的两个点的信息
    /// </summary>
    /// <param name="pConcave"></param>
    /// <param name="Point1Data"></param>
    /// <param name="Point2Data"></param>
    /// <returns></returns>
    static zz2DConcave[] cut(zz2DConcave pConcave, PointDate Point1Data, PointDate Point2Data)
    {
        //if(Point1Data.polygonId!=0)
        //{
        //    Debug.LogError("Point1Data.polygonId!=0");
        //    return null;
        //}

        zz2DConcave lOut0 = new zz2DConcave();

        zzSimplyPolygon[] lCutedPolygon = zzSimplyPolygon.cut(Point1Data.point, Point2Data.point);
        var lHoles = pConcave.getHole();

        if (lCutedPolygon.Length==1)
        {
            if (Point1Data.polygonId == Point2Data.polygonId)
            {
                Debug.LogError("lCutedPolygon.Length==1 && Point1Data.polygonId == Point2Data.polygonId ");
            }
            //两点都在不同的孔上
            if (Point1Data.polygonId != 0 && Point2Data.polygonId != 0)
            {
                lOut0.setShape(pConcave.getOutSidePolygon());
                lOut0.addHole(lCutedPolygon[0]);
                //return new zz2DConcave[] { lOut0 };

            }
            else//一个点在孔上
            {
                lOut0.setShape(lCutedPolygon[0]);
                //for (int i = 0; i < lHoles.Length; ++i)
                //{
                //    if (Point1Data.polygonId != (i + 1) && Point2Data.polygonId != (i + 1))
                //        lOut0.addHole(lHoles[i]);
                //}

            }
            for (int i = 0; i < lHoles.Length; ++i)
            {
                int lHolePolygonID = getPolygonIDFromHoleIndex(i);
                if (Point1Data.polygonId != lHolePolygonID
                    && Point2Data.polygonId != lHolePolygonID)
                    lOut0.addHole(lHoles[i]);
            }

            return new zz2DConcave[] { lOut0 };
        }

        zz2DConcave lOut1 = new zz2DConcave();

        //两个点在相同的孔上
        if (Point1Data.polygonId != 0 && Point2Data.polygonId != 0)
        {
            lOut0.setShape(pConcave.mOutSidePoint);
            if (lCutedPolygon[0].bounds.Contains(lCutedPolygon[1].bounds))
            {
                lOut0.addHole(lCutedPolygon[0]);
                lOut1.setShape(lCutedPolygon[1]);
            }
            else if (lCutedPolygon[1].bounds.Contains(lCutedPolygon[0].bounds))
            {
                lOut0.addHole(lCutedPolygon[1]);
                lOut1.setShape(lCutedPolygon[0]);
            }
            else
                Debug.LogError("两个点在相同的孔上:bounds not contains another");
        }
        else
        {
            lOut0.setShape(lCutedPolygon[0]);
            lOut1.setShape(lCutedPolygon[1]);
        }

        int lHoleIndex = 0;
        foreach (var lHole in lHoles)
        {
            int lPolygonID = getPolygonIDFromHoleIndex(lHoleIndex);
            if (Point1Data.polygonId == lPolygonID || Point2Data.polygonId == lPolygonID)
                continue;

            int lIsInside = lCutedPolygon[0].isInside(lHole.getAllPoints().First.Value.position);
            if(lIsInside>0)
                lOut0.addHole(lHole);
            else if (lIsInside < 0)
                lOut1.addHole(lHole);
            else
                Debug.LogError("isInside == 0");

            ++lHoleIndex;
        }

        return new zz2DConcave[]{lOut0,lOut1};
    }
Example #6
0
    //private void createLine(Texture2D tex)
    //{
    //    List<Vector2[]> lEdges = zzOutlineSweeper.getEdge(tex,1.7f);
    //    foreach (var lEdge in lEdges)
    //    {
    //        zzSimplyPolygon lPolygon = new zzSimplyPolygon();
    //        lPolygon.setShape(lEdge);
    //        zzSimplyPolygonDebuger.createDebuger(lPolygon, "Picture");
    //    }
    //}
    //private List<Vector2[]> createMesh(Texture2D tex)
    //{
    //    List<Vector2[]> lEdges = zzOutlineSweeper.getEdge(tex, 1.7f);
    //    foreach (var lEdge in lEdges)
    //    {
    //        //zzSimplyPolygon lPolygon = new zzSimplyPolygon();
    //        //lPolygon.setShape(lEdge);
    //        //zzSimplyPolygonDebuger.createDebuger(lPolygon, "Picture");
    //        zz2DConcave lConcave = new zz2DConcave();
    //        lConcave.setShape(lEdge);
    //        zzSimplyPolygon[] lConvexs = lConcave.decompose();
    //        createFlatMesh(lConvexs, "myMesh", null);
    //    }
    //    return lEdges;
    //}
    private void lineTo3DTest()
    {
        zz2DConcave lConcave = new zz2DConcave();
        lConcave.setShape(toArray(mOutSidePolygon.getAllPoint()));
        lConcave.addHole(toArray(mHole.getAllPoint()));
        //zzPolygon polygon;
        //zz2DTriangle[]  lTriangles;
        //mLine =
        //    zzDecomposePolygon.triangulatingDecompose(lShapeList,out polygon,out lTriangles);

        //var polygonPoint = polygon.clonePoint();

        mOutSidePolygon.setPointInfo(lConcave.getOutSidePolygon().getAllPoints());
        mOutSidePolygon.bounds = lConcave.getOutSidePolygon().bounds;

        mHole.setPointInfo(lConcave.getHole(0).getAllPoints());
        mHole.bounds = lConcave.getHole(0).bounds;
        //print(lConcave)
        lConcave.printAllConcavePoint();

        print(mOutSidePolygon.bounds.Contains(point.getVec2Position()));
        print("Cross:" + lConcave.getOutSidePolygon().isCrossWithLine(lineBegin.getVec2Position(), lineEnd.getVec2Position()));

        //zzSimplyPolygonDebuger.createDebuger(zzSimplyPolygon.getSubPolygon(cutBegin.pointInfo, cutEnd.pointInfo), "PolygonDebuger");
        zzSimplyPolygon[] lConvexs = lConcave.decompose();
        zzSimplyPolygonDebuger.createDebuger(lConvexs, "decompose");
        createFlatMesh(lConvexs, "myMesh", null);
    }
 public static GameObject createDebuger(zz2DConcave pPolygon, string pName, Transform parent)
 {
     GameObject lOut = createDebuger(pPolygon, pName);
     lOut.transform.parent = parent;
     return lOut;
 }
 public static GameObject[] createDebuger(zz2DConcave pConcave, string pName, Transform parent)
 {
     GameObject[] lOut = createDebuger(pConcave, pName);
     foreach (var lObject in lOut)
     {
         lObject.transform.parent = parent;
     }
     return lOut;
 }
 public static GameObject[] createDebuger(zz2DConcave pConcave, string pName)
 {
     List<GameObject>    lOut = new List<GameObject>();
     lOut.Add(createDebuger(pConcave.getOutSidePolygon(), pName + "OutSide"));
     lOut.AddRange(createDebuger(pConcave.getHole(), pName + "Hole"));
     return lOut.ToArray();
 }