c# – 检查Canvas XAML中的矩形是否相交
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 检查Canvas XAML中的矩形是否相交,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2014字,纯文字阅读大概需要3分钟。
内容图文
我有一个画布,我画了不同的矩形.我在集合中有矩形坐标.每次将一个矩形添加到画布时,我需要检查它是否超过其他现有矩形.
我检查画布中每个现有矩形的新矩形,以了解矩形是否与任何其他矩形重叠.
这是最有效的解决方案吗?
foreach(System.Windows.Shapes.Rectangle r in rectCollection)
{
IntersectionDetail d1 = r.RenderedGeometry.FillContainsWithDetail(this.rect.RenderedGeometry);
if(d1 == IntersectionDetail.Intersects)
{
MessageBox.Show("New Rectangle intersects with existing rectangle");
}
}
解决方法:
要检查矩形是否与其他矩形相交,在最坏的情况下,您需要做的最小交互次数至少要经历一次;你无法避免这一事实.这意味着在最坏的情况下,你不能低于O(n)的复杂度.
这种复杂性可以通过单个循环实现,也可以简单地使用LINQ方法.Any(),只要有交集就会停止(所以我们可以得到O(1)的最佳情况) .
在这里,最糟糕的情况是“没有交叉点”,因为您需要检查下一个矩形以查看该矩形是否会发生碰撞.最好的情况是第一次检查时的命中.
假设您的集合称为坐标,而您正在检查newRect的Rect,检查将变为:
if (coordinates.Any(c => c.IntersectsWith(newRect)))
{
//There is overlapping
}
在上次更新时,很明显你没有集合中的“矩形坐标”,而是来自Windows.Shapes的矩形,这根本不是同一个东西. Rectangle仅包含有关其宽度和高度的信息,而不包含其自身的位置.
您需要在循环之前将它们转换为Rect,方法是使用它们在画布上的位置及其尺寸:
IEnumerable<Rect> coordinates = rectCollection.Select(r => new Rect(Canvas.GetLeft(r), Canvas.GetTop(r), r.Width, r.Height));
要排除两边,你可以卷起你自己的扩展方法(作为个人喜好,我更喜欢保持我的ifs和lamdas清洁):
public static class Extensions
{
public static bool InteriorIntersectsWith(this Rect rect, Rect other)
{
return rect.IntersectsWith(other) && IsIntersectingInside(rect, other);
}
private static bool IsIntersectingInside(Rect rect, Rect other)
{
Rect intersectionArea = Rect.Intersect(rect, other);
return intersectionArea.Width > 0 && intersectionArea.Height > 0;
}
}
然而,逻辑与你的有点不同,所以如果它有效,请随意使用你想要的那个.基本上我使用的事实是,如果只有边界接触,交叉区域将只有一个维度.
所以检查会改为
if (coordinates.Any(c => c.InteriorIntersectsWith(newRect)))
{
//There is overlapping
}
内容总结
以上是互联网集市为您收集整理的c# – 检查Canvas XAML中的矩形是否相交全部内容,希望文章能够帮你解决c# – 检查Canvas XAML中的矩形是否相交所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。