我只想画一个椭圆的周长。我用这个:
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();
但我经常得到一个填充的椭圆形。我究竟做错了什么?
我只想画一个椭圆的周长。我用这个:
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 的转换是如何工作的。如果是后者:
转换仅影响以下操作。而且它们只会以某种方式影响涉及坐标或大小的操作。在这种情况下,您可能希望将其应用于圆弧。然而,它实际上只应用于笔画,并且可能以您不希望的方式应用。
知道我提到的变换如何影响涉及坐标或大小的操作吗?好吧,这可能并不明显,但笔画确实隐含地涉及大小:即笔画大小。因此,您的弧线的笔划大小width * 0.5
在 x 轴和height * 0.5
y 轴上按比例缩放。换句话说,笔画太大了,看起来像一个填充物。
有趣的是,即使您的圆弧实际上不受 影响scale()
,这意味着您会留下一个圆形而不是椭圆形,但由于笔划的缩放方式,您仍然会得到一个椭圆形。
因此,要解决您的问题:
scale()
arc()
arc()
在你打电话之后但你打电话之前重置比例因子stroke()
,这样你就不会再次遭遇可怕的中风