这是不是;像素移位“;tcl/tk画布中的一个bug?
查看此脚本的结果:这是不是;像素移位“;tcl/tk画布中的一个bug?,tcl,tk,Tcl,Tk,查看此脚本的结果: canvas .c -bg white grid .c set x1 20 set x2 22 set y2 105 for {set f 0} {$f<50} {incr f} { set y1 [expr {$y2-0.05*$f}] .c create rectangle $x1 $y1 $x2 $y2 -fill black incr x1 2 incr x2 2 } canvas.c-bg白色 网格c 设
canvas .c -bg white
grid .c
set x1 20
set x2 22
set y2 105
for {set f 0} {$f<50} {incr f} {
set y1 [expr {$y2-0.05*$f}]
.c create rectangle $x1 $y1 $x2 $y2 -fill black
incr x1 2
incr x2 2
}
canvas.c-bg白色
网格c
设置x120
第22组
设置y2 105
对于{setf0}{$f我认为这与TK的努力有关
绘制一个大小至少为1像素的矩形
在代码中我可以看到,y2增加了
如果四舍五入为短整数后等于y1,则为1
记录您的创建语句可以看到,像素跳跃
发生在f=10和f=11之间。这是
y1和y2变得不相等,且不进行调整:
f=10 .c create rectangle 40 104.5 42 105 -fill black
rounded: y1=105 y2=105
adjusted: y1=105 y2=106
f=11 .c create rectangle 42 104.45 44 105 -fill black
rounded: y1=104 y2=105
no adjustment
这就是像素跳跃的原因
在我看来,你应该对此提出一个bug。我认为这与TK的努力有关
绘制一个大小至少为1像素的矩形
在代码中我可以看到,y2增加了
如果四舍五入为短整数后等于y1,则为1
记录您的创建语句可以看到,像素跳跃
发生在f=10和f=11之间。这是
y1和y2变得不相等,且不进行调整:
f=10 .c create rectangle 40 104.5 42 105 -fill black
rounded: y1=105 y2=105
adjusted: y1=105 y2=106
f=11 .c create rectangle 42 104.45 44 105 -fill black
rounded: y1=104 y2=105
no adjustment
这就是像素跳跃的原因
在我看来,你应该对此提出一个错误。在OSX上,8.5和8.6都是一样的。谢谢你的测试!但这是一个错误吗?我应该向Tk tracker报告吗?我还不知道。:-)我确实怀疑这个问题与两个坐标圆到相同值时发生的情况有关。请参阅和-问题是画布highlightthickness
属性默认设置为2,而不是0。在OSX上,这与8.5和8.6都是一样的。感谢您的测试!但这是一个错误吗?我应该向Tk tracker报告吗?我还不知道。:-)我确实怀疑这个问题与两个坐标取整到相同值时发生的情况有关。请参阅和-问题是画布highlightthickness
属性默认设置为2,而不是0正确。在tk/generic/tkrecotoval.c::ComputereCotovalBBox中,我们发现“特别注意:矩形的大小始终至少为1x1,因此将上部坐标四舍五入,使其至少比下部坐标大1个单位。”以前的许多块都具有相同的y1和y2,因此y2的增量为106。Tk画布不进行亚像素绘制。您可以使用不同的方式指定坐标,但所有绘制代码的计算结果都是像素。明白了,但我认为这是错误的,坐标必须转换为y=105,而不是106。再次查看结果关于脚本执行——这显然是错误的,IMHO。“必须转换”?我们如何知道你的方式是最好的(在一系列任意选择中)?嗯,这很简单。这是演示Tk行为的模型。绿色矩形是实际提供的坐标,彩色矩形显示Tk如何绘制它们:canvas.c-bg white-highlightthickness 0 grid.c for{set f 0}{$fCorrect.In Tk/generic/tkRectOval.c::ComputeRectOvalBbox特别注意:矩形的尺寸始终至少为1x1,因此将上部坐标四舍五入,使其至少比下部坐标大1个单位。"以前的许多块都具有相同的y1和y2,因此y2的增量为106。Tk画布不进行亚像素绘制。您可以使用不同的方式指定坐标,但所有绘制代码的计算结果都是像素。明白了,但我认为这是错误的,坐标必须转换为y=105,而不是106。再次查看结果关于脚本执行——这显然是错误的,IMHO。“必须转换”?我们如何知道你的方式是最好的(在一系列任意选择中)?嗯,这很简单。这是演示Tk行为的模型。绿色矩形是实际提供的坐标,彩色矩形显示Tk如何绘制它们:canvas.c-bg white-highlightthickness 0 grid.c for{set f 0}{$f