如何将自定义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
相关产品推荐
相关产品推荐

