Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > 2-D Графика средствами WinAPI (ну или MFC) |
Автор: CBETA 12.4.2004, 02:14 |
Как провести сглаженную прямую, окружность, многоугольник? Не знаю как это называют профи, поэтому попытаюсь объяснить что я подразумеваю под термином "сглаженная" Например: (условный код) MoveTo(0,0); LineTo(10,1); Линия будет нарисована со ступенькой вроде этого: -----_____ Если же такую линию провести например в Фотошопе то она будет смотреться на много изящнее. Изобразить здесь не смогу. (в общем это нужно видеть.) Возможно ли элегантное решение данной проблемы? Писать самой функции вывода графических примитивов - прямой, эллипса, и т.д.? Не представляю как. Попиксельный вывод - крайне медленно. Возможны ли какие-то другие решения? |
Автор: chipset 12.4.2004, 05:27 |
В фотошопе используется метод антиалиасинга то есть пиксель немного расплывается, и высчитывается состояние отдельных клеток по X или + образному методе. Подробнее об антиалиасинге читай вот http://www.mycomp.com.ua/article.php?id=3753 . А насчёт GDI-ных функций, то ИМХО для нормального проекта GDI сильно тормознутый... Лучше заюзать DirectX или OpenGL, в иксе скорее всего и есть такии функции но точно не могу сказать... Удачи! |
Автор: achmed 12.4.2004, 16:14 |
ну наверное стоит поискать готовые MFCшные классы, реализующие эту функциональность, где-нибудь на codeproject.com, codeguru.com/ |
Автор: Coocky 12.4.2004, 20:13 | ||
Это не есть задачи МФС.По крайней мере функций таких не встречал.Для этого есть библиотеки Opena и Directa.Кстати под этими библиотеками прекрасно работает видеокарта,(если поставить настройки ![]() ![]() ![]() |
Автор: CBETA 13.4.2004, 02:07 |
chipset[b] [b]Coocky Фокус с картой не пройдет. Условия варварские ![]() Проект должен работать на любой машине, начиная с 486 и Win95. По этой же причине видимо Open и Direct отпадают. Не поставлять же этих монстров вместе с прогой. А на Win95 какой там был директ, и был ли вообще? На самом деле экстра быстродействия не требуется. Думаю вполне достаточно быстродействия GDI. Если честно, просто не хочется изобретать велосипед. achmed Поискать попробую, хотя мне почему-то никогда не удается найти именно то что нужно. (Видимо искать не умею.) И еще вопросик по теме: Как сделать градиентную заливку прямоугольника средствами GDI? Приходит в голову что-то вроде бесконечного создания и удаления кистей разных оттенков. Писать еще не пробовала, но должно выглядеть ну очень забавно. ![]() |
Автор: mr.DUDA 13.4.2004, 15:14 | ||||||
На самом деле всё гораздо проще ![]()
Функции GetBitmapPixels и SetBitmapPixels были подробно описаны в FAQ, вот в http://forum.vingrad.ru/index.php?showtopic=17344&view=findpost&p=116315, а текст функции Gradient - предельно простой:
Полностью проект MFC, рисующий градиентный прямоугольник, можно скачать по ссылке: |
Автор: CBETA 14.4.2004, 02:12 |
mr.DUDA Работа с Bitmap как с массивом точек. Действительно просто, когда знаешь. Кажется то что надо, Спасибо. До остального дойду сама. (надеюсь) |
Автор: CBETA 14.4.2004, 02:38 |
mr.DUDA А файлик то 0-oй длины |
Автор: mr.DUDA 14.4.2004, 09:31 | ||
И в самом деле. Что-то глюкнуло, наверное... Вот рабочий линк: |
Автор: mr.DUDA 14.4.2004, 09:34 |
Картинка получается такая: |
Автор: CBETA 4.5.2004, 02:28 | ||||
Извиняюсь, что поднимаю старую тему, но мне кажется что тут (вернее в 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 из МСДН:
Если переписать в том виде как храниться в памяти будет: BB GG RR 00 Еще из МСДН:
Если и это переписать в том же виде: RR GG BB 00 Только ради бога, не ругайте слишком сильно если я не права. Путаница с цветами. Запуталась совсем. |
Автор: mr.DUDA 4.5.2004, 09:23 | ||
Thanks !!! Тема в FAQ отредактирована. Ситуация с перестановкой цветов была решена вот так:
Тогда вместо RGB и COLORREF-макросов можно использовать DIBCOLOR. Можно сравнивать между собой два DIBCOLOR-а. |
Автор: CBETA 5.5.2004, 02:52 |
mr.DUDA Замучаю до конца ![]() Конструктор: DIBCOLOR(BYTE ar,BYTE ab,BYTE ag): ... лучше переписать так DIBCOLOR(BYTE ar,BYTE ag,BYTE ab): ... Порядок следования R,G,B имхо, болле привычен. |
Автор: mr.DUDA 5.5.2004, 13:16 |
Ну, СВЕТА, погоди ! ![]() Исправил. |
Автор: AndyY 8.5.2004, 12:25 |
Кстати - есть либа GDI+, в ней есть обработка антиалиасинг. по умолчанию входит в XP, редистрибутивна (работает под 98 и 2000). тяжелая, правда. |
Автор: Alex B@D 8.5.2004, 17:59 |
Простите я пОООлный ламер (пока еще )![]() И хочу узнать почему делфовский канвас(Canvas)в С++ BUILDER не пашет???? |
Автор: shara 29.6.2004, 03:20 |
если комуто интересно - то я могу прислать код проги которая гладкой кривой соеденяет точки по методу B-Spline. Просто мне прогу набирать что-то совсем не хочется ![]() |