Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.253.158] |
|
Сообщ.
#1
,
|
|
|
Смотрите, нарисовал круг, а он не ровный! Объясните почему так?
Видите он какой то кривоватый! А вот алгоритм 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; } } |
Сообщ.
#2
,
|
|
|
Вполне ровный, нарисуй сетку чтобы убедиться
|
Сообщ.
#3
,
|
|
|
нарисовал сетку, еще раз убедился что кривые пиксели
|
Сообщ.
#4
,
|
|
|
Вот алгоритм сглаживания
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); } |
Сообщ.
#5
,
|
|
|
treeS
Если вы под неровностями имеется в виду отличия по высоте и ширине то это зависит от соотношения сторон монитора и окна. Для устранения следует читать про AspectRatio Если вы имеете в виду того что пиксели квадратиками, ступеньками. То надо применять устранения ступенчатости (antilasing). Гаусс. Не очень хорошо помогает. Лучше работает алгоритм Ву (Xiaolin Wu) когда рассчитывается процент попадания линии в пиксель. Либо сабпиксельные алгоритмы когда пиксель разбивается на более мелкие по ним рисуется линия, а после эти мелкие усредняются. А практически я бы точками не рисовал в QT уже есть антилясинг и примитивы для рисования окружности. Или можно нарисовать линиями с включенным антилясингом. Если не любите QT то есть ещё AGG и др. |
Сообщ.
#6
,
|
|
|
В итоге ты сгладил границу круга в себя. Сделай второй цикл не по точкам круга, а по всем точкам изображения
|
Сообщ.
#7
,
|
|
|
Потому что эпоха гарантированно квадратных пикселей закончилась.
|
Сообщ.
#8
,
|
|
|
Метод свертки не подошел, сглаживает но отвратительная яркость.
Добавлено Цитата А практически я бы точками не рисовал в QT уже есть антилясинг и примитивы для рисования окружности. Эт, я специально точками, для практики... Позже буду пробовать алгоритм Ву |
Сообщ.
#9
,
|
|
|
В OpenGL и DirectX используется сабпиксельные алгоритмы антилясинга. MSAA и FSAA и тп. Multisample anti-aliasing, Full Screen Anti-Aliasing, Fast approximate anti-aliasing и тп. Суть я описал в предыдущем посте. А отличия у них в скорости. Есть те кто целиком картинку усредняет, есть те которые только грани и края объектов(линии) . Есть те кто используют хитрый расчёт подобно тому как это делается в алгоритме Бу. Других вариантов и нету. И обычное замыливание(blure) в расчёт неберём
|