Рисование овала с Gdk Cairo Context - PullRequest
1 голос
/ 09 января 2012

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

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 Ответ

1 голос
/ 16 января 2012

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

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

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

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

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

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