【问题标题】:Is this "pixel shift" a bug in tcl/tk canvas?这种“像素偏移”是 tcl/tk 画布中的错误吗?
【发布时间】:2011-11-13 13:05:45
【问题描述】:

看看这个脚本的结果:

 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
 }

在 Windows XP 上,我看到图形底部边距的左侧比右侧低一个像素。但这不应该发生,因为所有矩形的 y2 都是相同的(105)。你怎么看?

【问题讨论】:

  • 在 OSX 上是一样的,8.5 和 8.6 都一样。
  • 感谢测试!但这是一个错误吗?我应该向 Tk 跟踪器报告吗?
  • 我还不知道。 :-) 我确实怀疑这个问题与两个坐标四舍五入到相同值时发生的情况有关。
  • 参见 codegolf.stackexchange.com/questions/85141/…stackoverflow.com/a/4311134/383779 — 问题是画布 highlightthickness 属性默认设置为 2 而不是 0

标签: tcl tk


【解决方案1】:

我认为这与 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

这就解释了像素跳跃。

IMO 你应该提交一个错误。

【讨论】:

  • 正确。在 tk/generic/tkRectOval.c::ComputeRectOvalBbox 中,我们发现“特别注意:矩形始终绘制为至少 1x1 大小,因此将上坐标向上取整为至少比下坐标大 1 个单位。”您早期的许多块具有相同的 y1 和 y2,因此 y2 的增量为 106。Tk 画布不进行子像素绘制。您可以指定不同的坐标,但所有绘图代码都会计算到像素。
  • 明白,但我认为这是错误的,必须转换坐标,以便在 y=105 而不是 106 处绘制线。再一次,看看脚本执行的结果 --- 完全错误,恕我直言。
  • “必须转换”?我们怎么知道你的方式是最好的(在一组任意选择中)?
  • 恕我直言,这很简单。这是演示 Tk 行为的模型。绿色矩形是提供的实际坐标,彩色矩形显示 Tk 如何绘制它们:
  • canvas .c -bg white -highlightthickness 0 grid .c for {set f 0} {$f&lt;500} {incr f 20} { .c create line $f 0 $f 2000 -width 0 -fill grey .c create line 0 $f 2000 $f -width 0 -fill grey } set x1 20 set x2 40 set y2 200 for {set f 1} {$f&lt;20} {incr f} { set y1 [expr {$y2-5*$f}] if {($y2-$y1)&lt;20} { set a [.c create rectangle $x1 $y2 $x2 [expr {$y2+20}] -fill red -width 0] } else { set a [.c create rectangle $x1 [expr {round($y1/20.0)*20}] $x2 $y2 -fill lightblue -width 0] } .c lower $a .c create rectangle $x1 $y1 $x2 $y2 -outline darkgreen incr x1 20 incr x2 20 }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多