0

这两个测试的唯一区别是两个内部矩形的宽度分别为 84.55808f 和 84.5f。

然而 contains 最终为假,而 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);
4

2 回答 2

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(注意:额外的 0.00001)。

我已将此作为错误提交:https ://bugzilla.xamarin.com/show_bug.cgi?id=15518

于 2013-10-19T21:21:38.223 回答
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);
}

我不想在星期六晚上检查数学...

于 2013-10-19T19:16:38.057 回答