/// <summary> /// Delaunay3dクラスの新規インスタンスを初期化し,givenな節点座標と新たに振り直した節点番号をセットする. /// </summary> /// <param name="p">節点リスト</param> public Delaunay3d(List<Node> p) { given_node = new List<Node>(); for (int i = 0; i < p.Count; i++) { given_node.Add(new Node(i, false, p[i].X, p[i].Y, p[i].Z)); } bracket_node = new List<Node>(); delaunay_elements = new List<Element3D>(); delaunay_edges = new List<Edge>(); SetBracketTriangle(); SerializeContainer = new XmlSerializerContainer4Mesh(); }
/// <summary> /// Delaunay2dクラスの新規インスタンスを初期化し,givenな節点座標と新たに振り直した節点番号をセットする. /// </summary> /// <param name="p">節点リスト</param> public Delaunay2d(List<Node> p) { Complete = false; given_node = new List<Node>(); for (int i = 0; i < p.Count; i++) { given_node.Add(new Node(i, p[i].OnBoundary, p[i].X, p[i].Y)); } bracket_node = new List<Node>(); delaunay_elements = new List<DelaunayElement2D>(); delaunay_edges = new List<Edge>(); SetBracketTriangle(); SerializeContainer = new XmlSerializerContainer4Mesh(); }
/// <summary> /// Delaunay分割されたメッシュの座標をXMLファイルに出力する. /// </summary> public void PrintXML() { SerializeContainer = new XmlSerializerContainer4Mesh(delaunay_elements.Count, 4, delaunay_edges.Count, given_node.Count, 0); for (int i = 0; i < delaunay_elements.Count; i++) { SerializeContainer.ElemPart.Elements[i].ID = i; SerializeContainer.ElemPart.Elements[i].ElementCode = "Tria03"; for (int j = 0; j < 4; j++) { SerializeContainer.ElemPart.Elements[i].Nodes[j].InternalID = j; SerializeContainer.ElemPart.Elements[i].Nodes[j].ID = delaunay_elements[i].GetPoint(j).ID; SerializeContainer.ElemPart.Elements[i].Nodes[j].Coordinates[0].Sou = "mm"; SerializeContainer.ElemPart.Elements[i].Nodes[j].Coordinates[0].CoordinateAxis = "x"; SerializeContainer.ElemPart.Elements[i].Nodes[j].Coordinates[0].Value = delaunay_elements[i].GetPoint(j).X; SerializeContainer.ElemPart.Elements[i].Nodes[j].Coordinates[1].Sou = "mm"; SerializeContainer.ElemPart.Elements[i].Nodes[j].Coordinates[1].CoordinateAxis = "y"; SerializeContainer.ElemPart.Elements[i].Nodes[j].Coordinates[1].Value = delaunay_elements[i].GetPoint(j).Y; SerializeContainer.ElemPart.Elements[i].Nodes[j].Coordinates[2].Sou = "mm"; SerializeContainer.ElemPart.Elements[i].Nodes[j].Coordinates[2].CoordinateAxis = "z"; SerializeContainer.ElemPart.Elements[i].Nodes[j].Coordinates[2].Value = delaunay_elements[i].GetPoint(j).Z; } SerializeContainer.ElemPart.Elements[i].MaterialName = "Alminum"; SerializeContainer.ElemPart.Elements[i].Density = 2700; SerializeContainer.ElemPart.Elements[i].Young = 200000; SerializeContainer.ElemPart.Elements[i].Poisson = 0.5; } for (int i = 0; i < given_node.Count; i++) { SerializeContainer.NodePart.Nodes[i].ID = given_node[i].ID; SerializeContainer.NodePart.Nodes[i].Coordinates[0].Sou = "mm"; SerializeContainer.NodePart.Nodes[i].Coordinates[0].CoordinateAxis = "x"; SerializeContainer.NodePart.Nodes[i].Coordinates[0].Value = given_node[i].X; SerializeContainer.NodePart.Nodes[i].Coordinates[1].Sou = "mm"; SerializeContainer.NodePart.Nodes[i].Coordinates[1].CoordinateAxis = "y"; SerializeContainer.NodePart.Nodes[i].Coordinates[1].Value = given_node[i].Y; SerializeContainer.NodePart.Nodes[i].Coordinates[2].Sou = "mm"; SerializeContainer.NodePart.Nodes[i].Coordinates[2].CoordinateAxis = "z"; SerializeContainer.NodePart.Nodes[i].Coordinates[2].Value = given_node[i].Z; } for (int i = 0; i < delaunay_edges.Count; i++) { SerializeContainer.EdgePart.Edges[i].ID = delaunay_edges[i].ID; SerializeContainer.EdgePart.Edges[i].NodeID[0] = delaunay_edges[i].StartNodeId; SerializeContainer.EdgePart.Edges[i].NodeID[1] = delaunay_edges[i].EndNodeId; } var serializer = new XmlSerializer(typeof(MeshContainer.XmlSerializerContainer4Mesh)); var fs = new FileStream("mesh_"+DateTime.Now.ToString("yyyyMMddHHmmssfff")+".xml", FileMode.Create); var setting = new XmlWriterSettings(); setting.Indent = true; setting.IndentChars = " "; setting.OmitXmlDeclaration = false; serializer.Serialize(fs, SerializeContainer); fs.Close(); }
public void LaplacianSmoothing() { List<Node> NewNode = new List<Node>(); for (int i = 0; i < given_node.Count; ++i) { if (!given_node[i].OnBoundary) { double x_sum=0; double y_sum=0; List<DelaunayElement2D> around_ele = new List<DelaunayElement2D>(); around_ele = delaunay_elements.FindAll(ls => ls.Nodes.Exists(ls2 => ls2.ID == given_node[i].ID)); for (int j = 0; j < around_ele.Count; ++j) { for(int k=0;k<3;++k) { if (around_ele[j].Nodes[k].ID != given_node[i].ID) { x_sum += around_ele[j].Nodes[k].X; y_sum += around_ele[j].Nodes[k].Y; } } } NewNode.Add(new Node(given_node[i].ID,false,x_sum/2.0/around_ele.Count,y_sum/2.0/around_ele.Count)); } else { NewNode.Add(given_node[i]); } } Complete = false; given_node.Clear(); for (int i = 0; i < NewNode.Count; i++) { given_node.Add(NewNode[i]); } bracket_node = new List<Node>(); delaunay_elements = new List<DelaunayElement2D>(); delaunay_edges = new List<Edge>(); SetBracketTriangle(); SerializeContainer = new XmlSerializerContainer4Mesh(); }