На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Почему круг не ровный?
    Смотрите, нарисовал круг, а он не ровный! Объясните почему так?
    user posted image

    Видите он какой то кривоватый!

    А вот алгоритм
    ExpandedWrap disabled
      void MainWindow::paintEvent(QPaintEvent * pE)
      {
          QPainter paint(this);
          int radius = 30;
          int x = this->rect().width()/2;
          int y = this->rect().height()/2;
          float radians = 0.001f;
          const float PI = 3.14f;
          float i = radians;
       
          paint.setPen( QPen( Qt::red, 1 ) );
          while(true)
          {
              paint.drawPoint(QPointF(x+(radius*cos(i)),y+(radius*sin(i)) ));
              i+= radians;
              if (i >= PI*2) break;
          }
      }
      Вполне ровный, нарисуй сетку чтобы убедиться
        нарисовал сетку, еще раз убедился что кривые пиксели
        user posted image
          Вот алгоритм сглаживания

          user posted image
          ExpandedWrap disabled
            void MainWindow::paintEvent(QPaintEvent * pE)
            {
                QPainter paint(this);
                int radius = 70;
                int radius_2 = 27;
                int x = 10;
                int y = 10;
                float radians = 0.001f;
                const float PI = 3.14f;
                float i = radians;
                QImage image(QSize(this->rect().width(),this->rect().height()),QImage::Format_RGB888);
                image.fill(QColor(Qt::white).rgb());
             
                x = this->rect().width()/2;
                y = this->rect().height()/2;
             
             
                //тут рисуем круг
                while(true)
                {
                    float x_image = x+(radius*cos(i));
                    float y_image = y+(radius*sin(i));
                    image.setPixel(QPoint(x_image, y_image),qRgb(255,0,0));
                    i+= radians;
                    if (i >= PI*2) break;
                }
             
             
                i = radians;
                int r,g,b;
             
                while(true)
                {
                    //Получаем наш пиксель
                    float x_image = x+(radius*cos(i));
                    float y_image = y+(radius*sin(i));
             
                    //Получаем цвета всех пикселей
                    QRgb color_1 = image.pixel(x_image-1,y_image+1);
                    QRgb color_2 = image.pixel(x_image,y_image+1);
                    QRgb color_3 = image.pixel(x_image+1,y_image+1);
                    QRgb color_4 = image.pixel(x_image-1,y_image);
                    QRgb color_5 = image.pixel(x_image,y_image);
                    QRgb color_6 = image.pixel(x_image+1,y_image);
                    QRgb color_7 = image.pixel(x_image-1,y_image-1);
                    QRgb color_8 = image.pixel(x_image,y_image-1);
                    QRgb color_9 = image.pixel(x_image+1,y_image-1);
             
                   // qDebug() << qRed(color_5);
             
                  //  QMessageBox::about(0,"","");
                    //Умножаем на ядро гауса
                    color_2 = qRgb(qRed(color_2)*2,qGreen(color_2)*2,qBlue(color_2)*2);
                    color_4 = qRgb(qRed(color_4)*2,qGreen(color_4)*2,qBlue(color_4)*2);
                    color_5 = qRgb(qRed(color_5)*4,qGreen(color_5)*4,qBlue(color_5)*4);
                    color_6 = qRgb(qRed(color_4)*2,qGreen(color_4)*2,qBlue(color_4)*2);
                    color_8 = qRgb(qRed(color_8)*2,qGreen(color_8)*2,qBlue(color_8)*2);
             
                    // Складываем цвета
                    r= qRed(color_1)  + qRed(color_2)  + qRed(color_3)+qRed(color_4)+qRed(color_5)+qRed(color_6)+qRed(color_7)+qRed(color_8)+qRed(color_9);
                    g= qGreen(color_1)+ qGreen(color_2)  + qGreen(color_3)+qGreen(color_4)+qGreen(color_5)+qGreen(color_6)+qGreen(color_7)+qGreen(color_8)+qGreen(color_9);
                    b= qBlue(color_1) + qBlue(color_2) + qBlue(color_3)+qBlue(color_4)+qBlue(color_5)+qBlue(color_6)+qBlue(color_7)+qBlue(color_8)+qBlue(color_9);
             
                    //Делим на 16
                    r=r/16;
                    g=g/16;
                    b=b/16;
             
                    // Проверяем на выход за пределы байта
                    r>255?r=255:r=r;
                    g>255?g=255:g=g;
                    b>255?b=255:b=b;
             
                    r<0?r=0:r=r;
                    g<0?g=0:g=g;
                    b<0?b=0:b=b;
             
             
                    // Рисуем пиксель
                    image.setPixel(QPoint(x_image, y_image),qRgb(r,g,b));
             
             
             
                    i+= radians;
                    if (i >= PI*2) break;
                }
             
             
                 //тут рисуем круг рядом с якобы нормальным
                x+= radius *2+1;
                i = radians;
             
                while(true)
                {
                    float x_image = x+(radius*cos(i));
                    float y_image = y+(radius*sin(i));
                    image.setPixel(QPoint(x_image, y_image),qRgb(255,0,0));
                    i+= radians;
                    if (i >= PI*2) break;
                }
             
                paint.drawImage(0,0,image);
            }
            treeS
            Если вы под неровностями имеется в виду отличия по высоте и ширине то это зависит от соотношения сторон монитора и окна. Для устранения следует читать про AspectRatio
            Если вы имеете в виду того что пиксели квадратиками, ступеньками. То надо применять устранения ступенчатости (antilasing).
            Гаусс. Не очень хорошо помогает. Лучше работает алгоритм Ву (Xiaolin Wu) когда рассчитывается процент попадания линии в пиксель.
            Либо сабпиксельные алгоритмы когда пиксель разбивается на более мелкие по ним рисуется линия, а после эти мелкие усредняются.

            А практически я бы точками не рисовал в QT уже есть антилясинг и примитивы для рисования окружности. Или можно нарисовать линиями с включенным антилясингом.
            Если не любите QT то есть ещё AGG и др.
            Сообщение отредактировано: Pavia -
              В итоге ты сгладил границу круга в себя. Сделай второй цикл не по точкам круга, а по всем точкам изображения
                Потому что эпоха гарантированно квадратных пикселей закончилась.
                  Метод свертки не подошел, сглаживает но отвратительная яркость.
                  user posted image

                  Добавлено
                  Цитата
                  А практически я бы точками не рисовал в QT уже есть антилясинг и примитивы для рисования окружности.

                  Эт, я специально точками, для практики...

                  Позже буду пробовать алгоритм Ву
                    В OpenGL и DirectX используется сабпиксельные алгоритмы антилясинга. MSAA и FSAA и тп. Multisample anti-aliasing, Full Screen Anti-Aliasing, Fast approximate anti-aliasing и тп. Суть я описал в предыдущем посте. А отличия у них в скорости. Есть те кто целиком картинку усредняет, есть те которые только грани и края объектов(линии) . Есть те кто используют хитрый расчёт подобно тому как это делается в алгоритме Бу. Других вариантов и нету. И обычное замыливание(blure) в расчёт неберём
                    Сообщение отредактировано: Pavia -
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0652 ]   [ 14 queries used ]   [ Generated: 23.05.24, 09:43 GMT ]