这两个测试的唯一区别是84.55808f与两个内部矩形宽度的84.5f。
然而,包含最终为假,而contains2最终为真。哇。
在Mac上使用Xamarin.iOS C#(Monotouch)环境和Xamarin IDE
有人可以验证吗?如果是这样,任何人都可以发现问题吗?
谢谢!
RectangleF r1 = new RectangleF (119.221f, -122.9433f, 646f, 646f);
RectangleF r2 = new RectangleF (238.4419f, 0f, 84.55808f, 77.11342f);
bool contains = r1.Contains (r2);
RectangleF r3 = new RectangleF (119.221f, -122.9433f, 646f, 646f);
RectangleF r4 = new RectangleF (238.4419f, 0f, 84.5f, 77.11342f);
bool contains2 = r3.Contains (r4);
答案 0 :(得分:3)
调用Intersect(r1,r2)
会返回{{X=238.4419,Y=0,Width=84.55807,Height=77.11342}}
。 Width
是!= 84.55808
,因此Contains
中的比较“交集矩形是否与rect
参数相同?”失败。
最终,这归结为323 - 238.4419
。如果你用纸笔做到这一点,你会得到84.5581
但是浮点数323f - 238.4419f
= 84.55811f
(N.B。:额外0.00001)。
我已将此提交为错误:https://bugzilla.xamarin.com/show_bug.cgi?id=15518
答案 1 :(得分:0)
这不是答案,但评论时间太长了。
我可以在Xamarin.iOS上确认这种行为。以下是Contains
的实施和其他有用的方法:
public bool Contains (RectangleF rect)
{
return rect == RectangleF.Intersect (this, rect);
}
public static RectangleF Intersect (RectangleF a, RectangleF b)
{
if (!a.IntersectsWithInclusive (b))
{
return RectangleF.Empty;
}
return RectangleF.FromLTRB (Math.Max (a.Left, b.Left), Math.Max (a.Top, b.Top), Math.Min (a.Right, b.Right), Math.Min (a.Bottom, b.Bottom));
}
private bool IntersectsWithInclusive (RectangleF r)
{
return this.Left <= r.Right && this.Right >= r.Left && this.Top <= r.Bottom && this.Bottom >= r.Top;
}
public static RectangleF FromLTRB (float left, float top, float right, float bottom)
{
return new RectangleF (left, top, right - left, bottom - top);
}
我不想在星期六晚上检查数学...