Рисование овала с 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();

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


person user804723    schedule 09.01.2012    source источник


Ответы (1)


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

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

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

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

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

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