2

楕円の円周だけを描きたい。私はこれを使用します:

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();

しかし、私は常に塗りつぶされた楕円形になります。私は何を間違っていますか?

4

1 に答える 1

2

への呼び出しscale()は、おそらく意図したとおりに動作していません。うっかり呼び出しの順序を間違えたのか、それとも cairo の変換がどのように機能するかをよく理解していないのかどうかはわかりません。後者の場合:

変換は、次の操作にのみ影響します。そして、何らかの形で座標またはサイズを含む操作にのみ影響します。この場合、アークに適用する必要がありました。ただし、実際にはストロークに適用されるだけであり、意図しない方法で適用される可能性があります。

変換が座標やサイズに関係する操作に影響を与えると述べた方法を知っていますか? 明らかではないかもしれませんが、ストロークにはサイズ、つまりストローク サイズが暗黙的に含まれます。width * 0.5したがって、円弧のストローク サイズは、x 軸とy 軸でスケーリングされheight * 0.5ます。言い換えれば、ストロークは非常に巨大で、塗りつぶしのように見えます。

興味深いことに、円弧は実際には の影響を受けませんでしたscale()。つまり、楕円ではなく円が残っていたはずですが、ストロークがスケーリングされた方法のために楕円になってしまいました。

したがって、問題を解決するには:

  • 前に電話するscale() arc()
  • arc()を呼び出した後、呼び出す前にスケーリング係数をリセットしてstroke()、再び巨大なストロークに巻き込まれないようにします
于 2012-01-16T06:51:46.553 に答える