您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
77 行
1.2 KiB
77 行
1.2 KiB
using System;
|
|
using UnityEngine;
|
|
|
|
namespace RMGUI.GraphView
|
|
{
|
|
internal class RectUtils
|
|
{
|
|
public static bool IntersectsSegment(Rect rect, Vector2 p1, Vector2 p2)
|
|
{
|
|
float minX = Mathf.Min(p1.x, p2.x);
|
|
float maxX = Mathf.Max(p1.x, p2.x);
|
|
|
|
if (maxX > rect.xMax)
|
|
{
|
|
maxX = rect.xMax;
|
|
}
|
|
|
|
if (minX < rect.xMin)
|
|
{
|
|
minX = rect.xMin;
|
|
}
|
|
|
|
if (minX > maxX)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
float minY = Mathf.Min(p1.y, p2.y);
|
|
float maxY = Mathf.Max(p1.y, p2.y);
|
|
|
|
float dx = p2.x - p1.x;
|
|
|
|
if (Mathf.Abs(dx) > float.Epsilon)
|
|
{
|
|
float a = (p2.y - p1.y) / dx;
|
|
float b = p1.y - a * p1.x;
|
|
minY = a * minX + b;
|
|
maxY = a * maxX + b;
|
|
}
|
|
|
|
if (minY > maxY)
|
|
{
|
|
float tmp = maxY;
|
|
maxY = minY;
|
|
minY = tmp;
|
|
}
|
|
|
|
if (maxY > rect.yMax)
|
|
{
|
|
maxY = rect.yMax;
|
|
}
|
|
|
|
if (minY < rect.yMin)
|
|
{
|
|
minY = rect.yMin;
|
|
}
|
|
|
|
if (minY > maxY)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public static Rect Encompass(Rect a, Rect b)
|
|
{
|
|
return new Rect
|
|
{
|
|
xMin = Math.Min(a.xMin, b.xMin),
|
|
yMin = Math.Min(a.yMin, b.yMin),
|
|
xMax = Math.Max(a.xMax, b.xMax),
|
|
yMax = Math.Max(a.yMax, b.yMax)
|
|
};
|
|
}
|
|
}
|
|
}
|