【发布时间】:2012-07-17 14:36:49
【问题描述】:
获取任意 Windows 区域面积的最快方法是什么?
我知道我可以枚举边界矩形的所有点并调用PtInRegion() 函数,但它似乎不是很快。也许你知道一些更快的方法?
【问题讨论】:
-
可能是
GetRegionData并使用点来计算多边形的面积
获取任意 Windows 区域面积的最快方法是什么?
我知道我可以枚举边界矩形的所有点并调用PtInRegion() 函数,但它似乎不是很快。也许你知道一些更快的方法?
【问题讨论】:
GetRegionData 并使用点来计算多边形的面积
当您调用GetRegionData 时,您将获得组成该区域的非重叠矩形列表。将它们的区域相加,如下所示:
function GetRegionArea(rgn: HRgn): Cardinal;
var
x: DWord;
Data: PRgnData;
Header: PRgnDataHeader;
Rects: PRect;
Width, Height: Integer;
i: Integer;
begin
x := GetRegionData(rgn, 0, nil);
Win32Check(x <> 0);
GetMem(Data, x);
try
x := GetRegionData(rgn, x, Data);
Win32Check(x <> 0);
Header := PRgnDataHeader(Data);
Assert(Header.iType = rdh_Rectangles);
Assert(Header.dwSize = SizeOf(Header^));
Rects := PRect(Cardinal(Header) + Header.dwSize);
// equivalent: Rects := PRect(@Data.Buffer);
Result := 0;
for i := 0 to Pred(Header.nCount) do begin
Width := Rects.Right - Rects.Left;
Height := Rects.Bottom - Rects.Top;
Inc(Result, Width * Height);
Inc(Rects);
end;
finally
FreeMem(Data);
end;
end;
【讨论】: