You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:56:03