KrL
Участник
Offline
|
|
« : 20-02-2009 20:31 » |
|
Задание: разработать программу, обеспечивающую изображение на экране дисплея определенного набора плоских и пространственнных геометрических фигур. Предусмотреть в программе возможности масштабирования фигур или их изображения по задаваемым размерам и построения 3-х проекций для определенной фигуры. Все предоставляемые услуги оформить в сервисное меню с библиотекой геометрических фигур.
Не знаю даже, с какой стороны подойти. Можно писать в борланд С++ (т.е. консоль), в билдере и визуале. Что лучше выбрать? Какие библиотеки лучше и проще использовать? Какие книги по теме посоветуете почитать? Язык Си изучаю только 2 семестр, т.е. знания еще не очень глубокие. Можно использовать С++, но будут лишние вопросы при сдаче.
|
|
« Последнее редактирование: 05-04-2009 15:57 от Ghost »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 20-02-2009 20:47 » |
|
Ну консоль сама собой исключается. Тебе все таки придется рисовать, а в тексте много не нарисуеш. Теперь вопрос по платформе MS-DOS или Windows? От этого будет зависеть выбор среды программирования и сами графические библиотеки. А насчет языка программирования. Можно использовать хоть что угодно, если нет специальных ограничений от препопадавателя. Если он сказал, что нельзя использовать ООП, то в принципе С++ исключается.
|
|
« Последнее редактирование: 20-02-2009 20:49 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
KrL
Участник
Offline
|
|
« Ответ #2 : 17-03-2009 13:00 » |
|
Решил рисовать через opengl.. подкиньте плз почитать) есть у кого исходники которые ресуют там треугольнички, пирамидки?
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #3 : 17-03-2009 13:43 » |
|
Сдается мне, что суть курсовика в "ручной" работе с графикой, а не по использованию библиотек. Научиться самому масштабировать, проецировать... вообще с графическими данными работать. Обычно курсовая работа дается, как закрепление и проверка знаний по изученному за эти два семестра курсу лекций. имхо. Вот вам лекции по каким-нибудь библиотекам читали? По какому курсу лекций-то курсач?
|
|
« Последнее редактирование: 17-03-2009 13:45 от PooH »
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
KrL
Участник
Offline
|
|
« Ответ #4 : 02-04-2009 18:09 » |
|
Ну есть задание, а как ты его выполнишь без разницы) старшекурник делал это задание через опенгл, но так и не доделал( По курсовой вобще ничего не объяснялось, Прото дали задание. Проходили циклы, указатели, рекурсии - все в этом роде) Препод даже не сказал че почитать можно. Лекции были ток по стандартным библиотекам, тип stdio.h conio.h итд Курс Си)
|
|
« Последнее редактирование: 02-04-2009 18:13 от KrL »
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #5 : 26-04-2009 14:09 » |
|
возникло 2 вопроса) как сделать менюшку в в вин32 приложении(в дос окне т.е.)? из нее будет выбираться фигурка. Дальше такая мысль. Сделать для каждой фигурки свой отдельный файл. конус.с пирамида.с итд. Из менюшки выбираешь фигуру и запускается файл как это реализовать?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #6 : 26-04-2009 16:49 » |
|
как сделать менюшку в в вин32 приложении(в дос окне т.е.)?
наверное, имеешь в виду не дос-окно, а консоль (иначе фраза без смысла) а сделать можно так - как обычно создаёшь объект меню CreatePopupMenu , наполняешь, вываливаешь через TrackPopupMenu (указав флажок TPM_RETURNCMD ) и то, что вернётся из функции TrackPopupMenu - будет ID выбранного пункта
|
|
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #7 : 01-05-2009 10:25 » |
|
А можно по-подробнее?)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #8 : 02-05-2009 05:16 » |
|
KrL, а где именно споткнулся ?
|
|
|
Записан
|
|
|
|
Astr
Гость
|
|
« Ответ #9 : 04-05-2009 09:43 » |
|
конус.с пирамида.с итд. Из менюшки выбираешь фигуру и запускается файл как это реализовать?
1.выбор верно,отдельным модулем/файлом.создание кнопок/пунктов меню проходили? вот и выбор. 2. по учебнику геометрии берешь нужную мат.функцию, от кликнутых координат в цикле находишь и тут же рисуешь каждую точку фигуры. 3. по клику мышки определи 2 (при n-мерной сколько необходимо) точки: углы -угольника,центр и точку окружности/овала. Или стартуй от первой выбранной, типа начальные значения окружности координаты центра 1й клик, радиус =1. При передвижении мыша радиус увеличивается. Прорисовку предыдущего контура стираешь цветом фона при предшествующих параметрах. Второй клик - выход из процедурки. Когда-то баловалась в DOSе на бесике, там вместо кликов все в клавишах с подсчетом передвижения курсора.
|
|
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #10 : 06-05-2009 17:46 » |
|
Алексей1153++, споткнулся на
создаёшь объект меню CreatePopupMenu
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #11 : 07-05-2009 05:16 » |
|
enum { e_Element1, e_Element2, e_Element3, e_Element4, };
HMENU hm=::CreatePopupMenu();
::AppendMenu(hm,MF_STRING,e_Element1,"текст №1"); ::AppendMenu(hm,MF_STRING,e_Element2,"текст №2"); ::AppendMenu(hm,MF_STRING,e_Element3,"текст №3"); ::AppendMenu(hm,MF_STRING,e_Element4,"текст №4");
int x=100; int y=100;
HWND win= ... ;//любое окно твоего приложения
switch(::TrackPopupMenu(hm,TPM_RETURNCMD|TPM_NONOTIFY|TPM_LEFTALIGN,x,y,0,win,0)) { case e_Element1: { ::MessageBox(0,"1",0,MB_SYSTEMMODAL); } break;
case e_Element2: { ::MessageBox(0,"2",0,MB_SYSTEMMODAL); } break;
case e_Element3: { ::MessageBox(0,"3",0,MB_SYSTEMMODAL); } break;
case e_Element4: { ::MessageBox(0,"4",0,MB_SYSTEMMODAL); } break; }
поскольку указаны флаги TPM_RETURNCMD|TPM_NONOTIFY, то win можно (и нужно, иначе меню не покажется) присвоить хендл любого окна твоего приложения
|
|
|
Записан
|
|
|
|
Astr
Гость
|
|
« Ответ #12 : 07-05-2009 07:32 » |
|
"Ребята, давайте жить дружно" Это ты кого мышами обозвал? Astr, я с Лёшей согласен в том, что твой первый пост оставляет некоторое недоумение... Попробовала дать отправную точку, вариант с чего начать, как можно делать подобное без использования библиотек. Похоже задание состоит в этом. А еще можно подойти к преподу и спросить чтоб тот конкретизировал что хочет. Может все что надо - как раз использовать "то, что давно придумали немцы".
|
|
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #13 : 09-05-2009 13:21 » |
|
Алексей1153++, А зачем двоеточия? Навыдавала кучу ошибок(( error C2061: syntax error : identifier 'hm' error C2059: syntax error : ';' error C2513: '/*global*/ ' : no variable declared before '=' error C2059: syntax error : ':' error C2059: syntax error : ':' error C2059: syntax error : ':' error C2059: syntax error : ':' error C2059: syntax error : ':' error C2061: syntax error : identifier 'win' error C2059: syntax error : ';' error C2513: '/*global*/ ' : no variable declared before '=' error C2065: 'hMenu' : undeclared identifier error C2059: syntax error : 'switch' Как определить хендл окна?) Astr, зачем все рисовать по точкам, когда есть уже готовые приметивы в OpenGL? Написал код для вывода 2-х фигур. Конус: #include <windows.h>
#include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> #include "stdlib.h" double R = 1, H = 2;
void CALLBACK Key_UP(void) { R = R + 0.2; H = H + 0.4; } void CALLBACK Key_DOWN(void) { R = R - 0.2; H = H - 0.4; } void DrawCone() { glPushMatrix(); // сохраняем текущие координаты glTranslated(0.1,0,0); // сдвигаемся в точку (2,0,0) glRotated(-75, 0.1,0,0); // поворачиваем систему координат glColor3d(0,1,0); auxWireCone(R, H); // рисуем конус glPopMatrix(); // возвращаемся к старым координатам }
void CALLBACK resize(int width,int height) { glViewport(0,0,width,height); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(-5,5, -5,5, 2,12); gluLookAt( 0,0,5, 0,0,0, 0,1,0 ); glMatrixMode( GL_MODELVIEW ); }
void CALLBACK display(void) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); DrawCone(); auxSwapBuffers(); }
void main() { float pos[4] = {3,3,3,1}; float dir[3] = {-1,-1,-1};
GLfloat mat_specular[] = {1,1,1,1};
auxInitPosition( 50, 10, 400, 400); auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE ); auxInitWindow( "Glaux Template" ); auxIdleFunc(display); auxReshapeFunc(resize);
auxKeyFunc(AUX_UP, Key_UP); auxKeyFunc(AUX_DOWN, Key_DOWN);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialf(GL_FRONT, GL_SHININESS, 128.0);
/* * Enter your cod here */ auxMainLoop(display); }
Куб: #include <windows.h>
#include <GL/gl.h> #include <GL/glu.h> #include <GL/glaux.h> #include "stdlib.h" double h = 2;
void CALLBACK Key_UP(void) { h = h + 0.4; } void CALLBACK Key_DOWN(void) { h = h - 0.4; } void DrawCube() { glPushMatrix(); // сохраняем текущие координаты glTranslated(0.1,0,0); // сдвигаемся в точку (2,0,0) glRotated(-75, 0.1,0,0); // поворачиваем систему координат glColor3d(0,1,0); auxWireCube(h); // рисуем glPopMatrix(); // возвращаемся к старым координатам }
void CALLBACK resize(int width,int height) { glViewport(0,0,width,height); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(-5,5, -5,5, 2,12); gluLookAt( 0,0,5, 0,0,0, 0,1,0 ); glMatrixMode( GL_MODELVIEW ); }
void CALLBACK display(void) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); DrawCube(); auxSwapBuffers(); }
void main() { float pos[4] = {3,3,3,1}; float dir[3] = {-1,-1,-1};
GLfloat mat_specular[] = {1,1,1,1};
auxInitPosition( 50, 10, 400, 400); auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE ); auxInitWindow( "Glaux Template" ); auxIdleFunc(display); auxReshapeFunc(resize);
auxKeyFunc(AUX_UP, Key_UP); auxKeyFunc(AUX_DOWN, Key_DOWN);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialf(GL_FRONT, GL_SHININESS, 128.0);
/* * Enter your cod here */ auxMainLoop(display); } Названия файлов cone.c u cube.c Можете объяснить на примере как сделать выбор между ними?)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #14 : 09-05-2009 13:27 » |
|
KrL, насчёт ошибок - не знаю, почему, я проверял код.
двойное двоеточие - это обращение к глобальному варианту функции (можешь и убрать)
|
|
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #15 : 09-05-2009 15:00 » |
|
Ошибки могут быть из-за среды написания(визуал студио 2005)? надо определять тип hm? Надо какие-то хидеры\либы подключать? функция main() нужна? Какую функцию из нее вызывать? и где можно почитать про это все)) Есть 2 книжки для начинающих в них не слова(
|
|
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #16 : 11-05-2009 11:41 » |
|
Народ помогите) в субботу уже сдавать, мне только с меню осталось разобраться.. Я плохо понимаю что для чего и как должно быть.. Объясните плз на примере
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #17 : 11-05-2009 12:20 » |
|
KrL, давай разберёмся. 1. По заданию, использовать OpenGL - допустимо? Если да, то: 2. Как так получается, что OpenGL используешь, а на уровне проекта с исходниками не выходит работать? Лично у меня уже вопрос функция main() нужна? рождает много встречных вопросов, связанных с глубиной твоего владения C++. Просто одно дело, если это лабораторная работа на 1м курсе, несколько иное - курсовик курсе на 2м, ну и так далее. Уровень твоих знаний предполагается разный, отсюда и решения могут быть различные.
|
|
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #18 : 11-05-2009 13:01 » |
|
OpenGL используется на уровне копи-паст) Прочитал учебник, нашел что для чего, немного подправил исходники под мою задачу знаю только основы Си(массивы,циклы, итерации, указатели итд). С main лоханулся) С++ вобще не знаю. Но использовать можно если сможешь объяснить Я на 1-м курсе. По курсовику ниче не объясняют или в 2-х словах. З.Ы. Как определить хендл окна моего приложения?
|
|
|
Записан
|
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #20 : 15-05-2009 15:47 » |
|
\menu.cpp(18) : error C2664: 'AppendMenuW' : cannot convert parameter 4 from 'const char [9]' to 'LPCWSTR' error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [2]' to 'LPCWSTR' 1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast Таких ошибок по 4 штуки выводит, как исправить? Могли бы и сказать что windows.h надо подключать.... Как хидер окна определять? я такие вещи никогда не делал(( Объясните плз, завтра уже надо сдавать
З.Ы. С ошибками разобрался, там в юникоде дело было.. вопрос с хидером остался
|
|
« Последнее редактирование: 15-05-2009 17:01 от KrL »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #21 : 15-05-2009 19:34 » |
|
Хидер? Может, handle (дескриптор)? Что ты конкретно хочешь сделать (что собираешься делать с хендлом) и в какой ситуации? Создаётся ощущение, что задача, возможно, была сначала несколько проще.
|
|
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #22 : 15-05-2009 19:53 » |
|
Да хендл) Для меню надо enum { e_Element1, e_Element2, e_Element3, e_Element4, };
HMENU hm=::CreatePopupMenu();
::AppendMenu(hm,MF_STRING,e_Element1,"текст №1"); ::AppendMenu(hm,MF_STRING,e_Element2,"текст №2"); ::AppendMenu(hm,MF_STRING,e_Element3,"текст №3"); ::AppendMenu(hm,MF_STRING,e_Element4,"текст №4");
int x=100; int y=100;
HWND win= ... ;//любое окно твоего приложения
switch(::TrackPopupMenu(hm,TPM_RETURNCMD|TPM_NONOTIFY|TPM_LEFTALIGN,x,y,0,win,0)) { case e_Element1: { ::MessageBox(0,"1",0,MB_SYSTEMMODAL); } break;
case e_Element2: { ::MessageBox(0,"2",0,MB_SYSTEMMODAL); } break;
case e_Element3: { ::MessageBox(0,"3",0,MB_SYSTEMMODAL); } break;
case e_Element4: { ::MessageBox(0,"4",0,MB_SYSTEMMODAL); } break; } Или напиши как по-другому можно)
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #23 : 15-05-2009 20:18 » |
|
Ну, телепаты перманентно в отпуске. Если у тебя приложение оконное - то надо думать, ты должен это меню не просто так из воздуха создавать, а по какому-то действию (правому клику, что ли, раз оно у тебя Popup). Соответственно, действие это совершается над окном, и там уже хэндл этого окна должен быть где-то рядом (либо в качестве параметра передаётся в обработчик события, либо ещё как - тут уж у меня ясновидения не хватает).
|
|
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #24 : 15-05-2009 20:28 » |
|
Блин.. Ссыль на проект давал выше, эту менюшку написал мне алексей, какое приложение тоже писал... В общем еще раз) Есть несколько cpp файлов. Каждый используется для вывода своей геометрической фигуры. Нужно организовать любую менюшку чтобы запускался необходимый cpp. Приложение win 32 console application пишу в визуал студио 2005. Фигуры выводятся с помощью OpenGL. Т.е создается новое окно, в нем фигурка. Фигурки клепал по учебнику тарасова http://www.opengl.org.ru/books/open_gl/
|
|
« Последнее редактирование: 15-05-2009 20:31 от KrL »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #25 : 15-05-2009 20:32 » |
|
win 32 console application и графика - такое возможно?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
KrL
Участник
Offline
|
|
« Ответ #26 : 15-05-2009 20:36 » |
|
Блин да елки палки) вот кусок курсовой откомпилированный, мне над сделать выбор между такими
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #27 : 15-05-2009 20:39 » |
|
win 32 console application и графика - такое возможно? Сам не пробовал, но говорили, что можно достать handle окна CMD и, соответственно, рисовать в нём.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Вад
|
|
« Ответ #28 : 15-05-2009 20:44 » |
|
Вот и у меня крайнее недоумение оставляет сочетание графики и меню, с одной стороны, и консольного приложения, с другой. Не поленился, сходил, посмотрел. auxInitWindow - вот это что? Всё, что дальше, надо полагать, не консольное. То есть, консольным приложение можно считать очень условно. На самом деле, откомпилированный кусок курсовой и проект в целом мне почти ничего не даёт, поскольку я сижу под линуксом, и визуалки тут нэма.
|
|
|
Записан
|
|
|
|
KrL
Участник
Offline
|
|
« Ответ #29 : 15-05-2009 20:53 » |
|
Так... создаем срр файл menu.cpp. Он консольный. Там пофиг какую менюшку.. Там будут строчки конус, сфера и так далее. Клавишами или мышкой выбирать мне без разницы. Дальше запускается файл sphere.cpp или cone.cpp в зависимости от выбора. Так можно сделать? как?
З.Ы. я писал выше код фигур, OpenGL же кроссплатформенный))
|
|
|
Записан
|
|
|
|
|