Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Работа с графикой в си++

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Работа с графикой в си++
Имя
Сообщение << Старые топики   Новые топики >>
Работа с графикой в си++ - 2007-11-12 19:21:19.573333   
PegasusX

Сообщений: 4
Оценки: 0
Присоединился: 2007-11-12 18:09:04.693333
Всем привет. Есть такое задание курсовой - Разработать программу для определения координат точки пересечения двух прямых и построения их графиков с осями координат. Коэффициенты уравнений прямых считывать из файла, указанного пользователем.
Программирую в 6-м вижуале.
На MFC создал picture окно, еле разобрался как нарисовать координатную сетку.
Но никак не могу понять как рисовать прямые(и как разобраться с координатами). Я так понимаю это должны быть касательные y=kx+b, где k,b задаются из файла.
Помогите написать программу пожалуйста.
Post #: 1
RE: Работа с графикой в си++ - 2007-11-13 00:08:24.780000   
BinZo

Сообщений: 230
Оценки: 0
Присоединился: 2006-12-02 20:29:14.373333
А что сложного? Считываешь коэффициенты, составляешь систему уравнений
y=k1x+b1
y=k2x+b2
Отсюда находишь x и y - координаты пересечения
Что же насчет рисования - погугли.
ЗЫ советую использовать WINAPI
Post #: 2
RE: Работа с графикой в си++ - 2007-11-13 00:45:24.606666   
Jasmin

Сообщений: 2320
Оценки: 0
Присоединился: 2007-05-03 23:08:53.390000
Прикольная курсовая… В дипломе страниц много надеюсь? А то как пронесет, и подтереться нечем будет…

quote:

ORIGINAL: BinZo
ЗЫ советую использовать WINAPI


ЫЫ не советую использовать WinAPI. Этим ты привязываешься к Мелкософту
Post #: 3
RE: Работа с графикой в си++ - 2007-11-13 05:50:30.260000   
PegasusX

Сообщений: 4
Оценки: 0
Присоединился: 2007-11-12 18:09:04.693333
Нет как решить уравнения и систему, я знаю. Просто не могу это реализовать именно в си. Никак не могу разобраться с системой координат и правильно нарисовать линии.
Если есть у кого киньте плиз, справочник или книжку по графике в си++.
Post #: 4
RE: Работа с графикой в си++ - 2007-11-13 11:33:00.903333   
dj0nik

Сообщений: 103
Оценки: 0
Присоединился: 2007-06-21 17:48:32.633333
Начало координат в верхнем левом углу экрана, икс в право, игрик вниз, от этого и отталкивайся..
Post #: 5
RE: Работа с графикой в си++ - 2007-11-13 12:29:24.686666   
BinZo

Сообщений: 230
Оценки: 0
Присоединился: 2006-12-02 20:29:14.373333
quote:


книжку по графике в си++

Погугли WINAPI-функции GetDC, MoveTo, LineTo и т.д. Информации полно и без книг
quote:


не советую использовать WinAPI

Qt рулит.
Post #: 6
RE: Работа с графикой в си++ - 2007-11-14 16:33:04.840000   
dj0nik

Сообщений: 103
Оценки: 0
Присоединился: 2007-06-21 17:48:32.633333
to BinZo: Я скачал библиотеки Qt Open Source а как их поставить подскажите пожалста! компил Dev-C++, заранее благодарен..
Post #: 7
RE: Работа с графикой в си++ - 2007-11-14 19:35:44.470000   
Yashin

Сообщений: 964
Оценки: 0
Присоединился: 2007-05-09 20:18:01.153333
C чего ты взял, что она тебе нужна, гемороя не хватает что-ли? делай через WinApi. Функции тебе уже подсказали.
Post #: 8
RE: Работа с графикой в си++ - 2007-11-14 21:08:45.330000   
BinZo

Сообщений: 230
Оценки: 0
Присоединился: 2006-12-02 20:29:14.373333
2dj0nk: На винду не ставил, не знаю. Там по-идеи должен быть "install.exe", при запуске которого устанавливается компилятор MinGW, Designer и Assistant. После установки в меню Пуск должен появиться ярлык "Command Promt". При запуске появится окно консоли, в котором ты и будишь использовать qmake и make. В теории так, на практике не знаю.
Post #: 9
RE: Работа с графикой в си++ - 2007-11-14 21:13:54.413333   
12yearsold_ksakep

Сообщений: 771
Оценки: 0
Присоединился: 2007-02-12 21:40:30.126666
quote:

Я скачал библиотеки Qt Open Source а как их поставить подскажите пожалста!

ты с ума сошёл! рисовать надо через Xlib.
Post #: 10
RE: Работа с графикой в си++ - 2007-11-15 10:44:21.656666   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
quote:

ORIGINAL: PegasusX

Всем привет. Есть такое задание курсовой - Разработать программу для определения координат точки пересечения двух прямых и построения их графиков с осями координат. Коэффициенты уравнений прямых считывать из файла, указанного пользователем.
Программирую в 6-м вижуале.
На MFC создал picture окно, еле разобрался как нарисовать координатную сетку.
Но никак не могу понять как рисовать прямые(и как разобраться с координатами). Я так понимаю это должны быть касательные y=kx+b, где k,b задаются из файла.
Помогите написать программу пожалуйста.


По моему OpenGL попроще будет - простой пример тут

http://www.gmonline.demon.co.uk/cscene/CS5/CS5-03.html
Post #: 11
RE: Работа с графикой в си++ - 2007-11-15 21:39:19.430000   
BinZo

Сообщений: 230
Оценки: 0
Присоединился: 2006-12-02 20:29:14.373333

quote:

ORIGINAL: 12yearsold_ksakep

quote:

Я скачал библиотеки Qt Open Source а как их поставить подскажите пожалста!

ты с ума сошёл! рисовать надо через Xlib.

Я конечно согласен, но ИМХО он не собирался рисовать в Qt. Просто тему не там запостил.
Post #: 12
RE: Работа с графикой в си++ - 2007-12-08 19:08:36.800000   
PegasusX

Сообщений: 4
Оценки: 0
Присоединился: 2007-11-12 18:09:04.693333
Снова всем привет.
Мне очень нужен совет или помощь.
Значит я нарисовал линии, сделал ограничение и тд. Но у меня есть проблема - иногда при некоторых значениях точка пересечения находится вне экрана рисования, препод сказал сделай масштабирование, но вот тут то я и чтото тормознул.
У меня экран рисования - 400*400 пикс.Уравнения линий находятся так - линия 1-
y11=k1*(-200)-b1+200
y12=k1*(200)-b1+200, вторая линия также. Т.е. они рисуются относительно точки 0.0(при значениях х(-200.200)), а потом смещаются в точку 200.200
Потом линии рисуются при х относительно начальной координаты (200.200) - т.е. от 0 до 400.
выглядит это так MoveTo(0,y11) LineTo(400,y12).
Я так понимаю что масштабирование нужно делать делив все переменные на определенный коэффициент. Но при делении уравнений прямых, сами уравнения смещаются к верхней границе экрана, т.к. там у нас у=0. А вот как сделать так чтобы прямая сместилась к центру т.к. реальный у=0 там должен быть, ума не приложу.
И при этом еще как то надо разметить ось координат, чтобы при масштабировании менялась разметка.
Помогите пожалуйста сделать масштабирование! Вот код проги если что:

bool line1=0,line2=0,get_inf=0,coordin=0; float k1,k2,b1,b2; int w, h; void CKursDlg::OnButton1() //Рисование сетки координат { CClientDC MyDC(GetDlgItem(IDC_STATIC1)); CRect line; CWnd *pWnd = MyDC.GetWindow(); pWnd-&gt;GetClientRect( &line ); MyDC.FillSolidRect(&line, RGB(255,255,255)); w = line.Width(); h = line.Height(); MyDC.MoveTo(w/2,0); MyDC.LineTo(w/2,h); MyDC.MoveTo(0,h/2); MyDC.LineTo(w,h/2); MyDC.MoveTo(w/2,0); MyDC.LineTo(w/2-5,10); MyDC.MoveTo(w/2,0); MyDC.LineTo(w/2+5,10); MyDC.MoveTo(w,h/2); MyDC.LineTo(w-10,h/2-5); MyDC.MoveTo(w,h/2); MyDC.LineTo(w-10,h/2+5); MyDC.MoveTo(w/2-3,h/2-100); MyDC.LineTo(w/2+4,h/2-100); MyDC.MoveTo(w/2+100,h/2-3); MyDC.LineTo(w/2+100,h/2+4); coordin=1; } void CKursDlg::OnButton2() //Рисование первой линии { CClientDC MyDC(GetDlgItem(IDC_STATIC1)); CRect line; CWnd *pWnd = MyDC.GetWindow(); pWnd-&gt;GetClientRect(&line); float y11,y12,x11,x12,x1,x2; w = line.Width(); h = line.Height(); if (get_inf==1 && coordin==1) {y11=k1*(w/2)-b1+h/2; y12=k1*(-w/2)-b1+h/2; line1=1;} else { MessageBox("Не введены коэффициенты или не построена система координат!"); return; } if (k1&gt;=0) { if (y11&lt;=h) MyDC.MoveTo(0,(int)(y11)); else { x1=(y11-h)/k1; x11=x1; y11=h; MyDC.MoveTo((int)(x11),(int)(y11)); } if (y12&gt;=0) MyDC.LineTo(w,(int)(y12)); else { x2=((-1)*y12)/k1; x12=w-x2; y12=0; MyDC.LineTo((int)(x12),(int)(y12)); } } else {if (y11&gt;=0) MyDC.MoveTo(0,(int)(y11)); else { x1=(y11)/k1; x11=x1; y11=0; MyDC.MoveTo((int)(x11),(int)(y11)); } if (y12&lt;=h) MyDC.LineTo(w,(int)(y12)); else { x2=(y12-h)/k1; x12=w+x2; y12=h; MyDC.LineTo((int)(x12),(int)(y12)); } } } void CKursDlg::OnButton3() //Рисование второй линии { CClientDC MyDC(GetDlgItem(IDC_STATIC1)); CRect line; CWnd *pWnd = MyDC.GetWindow(); pWnd-&gt;GetClientRect( &line ); float y21,y22,x21,x22,x3,x4; w = line.Width(); h = line.Height(); if (get_inf==1 && coordin==1) {y21=k2*(w/2)-b2+h/2; y22=k2*(-w/2)-b2+h/2; line2=1;} else { MessageBox("Не введены коэффициенты или не построена система координат!"); return; } if (k2&lt;=0) { if (y21&gt;=0) MyDC.MoveTo(0,(int)(y21)); else { x3=(y21)/k2; x21=x3; y21=0; MyDC.MoveTo((int)(x21),(int)(y21)); } if (y22&lt;=h) MyDC.LineTo(w,(int)(y22)); else { x4=(y22-h)/k2; x22=w+x4; y22=h; MyDC.LineTo((int)(x22),(int)(y22)); } } else { if (y21&lt;=h) MyDC.MoveTo(0,(int)(y21)); else { x3=(y21-h)/k2; x21=x3; y21=h; MyDC.MoveTo((int)(x21),(int)(y21)); } if (y22&gt;=0) MyDC.LineTo(w,(int)(y22)); else { x4=((-1)*y22)/k2; x22=w-x4; y22=0; MyDC.LineTo((int)(x22),(int)(y22)); } } } void CKursDlg::OnButton4() //Нахождение точки пересечения { float x,y; x=((b2-b1)/(k1-k2)); y=k1*x+b1; if (line1==1 && line2==1 && get_inf==1) { m_point.Format(" (%4.1f ; %4.1f)",x,y); UpdateData(0); } } void CKursDlg::OnButton5() //Считывание коэффициентов с файла { char str [25]; CFileDialog fd(TRUE, ".txt", "input_d.txt", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT); fd.DoModal(); CFile txt( fd.GetPathName(), CFile::modeRead ); txt.SeekToBegin(); txt.Read(str, 20); sscanf(str,"%f%f%f%f",&k1,&b1,&k2,&b2); m_fact.Format("k1= %2.0f; b1= %2.0f; k2= %2.0f; b2= %2.0f;",k1,b1,k2,b2); UpdateData(0); get_inf=1; }
Post #: 13
RE: Работа с графикой в си++ - 2007-12-08 20:18:54.920000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
экранные координаты считаем так:
x_э = k*x + x_0
y_э = k*y + y_0
точка x_0, y_0 – это экранные координаты начала координат, то есть точка в которую отобразиться точка (0, 0). В твоей ситуации, быть может стоит их считать подставив в эту систему (x,y) == точке пересечения прямых, а (x_э, у_э) == координатам пикселя в который эта точка должна отобразиться. коэффициент, в данной ситуации, несущественен, тк прямая сколько её не сжимай и не растягивай останется той же прямой. Хотя может быть хочется чтобы единичный отрезок был бы больше пикселя, тогда стоит взять k равным, скажем 100.

зы. ах да, там в системе с плюсами/минусами стоит поиграться – ведь экранная система координат левая.
Post #: 14
RE: Работа с графикой в си++ - 2007-12-08 22:01:44.426666   
PegasusX

Сообщений: 4
Оценки: 0
Присоединился: 2007-11-12 18:09:04.693333
Я понял, но у меня вообще ни в какую не получается нарисовать эти линии, так чтоб после масштабирования точки пересечения, их пересечение тоже было видно.
Post #: 15
RE: Работа с графикой в си++ - 2007-12-09 03:46:53.980000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
да блин. я не буду ковыряться в твоём коде. В основном из-за того, что мне не удастся скомпилировать это дело и изучить в отладчике, тк в линухе твоё творение запустить можно только после танцев с бубном вокруг mfc.
делаешь так: пишешь функции которые будут считать экранные координаты по нашим внутреннимint screen_x (float x) { return x * k + x_0; } int screen_y (float y) { return -y * k + y_0; } и ещё две обратные функции, которые будут считать внутренние координаты по экранным. при этом k, x_0, y_0 объявляешь глобальными переменными.

потом берёшь системку которую я написал (с учётом постскриптума в посте). решаешь её относительно x_0, y_0. пишешь функцию, которая по x_э, y_э, k, x, y, будет высчитывать x_0, y_0 и складывать их в одноимённые глобальные переменные (пускай она называется calc_x0y0). После этого пишешь функцию, которая аналитически найдёт точку пересечения прямых и вызываешь calc_x0y0 с аргументами: x_э, y_э – экранные координаты точки, где ты хочешь увидеть пересечение прямых, k = 100, x, y – высчитанные координаты точки пересечения.

теперь рисование прямых. я для одной прямой разберу. вторая аналогично. Итак y = a*x + b;
берём экранную координату x=0 и переводим её в координаты внутренние X = (0 - x_0)/k; теперь подставляем в уравнение прямой этот самый X, получаем y = a*X+b; то есть высчитываем некий Y, этот Y переводим в экранные координаты, получим число y. Вместе с x=0, получим точку (0, y) в экранных координатах. Геометрический смысл этой точки – это пересечение той самой прямой с левой границей окна. тут возможны две ситуации:
y < 0 || y > h – это значит что пересечение происходит выше или ниже окна
y > 0 && y < h – это значит что мы нашли ту точку на прямой с которой стоит начать рисовать.
аналогично можно проверить на пересечение с прямой все границы окна. Если это сделать то найдутся две точки которые надо передать функции draw_line и получить то что надо. Если не найдётся ни одной точки – значит что-то не то в формулах.

и этт. в функции выделяй повторяющиеся куски… а то реально замучаешься читать что ты там понаписал.
Post #: 16
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Работа с графикой в си++







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.