/// <summary> /// Returns the position of the nearest vertex. /// </summary> /// <returns> /// Position of the nearest vertex. /// </returns> /// /// <param name="grid"> /// The rectangular grid instance. /// </param> /// <param name="point"> /// Point in world space. /// </param> /// <param name="system"> /// Coordinate system to use. /// </param> /// /// <remarks> /// Returns the position of the nearest vertex from a given point in /// either grid- or world space. /// </remarks> public static Vector3 NearestVertex(this SphereGrid grid, Vector3 point, CoordinateSystem system) { var gridVertex = RoundPoint(grid.WorldToGrid(point)); if (system == CoordinateSystem.Grid) { return(gridVertex); } return(system == CoordinateSystem.World ? grid.GridToWorld(gridVertex) : grid.GridToSpheric(gridVertex)); }
/// <summary> /// Returns the grid position of the nearest box. /// </summary> /// <returns> /// Grid position of the nearest box. /// </returns> /// <param name="grid"> /// The rectangular grid instance. /// </param> /// <param name="point"> /// Point in world space. /// </param> /// <param name="system"> /// Coordinate system to use. /// </param> /// <remarks> /// <para> /// returns the coordinates of a cell in the grid. Since cell lies /// between vertices all three values will always have +0.5 /// compared to vertex coordinates. /// </para> /// </remarks> /// <example> /// <code> /// GFRectGrid myGrid; /// Vector3 worldPoint; /// // something like (2.5, -1.5, 3.5) /// Vector3 box = myGrid.NearestBoxG(worldPoint); /// </code> /// </example> public static Vector3 NearestCell(this SphereGrid grid, Vector3 point, CoordinateSystem system) { var gridCell = RoundPoint(grid.WorldToGrid(point) - 0.5f * Vector3.one) + 0.5f * Vector3.one; if (system == CoordinateSystem.Grid) { return(gridCell); } return(system == CoordinateSystem.World ? grid.GridToWorld(gridCell) : grid.GridToSpheric(gridCell)); }