Xamarin RectangleF.Contains行为不正确

时间:2013-10-19 12:05:55

标签: c# xamarin.ios system.drawing

这两个测试的唯一区别是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);

2 个答案:

答案 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);
}

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