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

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

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

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

Сообщений: 11445


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

Эх.....если бы. Не хотел бы разобраться, не писал сроду сюда.
Пишите конкретно, постите исходники, картинки результатов, печатайте полигоны в консоли. А с "ничего не выходит" рассчитывать на содержательный ответ не приходится.

Возможно Вы попутали радианы с градусами - но я не телепат  Улыбающийся
Записан
li-frost
Гость
« Ответ #17 : Июнь 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);
    }
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

QGraphicsPolygonItem - это всего 1(один) полигон, ну один и получаете. А у Вас массив (вектор) полигонов, поэтому Вам нужно наследоваться от QGraphicsItem и переопределять его методы (там несложно)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

QGraphicsPolygonItem - это всего 1(один) полигон, ну один и получаете. А у Вас массив (вектор) полигонов, поэтому Вам нужно наследоваться от QGraphicsItem и переопределять его методы (там несложно)
А почему нельзя весь массив полигонов сконкатенировать в один?
Записан

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

Цитировать
А почему нельзя весь массив полигонов сконкатенировать в один?
Вот это интересно, а как это можно сделать?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Июнь 07, 2011, 13:36 »

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

Вот это интересно, а как это можно сделать?
Унаследоваться от QGraphicsItem - всех делов 10 минут (2 метода перекрыть - нарисовать полигоны в цикле и сложить границы). А для GreatSnake вообще пара минут Улыбающийся. Это будет намного быстрее чем "обозначать интерес" в течение нескольких дней. Открывайте Assistant
Записан
li-frost
Гость
« Ответ #23 : Июнь 08, 2011, 08:47 »

Все, всем спасибо, я разобрался.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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