示例#1
0
    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);
    }
示例#2
0
    /// <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));
    }
示例#3
0
    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);
    }