KLayout中DCplxTrans到ICplxTrans转换的精度问题解析
【免费下载链接】klayout KLayout Main Sources 项目地址: 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虽然使用整数坐标,但内部使用浮点数表示位移,这是为了实现"精确"的缩放和旋转变换,仅在输出变换后的坐标时才进行舍入(延迟舍入)。
解决方案
官方推荐的标准解决方案是使用三个变换的组合:
- 一个变换进入微米空间
- 应用微米空间的原始变换
- 最后一个变换回到数据库单位空间
示例代码:
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
这种方法确保了变换精度,同时保持了坐标系统的一致性。
注意事项
- ICplxTrans的位移值实际上是浮点数,这是设计上的特性,目的是实现精确的变换计算
- 当前版本中存在方法命名不一致的问题(如ICplxTrans#to_itrans实际上应该是to_dtrans),这在未来版本中会得到修正
- 对于需要高精度的应用场景,建议始终使用标准的三步变换方法
结论
在KLayout开发中处理坐标变换时,开发者应当注意不同变换类之间的精度差异。对于需要高精度的DCplxTrans到ICplxTrans转换,推荐使用标准的三步变换方法,而不是直接使用to_itrans方法。这种方法不仅解决了精度问题,还能确保变换结果在不同坐标系统间的一致性。
【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



