gpt4 book ai didi

delphi - TRect.Intersect 和 TRect.IntersectsWith 不一致

转载 作者:行者123 更新时间:2023-12-03 14:44:04 25 4
gpt4 key购买 nike

我希望我在某种程度上感到困惑。我遇到一些与 TRect.IntersectTRect.IntersectsWith 不一致的行为。这是一些演示该问题的代码。

program RectCheck;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils,
System.Types,
Vcl.Dialogs;

var
rect1: TRect;
rect2: TRect;
combinedRect: TRect;
begin
Rect1 := Rect(0,0,200,101);
Rect2 := Rect(0,100,200,200);
if Rect1.IntersectsWith(Rect2) then
begin
// We have interesected, get the combined rect
combinedRect := TRect.Intersect(Rect1, Rect2);
if not combinedRect.IsEmpty then
ShowMessage(Format('Our new rect (%d, %d), (%d, %d)',
[combinedRect.Left, combinedRect.Top, combinedRect.Right, combinedRect.Bottom]))
else
raise Exception.Create('They were supposed to intersect!');
end;

Rect1 := Rect(0,0,200,100);
Rect2 := Rect(0,100,200,200);
if Rect1.IntersectsWith(Rect2) then
begin
// We have interesected, get the combined rect
combinedRect := TRect.Intersect(Rect1, Rect2);

if not combinedRect.IsEmpty then
ShowMessage(Format('Our new rect (%d, %d), (%d, %d)',
[combinedRect.Left, combinedRect.Top, combinedRect.Right, combinedRect.Bottom]))
else
raise Exception.Create('They were supposed to intersect!');
end;
end.

引发第二个异常。 TRect.IntersectsWith 表示矩形相交,但是当我调用 TRect.Intersect 来获取新的相交矩形时,它会返回一个空矩形。

IntersectsWith 中的代码(写得不是很清楚)在第二种情况下返回 true,因为 Self.BottomRight.Y = R.TopLeft.Y (100)。

function TRect.IntersectsWith(const R: TRect): Boolean;
begin
Result := not ( (Self.BottomRight.X < R.TopLeft.X) or
(Self.BottomRight.Y < R.TopLeft.Y) or
(R.BottomRight.X < Self.TopLeft.X) or
(R.BottomRight.Y < Self.TopLeft.Y) );
end;

问题在于,由 Intersect 调用的 IsRectEmpty 检查矩形的顶部和底部或矩形的左侧和右侧是否具有相同的值值,当传递 Intersect 时,将结果设置为空矩形。

function IsRectEmpty(const Rect: TRect): Boolean;
begin
Result := (Rect.Right <= Rect.Left) or (Rect.Bottom <= Rect.Top);
end;

这是预期的行为吗?如果不是,应该更改什么。我的理解是,TRect 不包括底部和右侧的“边缘”,如果是这种情况,TRect.IntersectsWith 不应该看起来像这样吗?

function TRect.IntersectsWith(const R: TRect): Boolean;
begin
Result := not ( (Self.BottomRight.X <= R.TopLeft.X) or
(Self.BottomRight.Y <= R.TopLeft.Y) or
(R.BottomRight.X <= Self.TopLeft.X) or
(R.BottomRight.Y <= Self.TopLeft.Y) );
end;

最佳答案

这是一个错误;这不是预期的行为。在当前实现中,RTL 认为两个空矩形可以相交(例如 (0,0,0,0)(0,0,0,0) 或一个非空矩形与空矩形),这没有任何意义。

Assert(Rect(0, 0, 0, 0).IntersectsWith(Rect(0, 0, 0, 0)));

上述断言不会失败。

此外,它不按照 Windows API 工作。以下断言失败:winapi 认为 (0,0,200,100)(0,100,200,200) 不相交。

Assert(winapi.windows.IntersectRect(OutRect, Rect(0,0,200,100), Rect(0,100,200,200)));

返回 bool 值的 System.Types.IntersectRect() 重载同样被破坏。

关于delphi - TRect.Intersect 和 TRect.IntersectsWith 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com