- /*
- 功能:判断线段和矩形是否相交
- 先判断线段的俩个端点是否在矩形的内部,在就必然相交
- 其次判断线段的包围盒是否和矩形相交,不相交的话线段和矩形肯定也不相交
- 最后判断,矩形的四个顶点是否位于线段的两侧,是则必然相交,否则就不相交
- */
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ConsoleApplication1
- {
- class LineConverttoRectangleClass
- {
- public class Point
- {
- public Point(float xx,float yy)
- {
- x = xx;
- y = yy;
- }
- public float x,y;
- }
- public class Line
- {
- public Line(Point pp1, Point pp2)
- {
- p1 = pp1;
- p2 = pp2;
- }
- public Point p1;
- public Point p2;
- }
- public class Rectangle
- {
- public Rectangle(Point pp1, Point pp2)
- {
- p1 = pp1;
- p2 = pp2;
- }
- public Point p1;
- public Point p2;
- public float MinX { get { return p1.x < p2.x ? p1.x : p2.x; } }
- public float MaxX { get { return p1.x > p2.x ? p1.x : p2.x; } }
- public float MinY { get { return p1.y < p2.y ? p1.y : p2.y; } }
- public float MaxY { get { return p1.y > p2.y ? p1.y : p2.y; } }
- };
- public static bool PointInsideRectangle(Point point,Rectangle rect)
- {
- if (point.x >= rect.MinX && point.x <= rect.MaxX)
- if (point.y >= rect.MinY && point.y <= rect.MaxY)
- return true;
- return false;
- }
- // -1 点位于线段的左侧,0 点位于线段上面 ,1 点位于线段右侧
- public static int PointAtLineLeftRight(Point point,Line line)
- {
- Point vect1 = new Point((line.p1.x - point.x),(line.p1.y - point.y));
- Point vect2 = new Point((line.p2.x - point.x), (line.p2.y - point.y));
- float nRet = vect1.x * vect2.y - vect1.y * vect2.x;
- if (nRet == 0)
- return 0;
- else if (nRet > 0)
- return 1;
- else if (nRet < 0)
- return -1;
- return 0;
- }
- public static bool IsTwoLineIntersect(Line line1,Line line2)
- {
- int a = PointAtLineLeftRight(line1.p1,line2);
- int b = PointAtLineLeftRight(line1.p2,line2);
- if (a * b > 0)
- return false;
- a = PointAtLineLeftRight(line2.p1, line1);
- b = PointAtLineLeftRight(line2.p2, line1);
- if (a * b > 0)
- return false;
- return true;
- }
- public static bool IsLineIntersectRect(Line line,Rectangle rect)
- {
- if (PointInsideRectangle(line.p1, rect)
- || PointInsideRectangle(line.p2, rect))
- return true;
- if (PointInsideRectangle(new Point(line.p1.x, line.p2.y), rect)
- || PointInsideRectangle(new Point(line.p2.x, line.p1.y), rect))
- return true;
- if (IsTwoLineIntersect(line, new Line(rect.p1, new Point(rect.p1.x, rect.p2.y))))
- return true;
- if (IsTwoLineIntersect(line, new Line(rect.p1, new Point(rect.p2.x, rect.p1.y))))
- return true;
- if (IsTwoLineIntersect(line, new Line(rect.p2, new Point(rect.p1.x, rect.p2.y))))
- return true;
- if (IsTwoLineIntersect(line, new Line(rect.p2, new Point(rect.p2.x, rect.p1.y))))
- return true;
- return false;
- }
- public static bool LineConverttoRectangle(Line line,Rectangle rect)
- {
- if (PointInsideRectangle(line.p1, rect)
- || PointInsideRectangle(line.p2, rect))
- return true;
- if (!IsLineIntersectRect(line,rect))
- return false;
- int b1 = PointAtLineLeftRight(rect.p1,line);
- int b2 = PointAtLineLeftRight(rect.p2, line);
- int b3 = PointAtLineLeftRight(new Point(rect.p1.x, rect.p2.y), line);
- int b4 = PointAtLineLeftRight(new Point(rect.p2.x, rect.p1.y), line);
- if (b1 + b2 + b3 + b4 == 4)
- return false;
- if (b1 + b2 + b3 + b4 == -4)
- return false;
- return true;
- }
- public static void Main()
- {
- Console.WriteLine(LineConverttoRectangle(new Line(new Point(5.0f, 1.8f),
- new Point(5.0f, -15f)), new Rectangle(new Point(4.7f, -0.7f), new Point(6.7f, 1.4f))));
- }
- }
- }
- <pre name="code" class="csharp"> public bool RectCrossRect(Rect r1, Rect r2, ref Vector2 start, ref Vector2 end)
- {
- float x, y, z, w; ;
- x = Mathf.Max(r1.xMin, r2.xMin);
- y = Mathf.Max(r1.yMin, r2.yMin);
- w = Mathf.Min(r1.xMax, r2.xMax);
- z = Mathf.Min(r1.yMax, r2.yMax);
- if (x >= w || y >= z)
- return false;
- start = new Vector2(x, y);
- end = new Vector2(w, z);
- return true;
- }</pre><br>
- <br>
- <pre></pre>
- <p><br>
- </p>
- <br>