这是不是;像素移位“;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