Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: li-frost от Июнь 06, 2011, 08:13



Название: Нарисовать арку полигонами
Отправлено: li-frost от Июнь 06, 2011, 08:13
Прошу помощи по данному вопросу, у меня с геометрией что-то плоховат-то. Каким образом нарисовать арку полигонами, понимаю что-то должна быть формула по которой вычисляются точки полукруга, но как это сделать не пойму.


Название: Re: Нарисовать арку полигонами
Отправлено: LisandreL от Июнь 06, 2011, 08:25
Что вы понимаете под аркой?


Название: Re: Нарисовать арку полигонами
Отправлено: li-frost от Июнь 06, 2011, 08:29
мне нужно арочное окно нарисовать.
Арка - Полукруг — сегмент круга, вот так и понимаю.


Название: Re: Нарисовать арку полигонами
Отправлено: Igors от Июнь 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;
}
}
 
 
Писал прямо здесь, так что рихтуйте  :)


Название: Re: Нарисовать арку полигонами
Отправлено: li-frost от Июнь 06, 2011, 08:59
СПАСИБО БОЛЬШОЕ!!! С этим я уже разберусь.


Название: Re: Нарисовать арку полигонами
Отправлено: Igors от Июнь 06, 2011, 09:04
Чтоб легче разбираться: есть "параметрическое" уравнение фигуры - задаете угол, из него получаете x и у. Для круга

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

Для эллипса

x = RX * cos(angle);
y = RY * sin(angle);


Название: Re: Нарисовать арку полигонами
Отправлено: GreatSnake от Июнь 06, 2011, 09:45
Прошу помощи по данному вопросу, у меня с геометрией что-то плоховат-то. Каким образом нарисовать арку полигонами, понимаю что-то должна быть формула по которой вычисляются точки полукруга, но как это сделать не пойму.
А зачем именно полигонами?
Чем не устроил предназначенный именно для этого QPainterPath?


Название: Re: Нарисовать арку полигонами
Отправлено: li-frost от Июнь 06, 2011, 09:58
Так задумано. Я понимаю что можно и по другому, но мне нужно именно полигонами...


Название: Re: Нарисовать арку полигонами
Отправлено: GreatSnake от Июнь 06, 2011, 10:01
Так задумано. Я понимаю что можно и по другому, но мне нужно именно полигонами...
Код
C++ (Qt)
QList<QPolygonF> QPainterPath::toFillPolygons ( const QTransform & matrix ) const


Название: Re: Нарисовать арку полигонами
Отправлено: li-frost от Июнь 06, 2011, 10:12
Так задумано. Я понимаю что можно и по другому, но мне нужно именно полигонами...
Код
C++ (Qt)
QList<QPolygonF> QPainterPath::toFillPolygons ( const QTransform & matrix ) const
Такого способа я не знаю


Название: Re: Нарисовать арку полигонами
Отправлено: GreatSnake от Июнь 06, 2011, 10:15
Такого способа я не знаю
Хм, странная реакция. А в чём сложности узнать ???


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

Все хорошо в меру, и знание Qt классов - тоже  :)


Название: Re: Нарисовать арку полигонами
Отправлено: GreatSnake от Июнь 06, 2011, 10:58
Ну, моё дело предложить, а TC отказаться :)


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

Все хорошо в меру, и знание Qt классов - тоже  :)
Что-то у меня кроме треугольника ничего не выходит нарисовать (((, в чем может быть причина?


Название: Re: Нарисовать арку полигонами
Отправлено: Igors от Июнь 06, 2011, 11:30
Что-то у меня кроме треугольника ничего не выходит нарисовать (((, в чем может быть причина?
Вероятно в нежелании разбираться и отлаживаться  :)


Название: Re: Нарисовать арку полигонами
Отправлено: li-frost от Июнь 06, 2011, 11:42
Что-то у меня кроме треугольника ничего не выходит нарисовать (((, в чем может быть причина?
Вероятно в нежелании разбираться и отлаживаться  :)
Эх.....если бы. Не хотел бы разобраться, не писал сроду сюда.


Название: Re: Нарисовать арку полигонами
Отправлено: Igors от Июнь 06, 2011, 14:11
Эх.....если бы. Не хотел бы разобраться, не писал сроду сюда.
Пишите конкретно, постите исходники, картинки результатов, печатайте полигоны в консоли. А с "ничего не выходит" рассчитывать на содержательный ответ не приходится.

Возможно Вы попутали радианы с градусами - но я не телепат  :)


Название: Re: Нарисовать арку полигонами
Отправлено: li-frost от Июнь 07, 2011, 07:08
Цитировать
Возможно Вы попутали радианы с градусами - но я не телепат
Да, на счет это вы правы, я задал вопрос в никуда.
Вот код:
Код:
Arc::Arc(QGraphicsItem *parent) : QGraphicsPolygonItem(parent)
{
    setBrush(QBrush(Qt::white,Qt::SolidPattern));
    setFillRule(Qt::WindingFill);

    PI = 3.141592;

    mBegAngle = 0.0f;
    mEndAngle = PI / 2;
    mRadOut = QPointF(100, 100);
    mCenter = QPointF(250, 250);

    QVector<QPolygonF> poly;
    poly.append(arcPoly);

    setupArc(10, poly);
}

void Arc::setupArc( int steps, QVector <QPolygonF> &poly )
{
    steps = qMax(steps, 1);
    qreal delta = (mEndAngle - mBegAngle) / steps;
    qreal angle = mBegAngle;
    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;

        setPolygon(dst);
    }
}


Название: Re: Нарисовать арку полигонами
Отправлено: Igors от Июнь 07, 2011, 10:58
QGraphicsPolygonItem - это всего 1(один) полигон, ну один и получаете. А у Вас массив (вектор) полигонов, поэтому Вам нужно наследоваться от QGraphicsItem и переопределять его методы (там несложно)


Название: Re: Нарисовать арку полигонами
Отправлено: GreatSnake от Июнь 07, 2011, 11:04
QGraphicsPolygonItem - это всего 1(один) полигон, ну один и получаете. А у Вас массив (вектор) полигонов, поэтому Вам нужно наследоваться от QGraphicsItem и переопределять его методы (там несложно)
А почему нельзя весь массив полигонов сконкатенировать в один?


Название: Re: Нарисовать арку полигонами
Отправлено: li-frost от Июнь 07, 2011, 11:06
Цитировать
А почему нельзя весь массив полигонов сконкатенировать в один?
Вот это интересно, а как это можно сделать?


Название: Re: Нарисовать арку полигонами
Отправлено: GreatSnake от Июнь 07, 2011, 11:13
Цитировать
А почему нельзя весь массив полигонов сконкатенировать в один?
Вот это интересно, а как это можно сделать?
На самом деле я не вникал в ваш код расчёта полигонов, т.е. последовательные они или нет, но QPolygonF это QVector, а вектора складываются простым '+=' (operator+=).


Название: Re: Нарисовать арку полигонами
Отправлено: Igors от Июнь 07, 2011, 13:36
А почему нельзя весь массив полигонов сконкатенировать в один?
Один полигон - вектор точек, образующих замкнутый контур. Если добавить точки одного полигона к другому - получится бессмысленное взаимо-пересекающееся месиво. По задаче нужно иметь отдельные полигоны - напр чтобы закрасить их разными цветами.

Вот это интересно, а как это можно сделать?
Унаследоваться от QGraphicsItem - всех делов 10 минут (2 метода перекрыть - нарисовать полигоны в цикле и сложить границы). А для GreatSnake вообще пара минут :). Это будет намного быстрее чем "обозначать интерес" в течение нескольких дней. Открывайте Assistant


Название: Re: Нарисовать арку полигонами
Отправлено: li-frost от Июнь 08, 2011, 08:47
Все, всем спасибо, я разобрался.