/// <summary> /// Read the elements from an .ele file. /// </summary> /// <param name="elefilename"></param> /// <param name="data"></param> /// <param name="readArea"></param> private static List<ITriangle> ReadEleFile(string elefilename, bool readArea) { int intriangles = 0, attributes = 0; List<ITriangle> triangles; using (StreamReader reader = new StreamReader(elefilename)) { // Read number of elements and number of attributes. string[] line; bool validRegion = false; if (!TryReadLine(reader, out line)) { throw new Exception("Can't read input file (elements)."); } intriangles = int.Parse(line[0]); // We irgnore index 1 (number of nodes per triangle) attributes = 0; if (line.Length > 2) { attributes = int.Parse(line[2]); validRegion = true; } if (attributes > 1) { Log.Instance.Warning("Triangle attributes not supported.", "FileReader.Read"); } triangles = new List<ITriangle>(intriangles); InputTriangle tri; // Read triangles. for (int i = 0; i < intriangles; i++) { if (!TryReadLine(reader, out line)) { throw new Exception("Can't read input file (elements)."); } if (line.Length < 4) { throw new Exception("Triangle has no nodes."); } // TODO: startIndex ok? tri = new InputTriangle( int.Parse(line[1]) - startIndex, int.Parse(line[2]) - startIndex, int.Parse(line[3]) - startIndex); // Read triangle region if (attributes > 0 && validRegion) { int region = 0; validRegion = int.TryParse(line[4], out region); tri.label = region; } triangles.Add(tri); } } // Read area file if (readArea) { string areafile = Path.ChangeExtension(elefilename, ".area"); if (File.Exists(areafile)) { ReadAreaFile(areafile, intriangles); } } return triangles; }
/// <summary> /// Generates a structured mesh. /// </summary> /// <param name="bounds">Bounds of the mesh.</param> /// <param name="nx">Number of segments in x direction.</param> /// <param name="ny">Number of segments in y direction.</param> /// <returns>Mesh</returns> public static IMesh StructuredMesh(Rectangle bounds, int nx, int ny) { var polygon = new Polygon((nx + 1) * (ny + 1)); double x, y, dx, dy, left, bottom; dx = bounds.Width / nx; dy = bounds.Height / ny; left = bounds.Left; bottom = bounds.Bottom; int i, j, k, l, n = 0; // Add vertices. var points = new Vertex[(nx + 1) * (ny + 1)]; for (i = 0; i <= nx; i++) { x = left + i * dx; for (j = 0; j <= ny; j++) { y = bottom + j * dy; points[n++] = new Vertex(x, y); } } polygon.Points.AddRange(points); n = 0; // Set vertex hash and id. foreach (var v in points) { v.hash = v.id = n++; } // Add boundary segments. var segments = polygon.Segments; segments.Capacity = 2 * (nx + ny); Vertex a, b; for (j = 0; j < ny; j++) { // Left a = points[j]; b = points[j + 1]; segments.Add(new Segment(a, b, 1)); a.Label = b.Label = 1; // Right a = points[nx * (ny + 1) + j]; b = points[nx * (ny + 1) + (j + 1)]; segments.Add(new Segment(a, b, 1)); a.Label = b.Label = 1; } for (i = 0; i < nx; i++) { // Bottom a = points[(ny + 1) * i]; b = points[(ny + 1) * (i + 1)]; segments.Add(new Segment(a, b, 1)); a.Label = b.Label = 1; // Top a = points[ny + (ny + 1) * i]; b = points[ny + (ny + 1) * (i + 1)]; segments.Add(new Segment(a, b, 1)); a.Label = b.Label = 1; } // Add triangles. var triangles = new InputTriangle[2 * nx * ny]; n = 0; for (i = 0; i < nx; i++) { for (j = 0; j < ny; j++) { k = j + (ny + 1) * i; l = j + (ny + 1) * (i + 1); // Create 2 triangles in rectangle [k, l, l + 1, k + 1]. if ((i + j) % 2 == 0) { // Diagonal from bottom left to top right. triangles[n++] = new InputTriangle(k, l, l + 1); triangles[n++] = new InputTriangle(k, l + 1, k + 1); } else { // Diagonal from top left to bottom right. triangles[n++] = new InputTriangle(k, l, k + 1); triangles[n++] = new InputTriangle(l, l + 1, k + 1); } } } return Converter.ToMesh(polygon, triangles); }
/// <summary> /// Read the elements from an .ele file. /// </summary> /// <param name="elefilename"></param> /// <param name="data"></param> /// <param name="readArea"></param> private static List <ITriangle> ReadEleFile(string elefilename, bool readArea) { int intriangles = 0, attributes = 0; List <ITriangle> triangles; using (StreamReader reader = new StreamReader(elefilename)) { // Read number of elements and number of attributes. string[] line; bool validRegion = false; if (!TryReadLine(reader, out line)) { throw new Exception("Can't read input file (elements)."); } intriangles = int.Parse(line[0]); // We irgnore index 1 (number of nodes per triangle) attributes = 0; if (line.Length > 2) { attributes = int.Parse(line[2]); validRegion = true; } if (attributes > 1) { SimpleLog.Instance.Warning("Triangle attributes not supported.", "FileReader.Read"); } triangles = new List <ITriangle>(intriangles); InputTriangle tri; // Read triangles. for (int i = 0; i < intriangles; i++) { if (!TryReadLine(reader, out line)) { throw new Exception("Can't read input file (elements)."); } if (line.Length < 4) { throw new Exception("Triangle has no nodes."); } // TODO: startIndex ok? tri = new InputTriangle( int.Parse(line[1]) - startIndex, int.Parse(line[2]) - startIndex, int.Parse(line[3]) - startIndex); // Read triangle region if (attributes > 0 && validRegion) { int region = 0; validRegion = int.TryParse(line[4], out region); tri.region = region; } triangles.Add(tri); } } // Read area file if (readArea) { string areafile = Path.ChangeExtension(elefilename, ".area"); if (File.Exists(areafile)) { ReadAreaFile(areafile, intriangles); } } return(triangles); }