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

如何将自定义TFPolygon数组快速转换为System.Math.Vectors.TPolygon数组?

自定义TFPolygon转System.Math.Vectors.TPolygon的高效方案

核心思路

由于自定义的FPoint和系统TPointF的内存布局完全一致(均包含X、Y两个浮点类型字段),可以直接通过内存批量复制实现转换,这比循环逐个赋值更高效,代码也更简洁。

高效实现代码

安全内存复制版(推荐)

这种方式会创建独立的新数组,避免原数组生命周期影响转换后的结果:

function ConvertTFPolygonToTPolygon(const APolygon: TFPolygon): TPolygon;
begin
  SetLength(Result, Length(APolygon));
  if Length(APolygon) > 0 then
    // 直接批量复制内存,无循环开销
    Move(APolygon[0], Result[0], Length(APolygon) * SizeOf(FPoint));
end;

极简强制转换版(需注意内存管理)

如果使用较新版本的Delphi,可直接通过类型强制转换实现零拷贝,但要确保原数组在转换后的TPolygon使用期间保持有效:

var
  SourcePoly: TFPolygon;
  TargetPoly: TPolygon;
begin
  // 假设SourcePoly已完成初始化
  TargetPoly := TPolygon(PByte(SourcePoly));
end;

补充说明

如果后续需要将TPolygon转换为VCL绘制用的整数点数组(array of TPoint),由于涉及浮点到整数的数值转换(需对X、Y取整),此时必须通过循环逐个处理,无法用内存复制方式优化,示例代码如下:

function ConvertTPolygonToVCLPointArray(const APolygon: TPolygon): array of TPoint;
var
  I: Integer;
begin
  SetLength(Result, Length(APolygon));
  for I := 0 to High(APolygon) do
  begin
    Result[I].X := Round(APolygon[I].X);
    Result[I].Y := Round(APolygon[I].Y);
  end;
end;

内容的提问来源于stack exchange,提问作者Franz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:37:41