Esempio n. 1
0
    private void DrawPointGizmos()
    {
        if (fan.Length <= 0f)
        {
            return;
        }
        var col = color;

        if (pointObj != null && fan.ContainPoint(pointObj.point))
        {
            col = Color.red;
        }
        else if (rectObj != null && fan.IntersectWith(rectObj.rect))
        {
            col = Color.red;
        }
        else if (circleObj != null && fan.IntersectWith(circleObj.circle))
        {
            col = Color.red;
        }



        GizmosUtil.DrawFan(fan, col, mesh);
    }
    private void OnDrawGizmos()
    {
        bool isRectInersctWithCircle  = m_circle.IntersectWith(m_rect);
        bool isFanIntersectWithCircle = m_fan.IntersectWith(m_circle);
        bool isFanIntersectWithRect   = m_fan.IntersectWith(m_rect);


        Color rectColor;

        if (isRectInersctWithCircle)
        {
            rectColor = m_intersectCol;
        }
        else
        {
            rectColor = m_colors[0];
        }
        GizmosUtils.DrawRectSolid(m_rect, rectColor);
        GizmosUtils.DrawRect(m_rect.Extand(m_circle.m_radius, m_circle.m_radius), rectColor);

        Color circleColor;

        if (isRectInersctWithCircle || isFanIntersectWithCircle)
        {
            circleColor = m_intersectCol;
        }
        else
        {
            circleColor = m_colors[1];
        }
        GizmosUtils.DrawCircle(m_circle, circleColor);


        Color fanColor;

        if (isFanIntersectWithCircle || isFanIntersectWithRect)
        {
            fanColor = m_intersectCol;
        }
        else
        {
            fanColor = m_colors[2];
        }
        GizmosUtils.DrawFan(m_fan, fanColor);


        if (m_circle.ContainPoint(m_point) || m_rect.ContainPoint(m_point) || m_fan.ContainPoint(m_point))
        {
            Gizmos.color = m_intersectCol;
        }
        else
        {
            Gizmos.color = m_colors[3];
        }
        GizmosUtils.DrawPoint(m_point);
    }
Esempio n. 3
0
    public static bool IntersectWith(Fan _fan, Rectangle _rect)
    {
        //条件一:矩形四个角落的判断
        var coners = _rect.Coners;

        for (int i = 0; i < 4; i++)
        {
            if (_fan.ContainPoint(coners[i]))
            {
                return(true);
            }
        }
        //条件二:扇形的两个边点落在矩形内
        if (_rect.ContainPoint(_fan.Left))
        {
            return(true);
        }
        if (_rect.ContainPoint(_fan.Right))
        {
            return(true);
        }
        //条件三:彼此中心点
        if (_rect.ContainPoint(_fan.m_center))
        {
            return(true);
        }
        if (_fan.ContainPoint(_rect.m_center))
        {
            return(true);
        }

        //条件四,矩形的边和弧相交
        var begin = _fan.m_center;
        var end   = _rect.m_center;
        var v     = end - begin;
        //圆的方程(x - xc)^2 + ( y - yc ) ^ 2 = r^2
        //线段的方程
        // x = v.x * t + begin.x
        // y = v.y * t + begin.y

        //求扇形圆心和矩形的中心线段


        //把线段方程代入可以得到一个二次方程
        //把它化为形如 a * x^2 + 2 * b * x + c = 0

        //如果 x 有解,说明相交,无解
        //b^2 - a *c >= 0,有解

        var dx    = _fan.m_center.x - begin.x;
        var dy    = _fan.m_center.y - begin.y;
        var sqr_r = _fan.Length * _fan.Length;

        var   a   = v.x * v.x + v.y * v.y;
        var   b   = -(dx * v.x + dy * v.y);
        var   c   = dx * dx + dy * dy - sqr_r;
        var   d   = b * b - a * c;
        Color old = Gizmos.color;

        Gizmos.color = Color.white;
        Gizmos.DrawLine(begin.ToXZ(), end.ToXZ());
        Gizmos.color = old;
        if (d >= 0) // 有解
        {
            var t = (-b + Mathf.Sqrt(d)) / a;

            var x     = v.x * t + begin.x;
            var y     = v.y * t + begin.y;
            var point = new Vector2(x, y);
            GizmosUtils.DrawPoint(point);
            //扇形只会包含其中一个解
            var left  = _fan.Left;
            var right = _fan.Right;


            if (_rect.ContainPoint(point) && point.Between(_fan.m_center, left, right))
            {
                return(true);
            }

            //另一个方向
            t     = (-b + Mathf.Sqrt(d)) / a;
            x     = v.x * t + begin.x;
            y     = v.y * t + begin.y;
            point = new Vector2(x, y);
            GizmosUtils.DrawPoint(point);

            if (_rect.ContainPoint(point) && point.Between(_fan.m_center, left, right))
            {
                return(true);
            }
        }
        else
        {
            //无解,说明要么扇形包含矩形中心,要么矩形包含扇形圆心,否则就不相交
        }

        return(false);
    }