Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 2-D Графика средствами WinAPI (ну или MFC), Некоторые вопросы. 
:(
    Опции темы
CBETA
Дата 12.4.2004, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 10.4.2004

Репутация: 1
Всего: 1



Как провести сглаженную прямую, окружность, многоугольник?
Не знаю как это называют профи, поэтому попытаюсь объяснить что я подразумеваю под термином "сглаженная"
Например: (условный код)
MoveTo(0,0);
LineTo(10,1);
Линия будет нарисована со ступенькой вроде этого:
-----_____
Если же такую линию провести например в Фотошопе то она будет смотреться на много изящнее.
Изобразить здесь не смогу. (в общем это нужно видеть.)

Возможно ли элегантное решение данной проблемы?
Писать самой функции вывода графических примитивов - прямой, эллипса, и т.д.?
Не представляю как.
Попиксельный вывод - крайне медленно.
Возможны ли какие-то другие решения?
PM MAIL   Вверх
chipset
Дата 12.4.2004, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



В фотошопе используется метод антиалиасинга то есть пиксель немного расплывается, и высчитывается состояние отдельных клеток по X или + образному методе.
Подробнее об антиалиасинге читай вот здесь .
А насчёт GDI-ных функций, то ИМХО для нормального проекта GDI сильно тормознутый...
Лучше заюзать DirectX или OpenGL, в иксе скорее всего и есть такии функции но точно не могу сказать...
Удачи!


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
achmed
Дата 12.4.2004, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 12.4.2004

Репутация: нет
Всего: нет



ну наверное стоит поискать готовые MFCшные классы, реализующие эту функциональность,
где-нибудь на codeproject.com, codeguru.com/

PM MAIL   Вверх
Coocky
Дата 12.4.2004, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 2
Всего: 62



Цитата
Как провести сглаженную прямую, окружность, многоугольник?

Это не есть задачи МФС.По крайней мере функций таких не встречал.Для этого есть библиотеки Opena и Directa.Кстати под этими библиотеками прекрасно работает видеокарта,(если поставить настройки smile.gif )Все прекрасно сглаживает biggrin.gif А вот функции тормозят прогу sad.gif


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
CBETA
Дата 13.4.2004, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 10.4.2004

Репутация: 1
Всего: 1



chipset[b]
[b]Coocky

Фокус с картой не пройдет. Условия варварские smile.gif.
Проект должен работать на любой машине, начиная с 486 и Win95.
По этой же причине видимо Open и Direct отпадают.
Не поставлять же этих монстров вместе с прогой.
А на Win95 какой там был директ, и был ли вообще?

На самом деле экстра быстродействия не требуется.
Думаю вполне достаточно быстродействия GDI.
Если честно, просто не хочется изобретать велосипед.

achmed
Поискать попробую, хотя мне почему-то никогда не удается
найти именно то что нужно. (Видимо искать не умею.)

И еще вопросик по теме:
Как сделать градиентную заливку прямоугольника средствами GDI?

Приходит в голову что-то вроде бесконечного создания и удаления кистей разных оттенков.
Писать еще не пробовала, но должно выглядеть ну очень забавно. smile.gif

PM MAIL   Вверх
mr.DUDA
Дата 13.4.2004, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
И еще вопросик по теме:
Как сделать градиентную заливку прямоугольника средствами GDI?

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

На самом деле всё гораздо проще wink.gif:
Цитата
void CGradientView::OnDraw(CDC* pDC)
{
    // выбираем "крайние" цвета градиентной заливки
    COLORREF col1(RGB(255,0,0)), col2(RGB(0,0,255));

    // определяемся с размерами прямоугольника
    int W=200, H=100;

    // создаём рабочий Bitmap и получаем его пикселы как массив цветов
    CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, W, H);
    COLORREF *pPixels = GetBitmapPixels(bmp, W, H);

    // проходим в цикле по пикселам, рисуем градиент "наискосок"
    for(int y=0; y<H; y++)
        for(int x=0; x<W; x++)
            pPixels[x+y*W] = Gradient(col1, col2, x+y, W+H);

    // применяем массив цветов на Bitmap, выводим Bitmap в окно
    SetBitmapPixels(bmp, pPixels);
    pDC->DrawState(CPoint(0,0), CSize(W,H), &bmp, DST_BITMAP|DSS_NORMAL);
}

Функции GetBitmapPixels и SetBitmapPixels были подробно описаны в FAQ, вот в этой теме, а текст функции Gradient - предельно простой:
Цитата
COLORREF Gradient(COLORREF col1, COLORREF col2, int n, int nMax)
{
    float r1=(float)(col1&0xff), g1=(float)((col1>>8)&0xff), b1=(float)((col1>>16)&0xff);
    float r2=(float)(col2&0xff), g2=(float)((col2>>8)&0xff), b2=(float)((col2>>16)&0xff);

    float d = (float)n/(float)nMax;
    float newr = r1+(r2-r1)*d;
    float newg = g1+(g2-g1)*d;
    float newb = b1+(b2-b1)*d;

    return RGB((int)newr,(int)newg,(int)newb);
}

Полностью проект MFC, рисующий градиентный прямоугольник, можно скачать по ссылке:

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  Gradient.zip


--------------------
user posted image
PM MAIL WWW   Вверх
CBETA
Дата 14.4.2004, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 10.4.2004

Репутация: 1
Всего: 1



mr.DUDA
Работа с Bitmap как с массивом точек. Действительно просто, когда знаешь.
Кажется то что надо, Спасибо.
До остального дойду сама. (надеюсь)

PM MAIL   Вверх
CBETA
Дата 14.4.2004, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 10.4.2004

Репутация: 1
Всего: 1



mr.DUDA
А файлик то 0-oй длины
PM MAIL   Вверх
mr.DUDA
Дата 14.4.2004, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
А файлик то 0-oй длины

И в самом деле. Что-то глюкнуло, наверное...
Вот рабочий линк:

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  Gradient.zip


--------------------
user posted image
PM MAIL WWW   Вверх
mr.DUDA
Дата 14.4.2004, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Картинка получается такая:

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  screen_01.JPG


--------------------
user posted image
PM MAIL WWW   Вверх
CBETA
Дата 4.5.2004, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 10.4.2004

Репутация: 1
Всего: 1



Извиняюсь, что поднимаю старую тему,
но мне кажется что тут (вернее в FAQе) есть небольшая ошибка.
Функции:
COLORREF *GetBitmapPixels(CBitmap &Bmp, int &W, int &H);
void SetBitmapPixels(CBitmap &Bmp, COLORREF *pPixels);

Чтоб они работали с (COLORREF*) нужно переставлять байты у массива.
причем 2 раза, при Get.. и при Set.. (доп. время)

Или хотя-бы бы переписать вот так:
RGBQUAD *GetBitmapPixels(CBitmap &Bmp, int &W, int &H);
void SetBitmapPixels(CBitmap &Bmp, RGBQUAD *pPixels);

Если я не ошибаюсь, RGBQUAD не совсем COLORREF

из МСДН:
Цитата
RGBQUAD
typedef struct tagRGBQUAD {
  BYTE    rgbBlue;
  BYTE    rgbGreen;
  BYTE    rgbRed;
  BYTE    rgbReserved;
} RGBQUAD

Если переписать в том виде как храниться в памяти будет:
BB GG RR 00

Еще из МСДН:
Цитата
The COLORREF value is used to specify an RGB color.
typedef DWORD COLORREF;
Remarks
When specifying an explicit RGB color, the COLORREF value has the following
hexadecimal form: 0x00bbggrr

Если и это переписать в том же виде:
RR GG BB 00

Только ради бога, не ругайте слишком сильно если я не права.
Путаница с цветами. Запуталась совсем.

PM MAIL   Вверх
mr.DUDA
Дата 4.5.2004, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Thanks !!!

Тема в FAQ отредактирована. Ситуация с перестановкой цветов была решена вот так:
Цитата
struct DIBCOLOR
{
   
BYTE b;
   
BYTE g;
   
BYTE r;
   
BYTE reserved;
   
DIBCOLOR(BYTE ar,BYTE ag,BYTE ab):
   
r(ar), g(ag), b(ab), reserved(0) {}
   
operator DWORD() {return *reinterpret_cast<DWORD*>(this);}
};

Тогда вместо RGB и COLORREF-макросов можно использовать DIBCOLOR. Можно сравнивать между собой два DIBCOLOR-а.


--------------------
user posted image
PM MAIL WWW   Вверх
CBETA
Дата 5.5.2004, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 10.4.2004

Репутация: 1
Всего: 1



mr.DUDA
Замучаю до конца smile.gif
Конструктор:
DIBCOLOR(BYTE ar,BYTE ab,BYTE ag):
...
лучше переписать так
DIBCOLOR(BYTE ar,BYTE ag,BYTE ab):
...

Порядок следования R,G,B имхо, болле привычен.

PM MAIL   Вверх
mr.DUDA
Дата 5.5.2004, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Ну, СВЕТА, погоди ! adv/protest.gif

Исправил.


--------------------
user posted image
PM MAIL WWW   Вверх
AndyY
Дата 8.5.2004, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



Кстати - есть либа GDI+, в ней есть обработка антиалиасинг.
по умолчанию входит в XP, редистрибутивна (работает под 98 и 2000).
тяжелая, правда.


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1074 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.