Консультация № 60793
31.10.2006, 18:02
0.00 руб.
0 5 4
Доброго времени суток уважаемые эксперты. На языке С нужно изобразить развевающийся на ветру флаг РФ.Может кто-нибудь подкинет инфы как это сделать или хотябы информацию на решение задачь похожего типа.

Обсуждение

Неизвестный
31.10.2006, 18:21
общий
это ответ
Здравствуйте, Respect!

Здесь есть пример такой задачи на С++ с использованием OpenGL:
http://prometey.fatal.ru/prog/inf/c/copengl.zip.
Неизвестный
31.10.2006, 19:16
общий
вообще видел решение этой задачи на паскале (в какой-то книге), но т.к. это было ооочень давно, то не вспомню где...суть:флаг рисуется как отдельные точки (или области точек) расположенные на относительном расстоянии друг от друга, при чем рисуется по синусоиде, и по таймеру перерисовывается, т.е. изменяется начальное смещение-- вроде y = A * sin(B*t + C*x) // t - начальное смещение, и оно изменяется на каждой итерации (ну а как его на три равные области разделить и раскрашивать их разными цветами думаю не проблема)
Неизвестный
31.10.2006, 19:21
общий
это ответ
Здравствуйте, Respect!

Есть пример на Turbo C.
Только флаг Великобритании, но переделать в РФ,
в принципе, легко, цвета совпадают.

Но еще там надписи левые.
Вообще-то проект довольно сложный, я бы не рискнул его
переделывать.

Ссылка будет действительна в течение недели.
07.11.2006 я ее удалю.
http://www.loopwise.com/looksurf/uploads/john_paramol_1162311191.zip
Неизвестный
31.10.2006, 23:48
общий
это ответ
Здравствуйте, Respect!
Для этой задачи совсем не обязательно юзать OpenGl или DirectX.
Подробно расписать как это сделать сейчас не смогу, так как нету установленого на машине C++, но идею подать - легко.
Проще всего - с помощью синусоиды, положение которой зависит от времени прошедшего со старта программы (косинус ни чем не хуже).
Напушу только часть кода, и то примерно.

Итак, постоянно (в цикле while(true){...}) выполняем приведённый код. цикл по n - рисуем по одной строке пикселов для каждой полосы флага. Цикл по j - двигаемся по строке пикселов

Тут чистая математика. Надеюсь, у вас с ней всё хорошо.

Приложение:
//Bmp - что-нибудь для отображения графики на экране//Bmp[i][j] - пиксель i-й строки с номером jwhile(true){time=...//время после запуска программы в секундахfor(int n=0; n<Height; n++) //Height - высота одной полосы флага{for(int j=Start; j<End; j++) //Start - столбец, с которого начинаем рисовать (вполне прокатит 0), End - столбец до которого рисуем (ну 100 например){ i=sin((float)j/30.0f+Time); Bmp[i][j]=UpColor; Bmp[i+Height][j]=MiddleColor; Bmp[i+2*Height][j]=BottomColor;//UpColor - цвет верхней полосы флага, Middle... и Bottom... - средней и нижней. Дико извиняюсь но цветов флага России не помню. Знаю только родные украинские :)}}}
Неизвестный
01.11.2006, 13:31
общий
это ответ
Здравствуйте, Respect!

Для решения задач анимации достаточо исрользовать GDI: 2 контекста устройства, и растровую операцию XOR. Пример в приложении.

Но можно также использовоть библиотеку OpenGL,
инфу по которой можно закачать по адресу http://wasm.ru/docs/9/OpenGLbyTylerDurden.zip,
либо воспользоваться

P.S. Приведенный ниже код являеться шаблоном организующий логику анимации с истользованием двойной буферизации, код урезан и отображает только функцию смены кадров.

Надеюсь это Вам поможет!
Удачи!!!!!!!!:)))))))))



Приложение:
void DrowProc(CDC* pDC1){ int nFrames; CBitmap arr_bmpFrames[nFrames];// массив BITMAP изображений InitFrames(arr_bmpFrames, nFrames);//заполнеие массива CDC* pDC2; //виполняет роль 2-го буфера pDC2->CreateCompatibleDC(pDC1); for(int i=0; i<nFrames; i++) { if(i!=0)// Инвертирует предыдуший кадр pDC1->BitBlt(0,0,iWidht,iHeigth,pDC2,0,0,SRCINVERT); pDC2->SelectObject(&(arr_bmpFrames[i])); pDC1->BitBlt(0,0,iWidht,iHeigth,pDC2,0,0,SRCCOPY); Sleep(60000/25); }}
Форма ответа