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(); }
/// <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}; }
//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(); }