Ejemplo n.º 1
0
        /// <summary>
        /// Projects the point to the specific line segment
        /// </summary>
        /// <param name="toProject">The point to be projected</param>
        /// <param name="projectTo">The segment, point will be projected to</param>
        /// <returns>the orthogonaly projected point that lies on the specific line segment</returns>
        /// <remarks>This function uses the sphere Earth approximation</remarks>
        public static IPointGeo ProjectPointSphere(IPointGeo toProject, Segment <IPointGeo> projectTo)
        {
            Vector3 a = new Vector3(projectTo.StartPoint);
            Vector3 b = new Vector3(projectTo.EndPoint);
            Vector3 c = new Vector3(toProject);

            Vector3 greatCircleN  = Vector3.CrossProduct(a, b);
            Vector3 greatCircleCN = Vector3.CrossProduct(c, greatCircleN);
            Vector3 projected     = Vector3.CrossProduct(greatCircleN, greatCircleCN);

            projected.Normalize();

            PointGeo result = projected.ToSpherical();

            double apDistance = Calculations.GetDistance2D(projectTo.StartPoint, result);
            double bpDistance = Calculations.GetDistance2D(projectTo.EndPoint, result);

            if (apDistance + bpDistance - Calculations.GetLength(projectTo) < 0.01)
            {
                return(result);
            }
            else
            {
                return((Calculations.GetDistance2D(projectTo.StartPoint, toProject) < Calculations.GetDistance2D(projectTo.EndPoint, toProject)) ? projectTo.StartPoint : projectTo.EndPoint);
            }
        }
Ejemplo n.º 2
0
            public PointGeo ToSpherical()
            {
                PointGeo result = new PointGeo();

                result.Latitude  = Calculations.ToDegrees(Math.PI / 2 - Math.Acos(Z));
                result.Longitude = Calculations.ToDegrees(Math.Atan2(Y, X));
                return(result);
            }
Ejemplo n.º 3
0
 void Start()
 {
     //ReadCSVFile();
     csvData = csvReader.GetComponent <ReadCSV>();
     num     = csvData.pointNum;
     for (int i = 0; i < num; i++)
     {
         PointGeo p1 = new PointGeo(csvData.pointClouds[0][i], 0);
         p1.render();
         pp.Add(p1);
     }
     InitMeans(pp, k, means);
     InitpreMeans(pp, k, premeans);
 }