Рисование овала с Gdk Cairo Context

Я хочу нарисовать только окружность овала. Я использую это:

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

но я постоянно получаю заполненный овал. Что я делаю неправильно?

1 ответ

Ну, твой звонок scale() вероятно, не делает то, что вы хотели. Я не уверен, что вы случайно разместили вызовы в неправильном порядке или не совсем понимаете, как работают преобразования в Каире. В случае, если это последнее:

Преобразования влияют только на следующие операции. И они влияют только на операции, связанные с координатами или размерами. В этом случае вы, вероятно, хотели применить его к дуге. Тем не менее, это на самом деле только применяется к инсульту, и, вероятно, таким образом, что вы не собирались.

Знаете, как я упоминал, преобразования влияют на операции, связанные с координатами или размерами? Ну, это может быть неочевидно, но обводка подразумевает неявные размеры, а именно размер обводки. Таким образом, размер удара вашей дуги масштабируется width * 0.5 по осям х и height * 0.5 по осям у. Другими словами, удар настолько чертовски огромен, что выглядит как заливка.

Интересно, что хотя ваша дуга была фактически не затронута scale()Это означает, что вы остались бы с кругом, а не овалом, вы все равно завелись овалом из-за того, как был масштабирован ход.

Итак, чтобы исправить вашу проблему:

  • вызов scale() до arc()
  • сбросить коэффициент масштабирования после вызова arc() но прежде чем позвонить stroke()так, чтобы ты снова не попал с чудовищным ударом
Другие вопросы по тегам