private Tile TileAt(Ray ray, List <Tile> list, Vector3 position) { for (int i = 0; i < list.Count; i++) { var tile = list[i]; Vector3 worldA = root.TransformPoint(tile.a); Vector3 worldB = root.TransformPoint(tile.b); Vector3 worldC = root.TransformPoint(tile.c); Plane plane = new Plane(worldA, worldB, worldC); float distance; if (plane.Raycast(ray, out distance)) { Vector3 point = ray.GetPoint(distance); if (GeometryMath.PointInTriangle(worldA, worldB, worldC, point)) { if (tile.children.Count > 0) { var t = TileAt(ray, tile.children, position); if (t != null) { return(t); } } else { return(tile); } } } } return(null); }
/// <summary> /// /// </summary> /// <param name="worldPosition"></param> /// <returns></returns> public bool Contains(Vector3 worldPosition) { Vector3 worldA = grid.root.TransformPoint(a); Vector3 worldB = grid.root.TransformPoint(b); Vector3 worldC = grid.root.TransformPoint(c); return(GeometryMath.PointInTriangle(worldA, worldB, worldC, worldPosition)); }
public bool Contains(Vector2 point) { if (GeometryMath.PointInTriangle(a, b, c, point) || GeometryMath.PointInTriangle(a, c, d, point) || GeometryMath.PointInSegment(a, c, point) || GeometryMath.PointInSegment(b, d, point)) { return(true); } return(false); }