KLayout中DCplxTrans到ICplxTrans转换的精度问题解析

KLayout中DCplxTrans到ICplxTrans转换的精度问题解析

【免费下载链接】klayout KLayout Main Sources 【免费下载链接】klayout 项目地址: https://gitcode.com/gh_mirrors/kl/klayout

在KLayout布局编辑软件的Python脚本开发中,开发者经常会遇到不同坐标系统之间的转换需求。本文将深入分析一个在DCplxTrans(双精度复数变换)到ICplxTrans(整数复数变换)转换过程中出现的精度损失问题,并提供解决方案。

问题现象

当使用DCplxTrans的to_itrans方法进行坐标系统转换时,位移值(disp)会出现明显的精度损失。具体表现为位移值在转换前被四舍五入为整数,然后再转换为数据库单位(dbu)。这与DTrans到Trans的转换行为不同,后者会先将位移值除以dbu再转换为整数,仅因网格尺寸而产生精度损失。

示例代码展示了这个问题:

import pya
dbu = 0.001
t1 = pya.DCplxTrans(1.0, 45.0, False, 12.345678, 20.000000)
t2 = pya.DTrans(12.345678, 20.000000)

print(f"T1 to dbu type: {t1.to_itrans(dbu)}")
print(f"T2 to dbu type: {t2.to_itype(dbu)}")

输出结果:

T1 to dbu type: r45 *1 12000,20000
T2 to dbu type: r0 12346,20000

可以看到,12.345678微米在DCplxTrans转换后变成了12000数据库单位(即12.000微米),而在DTrans转换中则正确地变成了12346数据库单位(即12.346微米)。

技术背景

KLayout中提供了多种坐标变换类:

  • DCplxTrans:使用双精度浮点数表示的复数变换(包含旋转、缩放、镜像和位移)
  • ICplxTrans:使用整数表示的复数变换,但内部使用浮点数存储位移以实现精确变换
  • DTrans:双精度简单变换
  • Trans:整数简单变换

ICplxTrans虽然使用整数坐标,但内部使用浮点数表示位移,这是为了实现"精确"的缩放和旋转变换,仅在输出变换后的坐标时才进行舍入(延迟舍入)。

解决方案

官方推荐的标准解决方案是使用三个变换的组合:

  1. 一个变换进入微米空间
  2. 应用微米空间的原始变换
  3. 最后一个变换回到数据库单位空间

示例代码:

to_um = pya.CplxTrans(dbu)
from_um = to_um.inverted()
t1_itrans = from_um * t1 * to_um

print(f"(correct) T1 to dbu type: {t1_itrans}")

输出结果:

(correct) T1 to dbu type: r45 *1 12345.678,20000

这种方法确保了变换精度,同时保持了坐标系统的一致性。

注意事项

  1. ICplxTrans的位移值实际上是浮点数,这是设计上的特性,目的是实现精确的变换计算
  2. 当前版本中存在方法命名不一致的问题(如ICplxTrans#to_itrans实际上应该是to_dtrans),这在未来版本中会得到修正
  3. 对于需要高精度的应用场景,建议始终使用标准的三步变换方法

结论

在KLayout开发中处理坐标变换时,开发者应当注意不同变换类之间的精度差异。对于需要高精度的DCplxTrans到ICplxTrans转换,推荐使用标准的三步变换方法,而不是直接使用to_itrans方法。这种方法不仅解决了精度问题,还能确保变换结果在不同坐标系统间的一致性。

【免费下载链接】klayout KLayout Main Sources 【免费下载链接】klayout 项目地址: https://gitcode.com/gh_mirrors/kl/klayout

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值