当前位置: 首页>>代码示例>>C#>>正文


C# Mesh.CreateFace方法代码示例

本文整理汇总了C#中Mesh.CreateFace方法的典型用法代码示例。如果您正苦于以下问题:C# Mesh.CreateFace方法的具体用法?C# Mesh.CreateFace怎么用?C# Mesh.CreateFace使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Mesh的用法示例。


在下文中一共展示了Mesh.CreateFace方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: MeshFromPolygons

		public static Mesh MeshFromPolygons(List<CsgPolygon> polygons)
		{
			Mesh model = new Mesh();
			HashSet<PolygonMesh.Vertex> vertices = new HashSet<PolygonMesh.Vertex>();
			for (int polygonIndex = 0; polygonIndex < polygons.Count; polygonIndex++)
			{
				CsgPolygon poly = polygons[polygonIndex];
				vertices.Clear();

				for (int vertexIndex = 0; vertexIndex < poly.vertices.Count; vertexIndex++)
				{
					vertices.Add(model.CreateVertex(poly.vertices[vertexIndex].Position));
				}

				if (vertices.Count > 2)
				{
					model.CreateFace(vertices.ToArray());
				}
			}

			return model;
		}
开发者ID:CNCBrasil,项目名称:agg-sharp,代码行数:22,代码来源:CsgOperations.cs

示例2: MeshCopy

		public void MeshCopy()
		{
			{
				Mesh testMesh = new Mesh();
				Vertex left = testMesh.CreateVertex(-1, -1, 0);
				Vertex middle = testMesh.CreateVertex(0, 1, 0);
				Vertex right = testMesh.CreateVertex(1, -1, 0);

				Vertex top = testMesh.CreateVertex(0, 0, 1);

				testMesh.CreateFace(new Vertex[] { left, top, middle });
				testMesh.CreateFace(new Vertex[] { left, right, top });
				testMesh.CreateFace(new Vertex[] { right, middle, top });
				testMesh.CreateFace(new Vertex[] { left, middle, right });

				testMesh.MergeVertices();

				MeshFileIo.Save(testMesh, "control.stl", new MeshOutputSettings(MeshOutputSettings.OutputType.Ascii));
				SaveDebugInfo(testMesh, "MeshCopy (orig)");

				Mesh copyMesh = Mesh.Copy(testMesh);

				MeshFileIo.Save(testMesh, "test.stl", new MeshOutputSettings(MeshOutputSettings.OutputType.Ascii));
				SaveDebugInfo(copyMesh, "MeshCopy (copy)");

				Mesh copyMesh2 = Mesh.Copy(copyMesh);

				MeshFileIo.Save(copyMesh2, "test2.stl", new MeshOutputSettings(MeshOutputSettings.OutputType.Ascii));
				SaveDebugInfo(copyMesh, "MeshCopy (copy2)");
			}
		}
开发者ID:glocklueng,项目名称:agg-sharp,代码行数:31,代码来源:MeshTests.cs

示例3: MeshEdgeSplitAndUnsplitTests

		public void MeshEdgeSplitAndUnsplitTests()
		{
			// split edge and create vert (not part of a polygon, just a wire mesh)
			{
				Mesh testMesh = new Mesh();
				Vertex leftVertex = testMesh.CreateVertex(-1, 0, 0);
				Vertex rightVertex = testMesh.CreateVertex(1, 0, 0);
				MeshEdge edgeToSplit = testMesh.CreateMeshEdge(leftVertex, rightVertex);
				Assert.IsTrue(edgeToSplit.VertexOnEnd[0] == leftVertex, "The edgeToSplit is connected the way we expect.");
				Assert.IsTrue(edgeToSplit.VertexOnEnd[1] == rightVertex, "The edgeToSplit is connected the way we expect.");
				Assert.IsTrue(leftVertex.firstMeshEdge == edgeToSplit, "First edge of left vertex is the edge.");
				Assert.IsTrue(rightVertex.firstMeshEdge == edgeToSplit, "First edge of right vertex is the edge.");
				MeshEdge edgeCreatedDuringSplit;
				Vertex vertexCreatedDuringSplit;
				testMesh.SplitMeshEdge(edgeToSplit, out vertexCreatedDuringSplit, out edgeCreatedDuringSplit);

				Assert.IsTrue(edgeToSplit.VertexOnEnd[1] == vertexCreatedDuringSplit);
				Assert.IsTrue(edgeToSplit.NextMeshEdgeFromEnd[0] == edgeToSplit);
				Assert.IsTrue(edgeToSplit.NextMeshEdgeFromEnd[1] == edgeCreatedDuringSplit);
				Assert.IsTrue(edgeCreatedDuringSplit.VertexOnEnd[0] == vertexCreatedDuringSplit, "The edgeCreatedDuringSplit is connected the way we expect.");
				Assert.IsTrue(edgeCreatedDuringSplit.VertexOnEnd[1] == rightVertex, "The edgeCreatedDuringSplit is connected the way we expect.");

				Assert.IsTrue(vertexCreatedDuringSplit.firstMeshEdge == edgeCreatedDuringSplit, "First edge of new vertex is the edge we split.");
				Assert.IsTrue(edgeCreatedDuringSplit.NextMeshEdgeFromEnd[0] == edgeToSplit, "The next edge is the one we created.");
				Assert.IsTrue(edgeCreatedDuringSplit.NextMeshEdgeFromEnd[1] == edgeCreatedDuringSplit, "The other side is connected to itself.");

				testMesh.UnsplitMeshEdge(edgeToSplit, vertexCreatedDuringSplit);
				Assert.IsTrue(edgeCreatedDuringSplit.VertexOnEnd[0] == null && edgeCreatedDuringSplit.VertexOnEnd[1] == null, "The edgeCreatedDuringSplit is no longer connected to Vertices.");
				Assert.IsTrue(edgeToSplit.VertexOnEnd[0] == leftVertex, "The unsplit edge is connected back the way it was.");
				Assert.IsTrue(edgeToSplit.VertexOnEnd[1] == rightVertex, "The unsplit edge is connected back the way it was.");
			}

			// split a polygon's edge and create vert
			{
				Mesh testMesh = new Mesh();
				Vertex leftVertex = testMesh.CreateVertex(-1, 0, 1);
				Vertex rightVertex = testMesh.CreateVertex(1, 0, 1);
				Vertex topVertex = testMesh.CreateVertex(-1, 0, -1);
				Face newFace = testMesh.CreateFace(new Vertex[] { rightVertex, topVertex, leftVertex });

				Assert.IsTrue(newFace.normal == Vector3.UnitY);

				Assert.IsTrue(newFace.NumVertices == 3, "We have a 3 vertex face.");
				Assert.IsTrue(newFace.FaceEdgeLoopIsGood());

				MeshEdge edgeToSplit = testMesh.FindMeshEdges(leftVertex, rightVertex)[0];
				Assert.IsTrue(edgeToSplit.VertexOnEnd[0] == leftVertex, "The edgeToSplit is connected the way we expect.");
				Assert.IsTrue(edgeToSplit.VertexOnEnd[1] == rightVertex, "The edgeToSplit is connected the way we expect.");

				MeshEdge edgeCreatedDuringSplit;
				Vertex vertexCreatedDuringSplit;
				SaveDebugInfo(testMesh);
				testMesh.SplitMeshEdge(edgeToSplit, out vertexCreatedDuringSplit, out edgeCreatedDuringSplit);
				SaveDebugInfo(testMesh);

				Assert.IsTrue(newFace.NumVertices == 4, "After SplitEdge it is a 4 vertex face.");
				Assert.IsTrue(newFace.FaceEdgeLoopIsGood());

				Assert.IsTrue(edgeCreatedDuringSplit.firstFaceEdge != null, "First face edge is connected.");
				Assert.IsTrue(edgeCreatedDuringSplit.firstFaceEdge.meshEdge == edgeCreatedDuringSplit, "The new face edge is connected to the created mesh edge.");
				Assert.IsTrue(edgeCreatedDuringSplit.VertexOnEnd[0] != null && edgeCreatedDuringSplit.VertexOnEnd[1] != null, "The edgeCreatedDuringSplit is connected to Vertices.");
				Assert.IsTrue(edgeCreatedDuringSplit.VertexOnEnd[0].GetConnectedMeshEdges().Contains(edgeCreatedDuringSplit), "The vertex connected to this mesh edege contains this mesh edge.");
				//Assert.IsTrue(edgeCreatedDuringSplit.VertexOnEnd[1].GetConnectedMeshEdges().Contains(edgeCreatedDuringSplit), "The vertex connected to this mesh edege contains this mesh edge.");

				testMesh.UnsplitMeshEdge(edgeToSplit, vertexCreatedDuringSplit);

				Assert.IsTrue(newFace.FaceEdgeLoopIsGood());

				Assert.IsTrue(newFace.NumVertices == 3, "Back to 3 after UnsplitEdge.");

				Assert.IsTrue(edgeCreatedDuringSplit.firstFaceEdge == null, "First face edge is disconnected.");
				Assert.IsTrue(edgeCreatedDuringSplit.VertexOnEnd[0] == null && edgeCreatedDuringSplit.VertexOnEnd[1] == null, "The edgeCreatedDuringSplit is no longer connected to Vertices.");
				Assert.IsTrue(edgeToSplit.VertexOnEnd[0] == leftVertex, "The unsplit edge is connected back the way it was.");
				Assert.IsTrue(edgeToSplit.VertexOnEnd[1] == rightVertex, "The unsplit edge is connected back the way it was.");

				// split again then unsplit the created edge rather than the original edge
				testMesh.SplitMeshEdge(edgeToSplit, out vertexCreatedDuringSplit, out edgeCreatedDuringSplit);

				testMesh.UnsplitMeshEdge(edgeCreatedDuringSplit, vertexCreatedDuringSplit);

				Assert.IsTrue(newFace.FaceEdgeLoopIsGood());

				Assert.IsTrue(newFace.NumVertices == 3, "Back to 3 after UnsplitEdge.");

				Assert.IsTrue(edgeToSplit.firstFaceEdge == null, "First face edge is disconnected.");
				Assert.IsTrue(edgeToSplit.VertexOnEnd[0] == null && edgeToSplit.VertexOnEnd[1] == null, "The edgeToSplit is no longer connected to Vertices.");
				Assert.IsTrue(edgeCreatedDuringSplit.VertexOnEnd[0] == leftVertex, "The unsplit edge is connected back the way it was.");
				Assert.IsTrue(edgeCreatedDuringSplit.VertexOnEnd[1] == rightVertex, "The unsplit edge is connected back the way it was.");
			}

			// make sure that the data on FaceEdges is correct (split the center edge of an extruded plus).
			{
				// make an extruded pluss sign.
				Mesh testMesh = new Mesh();
				Vertex centerVertex = testMesh.CreateVertex(0, 0, 0);
				Vertex leftVertex = testMesh.CreateVertex(-1, 0, 0);
				Vertex rightVertex = testMesh.CreateVertex(1, 0, 0);
				Vertex frontVertex = testMesh.CreateVertex(0, -1, 0);
				Vertex backVertex = testMesh.CreateVertex(0, 1, 0);

//.........这里部分代码省略.........
开发者ID:glocklueng,项目名称:agg-sharp,代码行数:101,代码来源:MeshTests.cs

示例4: MeshFaceSplitAndUnspiltTests

		public void MeshFaceSplitAndUnspiltTests()
		{
			{
				//                              centerVertexTop (0, 0, 2)
				//
				//
				//
				//
				// leftVertexBottom (-1, 0, 0)  centerVertexBottom (0, 0, 0)  rightVertexBottom (1, 0, 0)

				Mesh testMesh = new Mesh();
				Vertex leftVertexBottom = testMesh.CreateVertex(-1, 0, 0);
				Vertex centerVertexBottom = testMesh.CreateVertex(0, 0, 0);
				Vertex rightVertexBottom = testMesh.CreateVertex(1, 0, 0);
				Vertex centerVertexTop = testMesh.CreateVertex(0, 0, 1);
				Face originalFace = testMesh.CreateFace(new Vertex[] { leftVertexBottom, centerVertexBottom, rightVertexBottom, centerVertexTop });

				SaveDebugInfo(testMesh);
				//       *
				//      / \
				//     /   \
				//    /     \
				//   /       \
				//  *----*----*

				Assert.IsTrue(testMesh.FindMeshEdges(leftVertexBottom, centerVertexBottom).Count == 1);
				MeshEdge firstFaceEdgeMeshEdge = testMesh.FindMeshEdges(leftVertexBottom, centerVertexBottom)[0];
				Assert.IsTrue(originalFace.firstFaceEdge.meshEdge == firstFaceEdgeMeshEdge);
				Assert.IsTrue(originalFace.NumVertices == 4, "The original face has 4 vertices.");
				MeshEdge edgeLeftCenter = testMesh.FindMeshEdges(leftVertexBottom, centerVertexBottom)[0];
				MeshEdge edgeCenterRight = testMesh.FindMeshEdges(centerVertexBottom, rightVertexBottom)[0];
				MeshEdge edgeTopLeft = testMesh.FindMeshEdges(centerVertexTop, leftVertexBottom)[0];
				MeshEdge edgeRightTop = testMesh.FindMeshEdges(centerVertexTop, rightVertexBottom)[0];

				Assert.IsTrue(edgeTopLeft.NextMeshEdgeFromEnd[0] == edgeRightTop);
				Assert.IsTrue(edgeTopLeft.NextMeshEdgeFromEnd[1] == edgeLeftCenter);

				Assert.IsTrue(centerVertexBottom.GetConnectedMeshEdgesCount() == 2);

				string connectionInfoBeforeSplit = testMesh.GetConnectionInfoAsString();

				// split the face and test the result
				Face faceCreatedDuringSplit;
				MeshEdge meshEdgeCreatedDuringSplit;
				testMesh.SplitFace(originalFace, centerVertexBottom, centerVertexTop, out meshEdgeCreatedDuringSplit, out faceCreatedDuringSplit);
				SaveDebugInfo(testMesh);
				//       *
				//      /|\
				//     / | \
				//    /  |  \
				//   /   |   \
				//  *----*----*

				testMesh.Validate();
				//Debug.Write(testMesh.GetConnectionInfoAsString());

				Assert.IsTrue(meshEdgeCreatedDuringSplit.VertexOnEnd[0] == centerVertexBottom);
				Assert.IsTrue(meshEdgeCreatedDuringSplit.VertexOnEnd[1] == centerVertexTop);
				Assert.IsTrue(edgeLeftCenter.NextMeshEdgeFromEnd[1] == meshEdgeCreatedDuringSplit);
				Assert.IsTrue(edgeTopLeft.NextMeshEdgeFromEnd[1] == edgeLeftCenter);
				Assert.IsTrue(originalFace.firstFaceEdge.meshEdge == meshEdgeCreatedDuringSplit);
				Assert.IsTrue(originalFace.NumVertices == 3, "The original face now has 3 vertices.");
				Assert.IsTrue(centerVertexBottom.GetConnectedMeshEdgesCount() == 3);
				Assert.IsTrue(meshEdgeCreatedDuringSplit.GetNumFacesSharingEdge() == 2, "The edge we split on now has 2 faces attached to it.");
				Assert.IsTrue(centerVertexBottom.GetConnectedMeshEdgesCount() == 3, "The vertex we split on should now have 3 mesh edges attached to it.");
				Assert.IsTrue(centerVertexTop.GetConnectedMeshEdgesCount() == 3, "The vertex we split on should now have 3 mesh edges attached to it.");
				Assert.IsTrue(leftVertexBottom.GetConnectedMeshEdgesCount() == 2, "The original vertices should still have 2 mesh edges attached to them.");
				Assert.IsTrue(rightVertexBottom.GetConnectedMeshEdgesCount() == 2, "The original vertices should still have 2 mesh edges attached to them.");
				Assert.IsTrue(faceCreatedDuringSplit.NumVertices == 3, "The created now has 3 vertices.");

				// Unsplit the faces keeping the original face, and test the result.
				testMesh.UnsplitFace(originalFace, faceCreatedDuringSplit, meshEdgeCreatedDuringSplit);
				SaveDebugInfo(testMesh);
				//       *
				//      / \
				//     /   \
				//    /     \
				//   /       \
				//  *----*----*
				string connectionInfoAfterUnsplit = testMesh.GetConnectionInfoAsString();
				testMesh.Validate();
				foreach (FaceEdge faceEdge in originalFace.FaceEdges())
				{
					// make sure none of them are connected to the deleted MeshEdge
					Assert.IsTrue(faceEdge.meshEdge != meshEdgeCreatedDuringSplit);
					Assert.IsTrue(faceEdge.meshEdge.NextMeshEdgeFromEnd[0] != meshEdgeCreatedDuringSplit);
					Assert.IsTrue(faceEdge.meshEdge.NextMeshEdgeFromEnd[1] != meshEdgeCreatedDuringSplit);
				}
				//Debug.Write(testMesh.GetConnectionInfoAsString());
				Assert.IsTrue(originalFace.NumVertices == 4, "The original face is back to 4 vertices.");
				Assert.IsTrue(meshEdgeCreatedDuringSplit.firstFaceEdge == null, "The data for the deleted edge is all null to help debugging.");
				Assert.IsTrue(meshEdgeCreatedDuringSplit.VertexOnEnd[0] == null, "The data for the deleted edge is all null to help debugging.");
				Assert.IsTrue(meshEdgeCreatedDuringSplit.NextMeshEdgeFromEnd[0] == null, "The data for the deleted edge is all null to help debugging.");
				Assert.IsTrue(meshEdgeCreatedDuringSplit.VertexOnEnd[1] == null, "The data for the deleted edge is all null to help debugging.");
				Assert.IsTrue(meshEdgeCreatedDuringSplit.NextMeshEdgeFromEnd[1] == null, "The data for the deleted edge is all null to help debugging.");
				Assert.IsTrue(faceCreatedDuringSplit.firstFaceEdge == null, "The data for the deleted face is all null to help debugging.");

				Assert.IsTrue(centerVertexBottom.GetConnectedMeshEdgesCount() == 2, "The vertex we split on should now have 2 mesh edges attached to it.");
				Assert.IsTrue(centerVertexTop.GetConnectedMeshEdgesCount() == 2, "The vertex we split on should now have 2 mesh edges attached to it.");
			}
//.........这里部分代码省略.........
开发者ID:glocklueng,项目名称:agg-sharp,代码行数:101,代码来源:MeshTests.cs

示例5: MergeMeshEdges

		public void MergeMeshEdges()
		{
			{
				Mesh testMesh = new Mesh();
				Vertex leftVertexBottom = testMesh.CreateVertex(-1, 0, 0);
				Vertex centerVertexBottom = testMesh.CreateVertex(0, 0, 0);
				Vertex centerVertexTop = testMesh.CreateVertex(0, 0, 1);
				Face leftFace = testMesh.CreateFace(new Vertex[] { leftVertexBottom, centerVertexBottom, centerVertexTop });
				SaveDebugInfo(testMesh);

				Vertex rightVertexBottom = testMesh.CreateVertex(1, 0, 0);
				Face rightFace = testMesh.CreateFace(new Vertex[] { centerVertexBottom, rightVertexBottom, centerVertexTop }, CreateOption.CreateNew);

				SaveDebugInfo(testMesh);

				foreach (MeshEdge meshEdge in testMesh.MeshEdges)
				{
					Assert.IsTrue(meshEdge.firstFaceEdge != null);
				}

				Assert.IsTrue(testMesh.MeshEdges.Count == 6);

				Assert.IsTrue(testMesh.FindMeshEdges(centerVertexTop, centerVertexBottom).Count == 2);
				testMesh.MergeMeshEdges();
				SaveDebugInfo(testMesh);
				Assert.IsTrue(testMesh.MeshEdges.Count == 5);
			}
		}
开发者ID:glocklueng,项目名称:agg-sharp,代码行数:28,代码来源:MeshTests.cs

示例6: MergeVertices

		public void MergeVertices()
		{
			{
				Mesh testMesh = new Mesh();
				Vertex leftVertexBottom = testMesh.CreateVertex(-1, 0, 0);
				Vertex rightVertexBottom = testMesh.CreateVertex(1, 0, 0);
				Vertex centerVertexMiddle1 = testMesh.CreateVertex(0, 0, 1);

				MeshEdge meshEdgeBottomLeftRight = testMesh.CreateMeshEdge(leftVertexBottom, rightVertexBottom);
				MeshEdge meshEdgeBottomRightCenter = testMesh.CreateMeshEdge(rightVertexBottom, centerVertexMiddle1);
				MeshEdge meshEdgeBottomCenterLeft = testMesh.CreateMeshEdge(centerVertexMiddle1, leftVertexBottom);

				Vertex leftVertexTop = testMesh.CreateVertex(-1, 0, 2);
				Vertex centerVertexMiddle2 = testMesh.CreateVertex(0, 0, 1, CreateOption.CreateNew);
				Vertex rightVertexTop = testMesh.CreateVertex(1, 0, 2);

				MeshEdge meshEdgeTopLeftCenter = testMesh.CreateMeshEdge(leftVertexTop, centerVertexMiddle2);
				MeshEdge meshEdgeTopCenterRight = testMesh.CreateMeshEdge(centerVertexMiddle2, rightVertexTop);
				MeshEdge meshEdgeTopRightLeft = testMesh.CreateMeshEdge(rightVertexTop, leftVertexTop);

				Assert.IsTrue(meshEdgeBottomRightCenter.VertexOnEnd[1] == centerVertexMiddle1);
				Assert.IsTrue(meshEdgeTopLeftCenter.VertexOnEnd[1] == centerVertexMiddle2);

				SaveDebugInfo(testMesh);

				testMesh.MergeVertices(centerVertexMiddle1, centerVertexMiddle2);

				Assert.IsTrue(!testMesh.Vertices.ContainsVertex(centerVertexMiddle2));

				Assert.IsTrue(meshEdgeBottomRightCenter.VertexOnEnd[1] == centerVertexMiddle1);
				Assert.IsTrue(meshEdgeBottomCenterLeft.VertexOnEnd[0] == centerVertexMiddle1);
				Assert.IsTrue(meshEdgeTopLeftCenter.VertexOnEnd[1] == centerVertexMiddle1);
				Assert.IsTrue(meshEdgeTopCenterRight.VertexOnEnd[0] == centerVertexMiddle1);

				int connectedCount = 0;
				foreach (MeshEdge meshEdge in centerVertexMiddle1.ConnectedMeshEdges())
				{
					connectedCount++;
				}
				Assert.IsTrue(connectedCount == 4);

				SaveDebugInfo(testMesh);
			}

			{
				Mesh testMesh = new Mesh();
				Vertex leftVertexBottom = testMesh.CreateVertex(-1, 0, 0);
				Vertex rightVertexBottom = testMesh.CreateVertex(1, 0, 0);
				Vertex centerVertexMiddle1 = testMesh.CreateVertex(0, 0, 1);

				MeshEdge meshEdgeBottomLeftRight = testMesh.CreateMeshEdge(leftVertexBottom, rightVertexBottom);
				MeshEdge meshEdgeBottomRightCenter = testMesh.CreateMeshEdge(rightVertexBottom, centerVertexMiddle1);
				MeshEdge meshEdgeBottomCenterLeft = testMesh.CreateMeshEdge(centerVertexMiddle1, leftVertexBottom);

				Vertex leftVertexTop = testMesh.CreateVertex(-1, 0, 2);
				Vertex centerVertexMiddle2 = testMesh.CreateVertex(0, 0, 1, CreateOption.CreateNew);
				Vertex rightVertexTop = testMesh.CreateVertex(1, 0, 2);

				MeshEdge meshEdgeTopLeftCenter = testMesh.CreateMeshEdge(leftVertexTop, centerVertexMiddle2);
				MeshEdge meshEdgeTopCenterRight = testMesh.CreateMeshEdge(centerVertexMiddle2, rightVertexTop);
				MeshEdge meshEdgeTopRightLeft = testMesh.CreateMeshEdge(rightVertexTop, leftVertexTop);

				Assert.IsTrue(meshEdgeBottomRightCenter.VertexOnEnd[1] == centerVertexMiddle1);
				Assert.IsTrue(meshEdgeTopLeftCenter.VertexOnEnd[1] == centerVertexMiddle2);

				SaveDebugInfo(testMesh);

				testMesh.MergeVertices(centerVertexMiddle2, centerVertexMiddle1);

				Assert.IsTrue(testMesh.Vertices.ContainsVertex(centerVertexMiddle2));

				Assert.IsTrue(meshEdgeBottomRightCenter.VertexOnEnd[1] == centerVertexMiddle2);
				Assert.IsTrue(meshEdgeBottomCenterLeft.VertexOnEnd[0] == centerVertexMiddle2);
				Assert.IsTrue(meshEdgeTopLeftCenter.VertexOnEnd[1] == centerVertexMiddle2);
				Assert.IsTrue(meshEdgeTopCenterRight.VertexOnEnd[0] == centerVertexMiddle2);

				int connectedCount = 0;
				foreach (MeshEdge meshEdge in centerVertexMiddle2.ConnectedMeshEdges())
				{
					connectedCount++;
				}
				Assert.IsTrue(connectedCount == 4);

				SaveDebugInfo(testMesh);
			}

			{
				Mesh testMesh = new Mesh();
				Vertex leftVertexBottom = testMesh.CreateVertex(-1, 0, 0);
				Vertex rightVertexBottom = testMesh.CreateVertex(1, 0, 0);
				Vertex centerVertexMiddle1 = testMesh.CreateVertex(0, 0, 1);

				Face bottomFace = testMesh.CreateFace(new Vertex[] { leftVertexBottom, rightVertexBottom, centerVertexMiddle1 });

				Vertex leftVertexTop = testMesh.CreateVertex(-1, 0, 2);
				Vertex centerVertexMiddle2 = testMesh.CreateVertex(0, 0, 1, CreateOption.CreateNew);
				Vertex rightVertexTop = testMesh.CreateVertex(1, 0, 2);

				Face top = testMesh.CreateFace(new Vertex[] { leftVertexTop, centerVertexMiddle2, rightVertexTop });

//.........这里部分代码省略.........
开发者ID:glocklueng,项目名称:agg-sharp,代码行数:101,代码来源:MeshTests.cs

示例7: DoMerge

		public static Mesh DoMerge(List<MeshGroup> meshGroupsToMerge, MeshOutputSettings outputInfo)
		{
			Mesh allPolygons = new Mesh();
			if (outputInfo.CsgOptionState == MeshOutputSettings.CsgOption.DoCsgMerge)
			{
				foreach (MeshGroup meshGroup in meshGroupsToMerge)
				{
					foreach (Mesh mesh in meshGroup.Meshes)
					{
						allPolygons = CsgOperations.Union(allPolygons, mesh);
					}
				}
			}
			else
			{
				foreach (MeshGroup meshGroup in meshGroupsToMerge)
				{
					foreach (Mesh mesh in meshGroup.Meshes)
					{
						int currentMeshMaterialIntdex = MeshMaterialData.Get(mesh).MaterialIndex;
						if (outputInfo.MaterialIndexsToSave == null || outputInfo.MaterialIndexsToSave.Contains(currentMeshMaterialIntdex))
						{
							foreach (Face face in mesh.Faces)
							{
								List<Vertex> faceVertices = new List<Vertex>();
								foreach (FaceEdge faceEdgeToAdd in face.FaceEdges())
								{
									// we allow duplicates (the true) to make sure we are not changing the loaded models acuracy.
									Vertex newVertex = allPolygons.CreateVertex(faceEdgeToAdd.firstVertex.Position, CreateOption.CreateNew, SortOption.WillSortLater);
									faceVertices.Add(newVertex);
								}

								// we allow duplicates (the true) to make sure we are not changing the loaded models acuracy.
								allPolygons.CreateFace(faceVertices.ToArray(), CreateOption.CreateNew);
							}
						}
					}
				}

				allPolygons.CleanAndMergMesh();
			}

			return allPolygons;
		}
开发者ID:glocklueng,项目名称:agg-sharp,代码行数:44,代码来源:MeshFileIo.cs

示例8: ReadVolume

		private static Mesh ReadVolume(XmlReader xmlTree, List<Vector3> vertices, ProgressData progressData)
		{
			Mesh newMesh = new Mesh();
			while (xmlTree.Read())
			{
				if (xmlTree.Name == "triangle")
				{
					using (XmlReader triangleTree = xmlTree.ReadSubtree())
					{
						while (triangleTree.Read())
						{
							int[] indices = new int[3];
							while (triangleTree.Read())
							{
								switch (triangleTree.Name)
								{
									case "v1":
										string v1 = triangleTree.ReadString();
										indices[0] = int.Parse(v1);
										break;

									case "v2":
										string v2 = triangleTree.ReadString();
										indices[1] = int.Parse(v2);
										break;

									case "v3":
										string v3 = triangleTree.ReadString();
										indices[2] = int.Parse(v3);
										break;

									case "map":
										using (XmlReader mapTree = triangleTree.ReadSubtree())
										{
										}
										// a texture map, has u1...un and v1...vn
										break;

									default:
										break;
								}
							}
							if (indices[0] != indices[1]
								&& indices[0] != indices[2]
								&& indices[1] != indices[2]
								&& vertices[indices[0]] != vertices[indices[1]]
								&& vertices[indices[1]] != vertices[indices[2]]
								&& vertices[indices[2]] != vertices[indices[0]])
							{
								Vertex[] triangle = new Vertex[]
                                {
                                    newMesh.CreateVertex(vertices[indices[0]], CreateOption.CreateNew, SortOption.WillSortLater),
                                    newMesh.CreateVertex(vertices[indices[1]], CreateOption.CreateNew, SortOption.WillSortLater),
                                    newMesh.CreateVertex(vertices[indices[2]], CreateOption.CreateNew, SortOption.WillSortLater),
                                };
								newMesh.CreateFace(triangle, CreateOption.CreateNew);
							}

							bool continueProcessing;
							progressData.ReportProgress0To50(out continueProcessing);
							if (!continueProcessing)
							{
								// this is what we should do but it requires a bit more debugging.
								return null;
							}
						}
					}
				}
			}
			return newMesh;
		}
开发者ID:eriser,项目名称:agg-sharp,代码行数:71,代码来源:AmfProcessing.cs

示例9: ParseFileContents

		public static Mesh ParseFileContents(Stream stlStream, ReportProgressRatio reportProgress)
		{
			Stopwatch time = new Stopwatch();
			time.Start();
			Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

			double parsingFileRatio = .5;

			if (stlStream == null)
			{
				return null;
			}

			//MemoryStream stlStream = new MemoryStream();
			//stlStreamIn.CopyTo(stlStream);

			Stopwatch maxProgressReport = new Stopwatch();
			maxProgressReport.Start();
			Mesh meshFromStlFile = new Mesh();
			//meshFromStlFile.MaxDistanceToConsiderVertexAsSame = .0000005;
			long bytesInFile = stlStream.Length;
			if (bytesInFile <= 80)
			{
				return null;
			}

			byte[] first160Bytes = new byte[160];
			stlStream.Read(first160Bytes, 0, 160);
			byte[] ByteOredrMark = new byte[] { 0xEF, 0xBB, 0xBF };
			int startOfString = 0;
			if (first160Bytes[0] == ByteOredrMark[0] && first160Bytes[0] == ByteOredrMark[0] && first160Bytes[0] == ByteOredrMark[0])
			{
				startOfString = 3;
			}
			string first160BytesOfSTLFile = System.Text.Encoding.UTF8.GetString(first160Bytes, startOfString, first160Bytes.Length - startOfString);
			if (first160BytesOfSTLFile.StartsWith("solid") && first160BytesOfSTLFile.Contains("facet"))
			{
				stlStream.Position = 0;
				StreamReader stlReader = new StreamReader(stlStream);
				int vectorIndex = 0;
				Vector3 vector0 = new Vector3(0, 0, 0);
				Vector3 vector1 = new Vector3(0, 0, 0);
				Vector3 vector2 = new Vector3(0, 0, 0);
				string line = stlReader.ReadLine();
				Regex onlySingleSpaces = new Regex("\\s+", RegexOptions.Compiled);
				while (line != null)
				{
					line = onlySingleSpaces.Replace(line, " ");
					var parts = line.Trim().Split(' ');
					if (parts[0].Trim() == "vertex")
					{
						vectorIndex++;
						switch (vectorIndex)
						{
							case 1:
								vector0.x = Convert.ToDouble(parts[1]);
								vector0.y = Convert.ToDouble(parts[2]);
								vector0.z = Convert.ToDouble(parts[3]);
								break;

							case 2:
								vector1.x = Convert.ToDouble(parts[1]);
								vector1.y = Convert.ToDouble(parts[2]);
								vector1.z = Convert.ToDouble(parts[3]);
								break;

							case 3:
								vector2.x = Convert.ToDouble(parts[1]);
								vector2.y = Convert.ToDouble(parts[2]);
								vector2.z = Convert.ToDouble(parts[3]);
								if (!Vector3.Collinear(vector0, vector1, vector2))
								{
									Vertex vertex1 = meshFromStlFile.CreateVertex(vector0, CreateOption.CreateNew, SortOption.WillSortLater);
									Vertex vertex2 = meshFromStlFile.CreateVertex(vector1, CreateOption.CreateNew, SortOption.WillSortLater);
									Vertex vertex3 = meshFromStlFile.CreateVertex(vector2, CreateOption.CreateNew, SortOption.WillSortLater);
									meshFromStlFile.CreateFace(new Vertex[] { vertex1, vertex2, vertex3 }, CreateOption.CreateNew);
								}
								vectorIndex = 0;
								break;
						}
					}
					line = stlReader.ReadLine();

					if (reportProgress != null && maxProgressReport.ElapsedMilliseconds > 200)
					{
						bool continueProcessing;
						reportProgress(stlStream.Position / (double)bytesInFile * parsingFileRatio, "Loading Polygons", out continueProcessing);
						if (!continueProcessing)
						{
							stlStream.Close();
							return null;
						}
						maxProgressReport.Restart();
					}
				}
			}
			else
			{
				// load it as a binary stl
				// skip the first 80 bytes
//.........这里部分代码省略.........
开发者ID:glocklueng,项目名称:agg-sharp,代码行数:101,代码来源:StlProcessing.cs


注:本文中的Mesh.CreateFace方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。