public void EnterFoldingMode(Vertex pickedVertex, Face nearestFace) { this.cloverController = CloverController.GetInstance(); // 寻找同group面中拥有pickedVertex的面中最下面的那个面作为baseFace this.group = cloverController.FaceGroupLookupTable.GetGroup(nearestFace); if (this.group == null) { System.Windows.MessageBox.Show("找不到Groups"); return; } this.pickedVertex = pickedVertex; this.baseFace = nearestFace; foreach (Face face in group.GetFaceList()) { if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer < baseFace.Layer) baseFace = face; } // 将同Group的面分为在base面之上(含baseFace)和base面之下的两组 foreach (Face face in group.GetFaceList()) { if (face.Layer >= baseFace.Layer) this.facesAboveBase.Add(face); else this.facesBelowBase.Add(face); } // 保存pickedVertex的原始位置 originPoint = new Point3D(pickedVertex.X, pickedVertex.Y, pickedVertex.Z); }
public List<Face> EnterTuckingMode(Vertex pickedVertex, Face nearestFace) { this.cloverController = CloverController.GetInstance(); //cloverController.ShadowSystem.CheckUndoTree(); // 寻找同group面中拥有pickedVertex的面中最下面的那个面作为floorFace,最上面的那个面作为ceilingFace this.group = cloverController.FaceGroupLookupTable.GetGroup(nearestFace); this.pickedVertex = pickedVertex; this.floorFace = this.ceilingFace = nearestFace; // 是正向还是反向 Vector3D currNormal = group.Normal * cloverController.RenderController.Entity.Transform.Value; Double judge = Vector3D.DotProduct(currNormal, new Vector3D(0, 0, 1)); isPositive = judge < 0 ? false : true; if (isPositive) { foreach (Face face in group.GetFaceList()) { if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer < floorFace.Layer) floorFace = face; if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer > ceilingFace.Layer) ceilingFace = face; } // 将同Group的面分为在floor和ceiling之间和在floor和ceiling之外两组 foreach (Face face in group.GetFaceList()) { if (face.Layer >= floorFace.Layer && face.Layer <= ceilingFace.Layer) this.facesInHouse.Add(face); else this.facesNotInHouse.Add(face); } } else { foreach (Face face in group.GetFaceList()) { if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer > floorFace.Layer) floorFace = face; if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer < ceilingFace.Layer) ceilingFace = face; } // 将同Group的面分为在floor和ceiling之间和在floor和ceiling之外两组 foreach (Face face in group.GetFaceList()) { if (face.Layer <= floorFace.Layer && face.Layer >= ceilingFace.Layer) this.facesInHouse.Add(face); else this.facesNotInHouse.Add(face); } } // 保存pickedVertex的原始位置 originPoint = new Point3D(pickedVertex.X, pickedVertex.Y, pickedVertex.Z); return facesInHouse; }
public List<Face> EnterFoldingMode(Vertex pickedVertex, Face nearestFace) { this.cloverController = CloverController.GetInstance(); //cloverController.ShadowSystem.CheckUndoTree(); // 寻找同group面中拥有pickedVertex的面中最下面的那个面作为baseFace this.group = cloverController.FaceGroupLookupTable.GetGroup(nearestFace); this.pickedVertex = pickedVertex; this.baseFace = nearestFace; // 是正向还是反向 Vector3D currNormal = group.Normal * cloverController.RenderController.Entity.Transform.Value; Double judge = Vector3D.DotProduct(currNormal, new Vector3D(0, 0, 1)); isPositive = judge < 0 ? false : true; if (isPositive) { foreach (Face face in group.GetFaceList()) { if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer < baseFace.Layer) baseFace = face; } // 将同Group的面分为在base面之上(含baseFace)和base面之下的两组 foreach (Face face in group.GetFaceList()) { if (face.Layer >= baseFace.Layer) this.facesAboveBase.Add(face); else this.facesBelowBase.Add(face); } } else { foreach (Face face in group.GetFaceList()) { if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer > baseFace.Layer) baseFace = face; } // 将同Group的面分为在base面之上(含baseFace)和base面之下的两组 foreach (Face face in group.GetFaceList()) { if (face.Layer <= baseFace.Layer) this.facesAboveBase.Add(face); else this.facesBelowBase.Add(face); } } // 保存pickedVertex的原始位置 originPoint = new Point3D(pickedVertex.X, pickedVertex.Y, pickedVertex.Z); return facesAboveBase; }
public void Initliaze( Face root ) { this.root = root; root.UpdateVertices(); facecellTree = new FacecellTree( root ); this.controller = CloverController.GetInstance(); }
public static CloverController GetInstance() { if (instance == null) { Debug.Assert(window != null); instance = new CloverController(window); } return instance; }
/// <summary> /// 初始化纸张 /// </summary> /// <param name="width">纸张的宽</param> /// <param name="height">纸张的高</param> private void InitializePaper(Single width, Single height) { CloverController.InitializeInstance(this); cloverController = CloverController.GetInstance(); cloverController.Initialize(width, height); if (foldingPaperViewport.Children.Contains(cloverController.Model)) foldingPaperViewport.Children.Remove(cloverController.Model); foldingPaperViewport.Children.Add(cloverController.Model); cloverInterpreter.InitialzeInterpreter(); }
/// <summary> /// 两边对称的进行tuck in层的调整 /// </summary> public bool UpdateLayerInfoAfterTuckIn(Face _ceilingFace, Face _floorFace, Edge _currTuckLine, bool _isPositive) { cloverController = CloverController.GetInstance(); Face cf = _ceilingFace.LeftChild; FaceGroup currGroup = cloverController.FaceGroupLookupTable.GetGroup(_ceilingFace.LeftChild); List<Face> facesContainsCeiling = currGroup.GetFaceList(); List<Face> facesAboveCeiling = new List<Face>(); // 找到当前正确的_ceilingFace和_floorFace. foreach (Face face in facesContainsCeiling) { if (face.Layer == _ceilingFace.Layer && CloverTreeHelper.IsEdgeCrossedFace(face, _currTuckLine)) _ceilingFace = face; if (face.Layer == _floorFace.Layer && CloverTreeHelper.IsEdgeCrossedFace(face, _currTuckLine)) _floorFace = face; } if (_isPositive) { foreach (Face face in facesContainsCeiling) { if (face.Layer > _ceilingFace.Layer) facesAboveCeiling.Add(face); } } else { foreach (Face face in facesContainsCeiling) { if (face.Layer < _ceilingFace.Layer) facesAboveCeiling.Add(face); } } // 修订_ceilingFace的层数到最高层, 且_ceilingFace的层数一定为奇数 // 若_ceilingFace和_floorFace的层数相差超过一层,则不修改 if (Math.Abs((_ceilingFace.Layer - _floorFace.Layer)) <= 1) { if (_isPositive) { _ceilingFace.Layer += facesAboveCeiling.Count(); if (_ceilingFace.Layer % 2 == 0) return false; } else { _ceilingFace.Layer -= facesAboveCeiling.Count(); if (_ceilingFace.Layer % 2 != 0) return false; } } // 先将所有高于_ceilingFace的面按照层进行排序 facesAboveCeiling.Sort(new layerComparer()); // 将TuckingIn的面进行层排列 if (_isPositive) { for (int i = (facesAboveCeiling.Count() - 1), j = 1; i >= 0; i--, j++) facesAboveCeiling[i].Layer = _floorFace.Layer + j; } else { for (int i = 0, j = 1; i < facesAboveCeiling.Count(); i++, j++) facesAboveCeiling[i].Layer = _floorFace.Layer - j; } currGroup.SortFace(); return true; }