Russian Qt Forum
Ноябрь 01, 2024, 13:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Нарисовать арку полигонами  (Прочитано 10952 раз)
li-frost
Гость
« : Июнь 06, 2011, 08:13 »

Прошу помощи по данному вопросу, у меня с геометрией что-то плоховат-то. Каким образом нарисовать арку полигонами, понимаю что-то должна быть формула по которой вычисляются точки полукруга, но как это сделать не пойму.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июнь 06, 2011, 08:25 »

Что вы понимаете под аркой?
Записан
li-frost
Гость
« Ответ #2 : Июнь 06, 2011, 08:29 »

мне нужно арочное окно нарисовать.
Арка - Полукруг — сегмент круга, вот так и понимаю.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 06, 2011, 08:56 »

Код
C++ (Qt)
#define PI 3.141592f
 
struct CArcGen {
CArcGen( void );
void CreatePolys( int steps, QVector <QPolygonF> & poly ) const;
 
qreal mBegAngle;  // начальный угол в радианах
qreal mEndAngle;  // конечный угол в радианах
QPointF mCenter;  // центр
QPointF mRadIn, mRadOut;  // внешний и внутренний радиусы по x и у
};
 
CArcGen::CArcGen( void ) :
mBegAngle(0.0f),
mEndAngle(PI / 2),
mRadOut(100, 100)
{
}
 
void CArcGen::CreatePolys( int steps, QVector <QPolygonF> & poly ) const
{
steps = qMax(steps, 1);
qreal delta = (mEndAngle - mBegAngle) / steps;
qreal angle = mAngleBeg;
qreal cos1 = cos(angle);
qreal sin1 = sin(angle);
 
for (int i = 0; i < steps; ++i) {
 angle += delta;
 qreal cos2 = cos(angle);
 qreal sin2 = sin(angle);
 
 poly.push_back(QPolygonF());
 QPolygonF & dst = poly.back();
 
 dst.push_back(QPointF(mRadOut.x() * cos1, mRadOut.y() * sin1));
 dst.push_back(QPointF(mRadOut.x() * cos2, mRadOut.y() * sin2));
 dst.push_back(QPointF(mRadIn.x() * cos2, mRadIn.y() * sin2));
 dst.push_back(QPointF(mRadIn.x() * cos1, mRadIn.y() * sin1));
 
 dst.translate(mCenter);
 
 cos1 = cos2;
 sin1 = sin2;
}
}
 
 
Писал прямо здесь, так что рихтуйте  Улыбающийся
« Последнее редактирование: Июнь 06, 2011, 08:59 от Igors » Записан
li-frost
Гость
« Ответ #4 : Июнь 06, 2011, 08:59 »

СПАСИБО БОЛЬШОЕ!!! С этим я уже разберусь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 06, 2011, 09:04 »

Чтоб легче разбираться: есть "параметрическое" уравнение фигуры - задаете угол, из него получаете x и у. Для круга

x = R * cos(angle);
y = R * sin(angle);

Для эллипса

x = RX * cos(angle);
y = RY * sin(angle);
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Июнь 06, 2011, 09:45 »

Прошу помощи по данному вопросу, у меня с геометрией что-то плоховат-то. Каким образом нарисовать арку полигонами, понимаю что-то должна быть формула по которой вычисляются точки полукруга, но как это сделать не пойму.
А зачем именно полигонами?
Чем не устроил предназначенный именно для этого QPainterPath?
Записан

Qt 5.11/4.8.7 (X11/Win)
li-frost
Гость
« Ответ #7 : Июнь 06, 2011, 09:58 »

Так задумано. Я понимаю что можно и по другому, но мне нужно именно полигонами...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Июнь 06, 2011, 10:01 »

Так задумано. Я понимаю что можно и по другому, но мне нужно именно полигонами...
Код
C++ (Qt)
QList<QPolygonF> QPainterPath::toFillPolygons ( const QTransform & matrix ) const
Записан

Qt 5.11/4.8.7 (X11/Win)
li-frost
Гость
« Ответ #9 : Июнь 06, 2011, 10:12 »

Так задумано. Я понимаю что можно и по другому, но мне нужно именно полигонами...
Код
C++ (Qt)
QList<QPolygonF> QPainterPath::toFillPolygons ( const QTransform & matrix ) const
Такого способа я не знаю
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Июнь 06, 2011, 10:15 »

Такого способа я не знаю
Хм, странная реакция. А в чём сложности узнать Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июнь 06, 2011, 10:49 »

Хм, странная реакция. А в чём сложности узнать Непонимающий
А зачем если это решается школьными синусом и косинусом? И весь код свой, а не чужой класс, и надо надеяться что он будет работать как надо. Кто его знает с каким шагом toFillPolygons "расквантует" дугу? И где взять QPainterPath (в смысле как заполнить)? Дешевле никак не выходит. И какова "себестоимость" крутого fill-вызова? Не на два ли порядка выше простенького своего кода?  (в это знатоки классов обычно вдаваться не любят Улыбающийся)

Все хорошо в меру, и знание Qt классов - тоже  Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Июнь 06, 2011, 10:58 »

Ну, моё дело предложить, а TC отказаться Улыбающийся
Записан

Qt 5.11/4.8.7 (X11/Win)
li-frost
Гость
« Ответ #13 : Июнь 06, 2011, 11:13 »

Хм, странная реакция. А в чём сложности узнать Непонимающий
А зачем если это решается школьными синусом и косинусом? И весь код свой, а не чужой класс, и надо надеяться что он будет работать как надо. Кто его знает с каким шагом toFillPolygons "расквантует" дугу? И где взять QPainterPath (в смысле как заполнить)? Дешевле никак не выходит. И какова "себестоимость" крутого fill-вызова? Не на два ли порядка выше простенького своего кода?  (в это знатоки классов обычно вдаваться не любят Улыбающийся)

Все хорошо в меру, и знание Qt классов - тоже  Улыбающийся
Что-то у меня кроме треугольника ничего не выходит нарисовать (((, в чем может быть причина?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июнь 06, 2011, 11:30 »

Что-то у меня кроме треугольника ничего не выходит нарисовать (((, в чем может быть причина?
Вероятно в нежелании разбираться и отлаживаться  Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.216 секунд. Запросов: 23.