实例介绍
【实例截图】
【核心代码】
/// <summary>
/// 判断矩形是否包含了线段上的任何点
/// </summary>
public static bool RectContainsPointOnLine(Rectangle rect, Point linePt1, Point linePt2)
{
if (rect.Contains(linePt1) || rect.Contains(linePt2))
return true;
Point rectPt1 = rect.Location;
Point rectPt2 = new Point(rect.Left rect.Width, rect.Top);
Point rectPt3 = new Point(rect.Left rect.Width, rect.Top rect.Height);
Point rectPt4 = new Point(rect.Left, rect.Top rect.Height);
return TwoLinesIntersect(linePt1, linePt2, rectPt1, rectPt2) ||
TwoLinesIntersect(linePt1, linePt2, rectPt2, rectPt3) ||
TwoLinesIntersect(linePt1, linePt2, rectPt3, rectPt4) ||
TwoLinesIntersect(linePt1, linePt2, rectPt1, rectPt4);
}
/// <summary>
/// 判断两条线段是否相交
/// </summary>
public static bool TwoLinesIntersect(Point pt11, Point pt12, Point pt21, Point pt22)
{
LineInfo info1 = GetLineInfo(pt11, pt12);
LineInfo info2 = GetLineInfo(pt21, pt22);
int pt1MinX = Math.Min(pt11.X, pt12.X);
int pt1MaxX = Math.Max(pt11.X, pt12.X);
int pt1MinY = Math.Min(pt11.Y, pt12.Y);
int pt1MaxY = Math.Max(pt11.Y, pt12.Y);
int pt2MinX = Math.Min(pt21.X, pt22.X);
int pt2MaxX = Math.Max(pt21.X, pt22.X);
int pt2MinY = Math.Min(pt21.Y, pt22.Y);
int pt2MaxY = Math.Max(pt21.Y, pt22.Y);
float x, y;
if (info1.type == LineType.Vertical && info2.type == LineType.Vertical)
{
if (info1.x == info2.x)
{
// 重合的平行线,有可能相交的
return (pt11.Y >= pt2MinY && pt11.Y <= pt2MaxY) || (pt12.Y >= pt2MinY && pt12.Y <= pt2MaxY)
|| (pt21.Y >= pt1MinY && pt21.Y <= pt1MaxY);
}
}
else if (info1.type == LineType.Horizontal && info2.type == LineType.Horizontal)
{
if (info1.y == info2.y)
{
return (pt11.X >= pt2MinX && pt11.X <= pt2MaxX) || (pt12.X >= pt2MinX && pt12.X <= pt2MaxX)
|| (pt21.X >= pt1MinX && pt21.X <= pt1MaxX);
}
}
else if (info1.type == LineType.Normal && info2.type == LineType.Normal)
{
if (Math.Abs(info1.a - info2.a) < 0.001f)
{
// 如果平行且重合
if (info1.b == info2.b)
{
return (pt11.X >= pt2MinX && pt11.X <= pt2MaxX)
|| (pt12.X >= pt2MinX && pt12.X <= pt2MaxX)
|| (pt21.X >= pt1MinX && pt21.X <= pt1MaxX);
}
}
else
{
x = (info2.b - info1.b) / (info1.a - info2.a);
y = info1.a * x info1.b;
return (y >= pt1MinY && y <= pt1MaxY) && (y >= pt2MinY && y <= pt2MaxY);
}
}
else if (info1.type == LineType.Horizontal && info2.type == LineType.Vertical)
{
return (info2.x >= pt1MinX && info2.x <= pt1MaxX && info1.y >= pt2MinY && info1.y <= pt2MaxY);
}
else if (info1.type == LineType.Vertical && info2.type == LineType.Horizontal)
{
return (info1.x >= pt2MinX && info1.x <= pt2MaxX && info2.y >= pt1MinY && info2.y <= pt1MaxY);
}
else if (info1.type == LineType.Horizontal && info2.type == LineType.Normal)
{
y = info1.y;
x = (y - info2.b) / info2.a;
return (x >= pt1MinX && x <= pt1MaxX) && (x >= pt2MinX && x <= pt2MaxX);
}
else if (info1.type == LineType.Normal && info2.type == LineType.Horizontal)
{
y = info2.y;
x = (y - info1.b) / info1.a;
return (x >= pt1MinX && x <= pt1MaxX) && (x >= pt2MinX && x <= pt2MaxX);
}
else if (info1.type == LineType.Vertical && info2.type == LineType.Normal)
{
x = info1.x;
y = info2.a * x info2.b;
return (y >= pt1MinY && y <= pt1MaxY) && (y >= pt2MinY && y <= pt2MaxY);
}
else if (info1.type == LineType.Normal && info2.type == LineType.Vertical)
{
x = info2.x;
y = info1.a * x info1.b;
return (y >= pt1MinY && y <= pt1MaxY) && (y >= pt2MinY && y <= pt2MaxY);
}
return false;
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论