Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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));
        }
Пример #5
0
        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);
            }
        }
Пример #6
0
        /*
         * 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);
            }
        }