Graphics 使用Gdk Cairo上下文绘制椭圆形

Graphics 使用Gdk Cairo上下文绘制椭圆形,graphics,gtk,cairo,geometric-arc,gdk,Graphics,Gtk,Cairo,Geometric Arc,Gdk,我只想画一个椭圆形的圆周。我用这个: gc->save(); gc->translate( xc, yc ); gc->arc( 0.0, 0.0, 1.0, 0.0, 2.0*M_PI ); gc->scale( width*0.5, height*0.5 ); gc->stroke(); gc->restore(); 但我总是得到一个充满的椭圆形。我做错了什么?好吧,你对scale()的调用可能没有达到你的目的。我不确定您是否意外地将调用按错误的顺序进行

我只想画一个椭圆形的圆周。我用这个:

gc->save();
gc->translate( xc, yc );
gc->arc( 0.0, 0.0, 1.0, 0.0, 2.0*M_PI );
gc->scale( width*0.5, height*0.5 );
gc->stroke();
gc->restore();

但我总是得到一个充满的椭圆形。我做错了什么?

好吧,你对
scale()
的调用可能没有达到你的目的。我不确定您是否意外地将调用按错误的顺序进行,或者您是否不太了解cairo的转换是如何工作的。如果是后者:

转换只影响以下操作。它们只会以某种方式影响涉及坐标或大小的操作。在本例中,您可能希望将其应用于圆弧。然而,它实际上只适用于中风,而且可能是以一种你并不打算的方式

知道我提到的变换如何影响涉及坐标或大小的操作吗?嗯,这可能并不明显,但笔划确实隐含着大小:即笔划大小。因此,圆弧的笔划大小在x轴上按
宽度*0.5
缩放,在y轴上按
高度*0.5
缩放。换句话说,笔划是如此之大以至于看起来像是填充

有趣的是,即使你的弧实际上不受
scale()
的影响,这意味着你会留下一个圆而不是一个椭圆形,但你仍然会因为笔划的缩放方式而得到一个椭圆形

因此,要解决您的问题:

  • arc()之前调用
    scale()
  • 在调用
    arc()
    之后,但在调用
    stroke()
    之前,重置比例因子,这样您就不会再次出现可怕的笔划

嗯,您对
scale()
的调用可能没有达到您的预期。我不确定您是否意外地将调用按错误的顺序进行,或者您是否不太了解cairo的转换是如何工作的。如果是后者:

转换只影响以下操作。它们只会以某种方式影响涉及坐标或大小的操作。在本例中,您可能希望将其应用于圆弧。然而,它实际上只适用于中风,而且可能是以一种你并不打算的方式

知道我提到的变换如何影响涉及坐标或大小的操作吗?嗯,这可能并不明显,但笔划确实隐含着大小:即笔划大小。因此,圆弧的笔划大小在x轴上按
宽度*0.5
缩放,在y轴上按
高度*0.5
缩放。换句话说,笔划是如此之大以至于看起来像是填充

有趣的是,即使你的弧实际上不受
scale()
的影响,这意味着你会留下一个圆而不是一个椭圆形,但你仍然会因为笔划的缩放方式而得到一个椭圆形

因此,要解决您的问题:

  • arc()之前调用
    scale()
  • 在调用
    arc()
    之后,但在调用
    stroke()
    之前,重置比例因子,这样您就不会再次出现可怕的笔划