/// <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); } }
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); }
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); }