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