Рисование овала с 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()
так, чтобы ты снова не попал с чудовищным ударом