Delphi FMX TPathData重叠矢量填充问题:十字中心空白如何解决?
解决TPathData绘制叠加矩形时中心区域空白的问题
你当前的代码中,两个矩形路径均为顺时针闭合路径,填充时默认采用非零环绕数填充规则,叠加区域的路径环绕数相互抵消(顺时针+顺时针,环绕数为0),导致中心区域无法被填充。
针对由多个叠加矩形构成的复杂图形,最可靠的方式是使用TPathData.Combine方法将多个矩形路径合并为一个联合区域(Union),生成的路径会自动处理叠加部分,确保所有区域都能被正确填充。
修改后的代码如下:
procedure TForm3.Button1Click(Sender: TObject); var PD, PD1, PD2: TPathData; aRect1, aRect2: TRectF; begin aRect1 := RectF(45,10,55,90); aRect2 := RectF(10,45,90,55); // 创建两个独立的矩形路径 PD1 := TPathData.Create; try PD1.AddRectangle(aRect1); // 用AddRectangle替代手动绘制,简洁不易出错 PD2 := TPathData.Create; try PD2.AddRectangle(aRect2); // 合并路径为联合区域,自动处理叠加部分 PD := TPathData.Combine(PD1, PD2, TPathCombineMode.Union); try ImageControl1.Bitmap.SetSize(Round(ImageControl1.BoundsRect.Width), Round(ImageControl1.BoundsRect.Height)); if ImageControl1.Bitmap.Canvas.BeginScene then try with ImageControl1.Bitmap.Canvas do begin Clear(0); Fill.Kind := TBrushKind.Solid; Fill.Color := TAlphaColorRec.Black; Stroke.Thickness := 1; DrawPath(PD, 1); FillPath(PD, 1); end; finally ImageControl1.Bitmap.Canvas.EndScene; end; finally PD.Free; end; finally PD2.Free; end; finally PD1.Free; end; end;
补充说明:
AddRectangle方法比手动绘制路径更高效,且能保证路径方向的一致性。TPathCombineMode.Union模式会将多个路径合并为包含所有区域的单一路径,完美解决叠加区域的填充空白问题。- 该方案适用于任意数量的叠加矩形,即使场景更复杂,也能生成可直接用于打印的标准TPathData对象。
内容的提问来源于stack exchange,提问作者PABEIER
相关产品推荐
相关产品推荐

