public SphericalTriangle GetTriangle(int index) { SphericalTriangle triangle = baseTriangle; for (int i = 0; i < generation; i++) { int subIndex = index & 3; triangle = triangle.Bisect()[subIndex]; index >>= 2; } return(triangle); }
public SphericalTriangle GetSubTriangle(int index, int generations) { SphericalTriangle triangle = this; for (int i = 0; i < generations; i++) { int subIndex = index & 3; triangle = triangle.Bisect()[subIndex]; index >>= 2; } return(triangle); }
public SphericalTriangle[] Bisect() { Vector3D ab = ((A + B) / 2).UnitVector; Vector3D bc = ((B + C) / 2).UnitVector; Vector3D ca = ((C + A) / 2).UnitVector; SphericalTriangle[] result = new SphericalTriangle[4]; result[0] = new SphericalTriangle(A, ab, ca); result[1] = new SphericalTriangle(B, bc, ab); result[2] = new SphericalTriangle(C, ca, bc); result[3] = new SphericalTriangle(ab, bc, ca); return(result); }
public SphericalTriangle GetTriangle(int index) { int geodesicIndex = 0; int remainderIndex = index; int mask = 0; int masker = 3; for (int i = 0; i < geodesicGeneration; i++) { mask |= masker; masker *= 4; remainderIndex /= 4; } geodesicIndex = index & mask; GeodesicGridTriangle triangle = geodesic.GetGridIndex(geodesicIndex).GeodesicGridTriangle; SphericalTriangle sphericalTriangle = new SphericalTriangle(triangle.PointAB, triangle.PointBC, triangle.PointCA); return(sphericalTriangle.GetSubTriangle(remainderIndex, bisectGeneration - geodesicGeneration)); }
private void CompareHybridButton_Click(object sender, EventArgs e) { using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "*.csv|*.csv" }) { if (sfd.ShowDialog() != DialogResult.OK) { return; } List <string> result = new List <string>(); result.Add("projection point generation, bisect generation, area min, area max, area average, length min, length max, length average,"); int maxGeneration = Convert.ToInt32(GenerationBox.Text); for (int bisectGeneration = 1; bisectGeneration <= maxGeneration; bisectGeneration++) { for (int generation = 1; generation <= bisectGeneration; generation++) { HybridGrid hybridGrid = new HybridGrid(generation, bisectGeneration); double minArea = 10; double maxArea = 0; double totalArea = 0; double lengthMin = 10; double lengthMax = 0; double lengthTotal = 0; //foreach (SphericalTriangle triangle in bisectGeodesic.SphericalTriangles) for (int i = 0; i < hybridGrid.TriangleCount; i++) { SphericalTriangle triangle = hybridGrid.GetTriangle(i); double area = triangle.Area; if (area < minArea) { minArea = area; } if (area > maxArea) { maxArea = area; } totalArea += area; double ab = (triangle.A - triangle.B).Magnitude; double bc = (triangle.B - triangle.C).Magnitude; double ca = (triangle.C - triangle.A).Magnitude; double maxLength = ab > bc ? ab > ca ? ab : ca : bc > ca ? bc : ca; double minLength = ab < bc ? ab < ca ? ab : ca : bc < ca ? bc : ca; if (maxLength > lengthMax) { lengthMax = maxLength; } if (minLength < lengthMin) { lengthMin = minLength; } lengthTotal += ab + bc + ca; } double averageArea = totalArea / hybridGrid.TriangleCount; double averageLength = lengthTotal / hybridGrid.TriangleCount / 3; result.Add(generation.ToString() + "," + bisectGeneration.ToString() + "," + minArea.ToString() + "," + maxArea.ToString() + "," + averageArea.ToString() + "," + lengthMin.ToString() + "," + lengthMax.ToString() + "," + averageLength.ToString() + "," ); } } File.WriteAllLines(sfd.FileName, result); } }
/* * private void DownShiftBox_Click(object sender, EventArgs e) * { * ShiftBox.Text = (Convert.ToDouble(ShiftBox.Text) / 2).ToString(); * } * * private void UpShiftBox_Click(object sender, EventArgs e) * { * ShiftBox.Text = (Convert.ToDouble(ShiftBox.Text) * 2).ToString(); * } * * private void UpButton_Click(object sender, EventArgs e) * { * VarianceBox.Text = (Convert.ToDouble(VarianceBox.Text) + Convert.ToDouble(ShiftBox.Text)).ToString(); * } * * private void DownButton_Click(object sender, EventArgs e) * { * VarianceBox.Text = (Convert.ToDouble(VarianceBox.Text) - Convert.ToDouble(ShiftBox.Text)).ToString(); * }*/ /* * private void VarianceBox_TextChanged(object sender, EventArgs e) * { * try * { * Vector3D projectionPoint = Geodesic.DefaultProjectionPoint * new Equation(Convert.ToDouble(VarianceBox.Text),"Custom"); * Geodesic geodesic = new Geodesic(0, projectionPoint); * Equation variance = VarianceOf(geodesic); * VarianceLabel.Text = variance.ToString(); * } * catch * { * * } * }*/ /// <summary> /// Calculate the area variance for both bisect and new geodesic grid for each generation up to the given one. /// This is put in a csv file. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void VarianceButton_Click(object sender, EventArgs e) { using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "*.csv|*.csv" }) { if (sfd.ShowDialog() != DialogResult.OK) { return; } List <string> result = new List <string>(); result.Add("generation,bisect min,bisect max, bisect average, projection point min, projection point max, projection point average," + "bisect length min, bisect length max, bisect length average, projection length min, projection length max, projection length average"); int maxGeneration = Convert.ToInt32(GenerationBox.Text); for (int generation = 1; generation <= maxGeneration; generation++) { BisectGeodesicLowMemory bisectGeodesic = new BisectGeodesicLowMemory(generation); double min = 10; double max = 0; double total = 0; double lengthMin = 10; double lengthMax = 0; double lengthTotal = 0; //foreach (SphericalTriangle triangle in bisectGeodesic.SphericalTriangles) for (int i = 0; i < bisectGeodesic.TriangleCount; i++) { SphericalTriangle triangle = bisectGeodesic.GetTriangle(i); double area = triangle.Area; if (area < min) { min = area; } if (area > max) { max = area; } total += area; double ab = (triangle.A - triangle.B).Magnitude; double bc = (triangle.B - triangle.C).Magnitude; double ca = (triangle.C - triangle.A).Magnitude; double maxLength = ab > bc ? ab > ca ? ab : ca : bc > ca ? bc : ca; double minLength = ab < bc ? ab < ca ? ab : ca : bc < ca ? bc : ca; if (maxLength > lengthMax) { lengthMax = maxLength; } if (minLength < lengthMin) { lengthMin = minLength; } lengthTotal += ab + bc + ca; } double average = total / bisectGeodesic.TriangleCount; double averageLength = lengthTotal / bisectGeodesic.TriangleCount / 3; double bisectVariance = max / min; Geodesic geodesic = new Geodesic(generation - 2); Variance geodesicViariance = VarianceOf(geodesic); result.Add(generation.ToString() + "," + min.ToString() + "," + max.ToString() + "," + average.ToString() + "," + geodesicViariance.min.ToString() + "," + geodesicViariance.max.ToString() + "," + geodesicViariance.average.ToString() + "," + lengthMin.ToString() + "," + lengthMax.ToString() + "," + averageLength.ToString() + "," + geodesicViariance.lengthMin.ToString() + "," + geodesicViariance.lengthMax.ToString() + "," + geodesicViariance.lengthAverage.ToString() ); } File.WriteAllLines(sfd.FileName, result); } }