Работа с графикой в си++
Пользователи, просматривающие топик: 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 задаются из файла. Помогите написать программу пожалуйста.
|
|
|
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
|
|
|
RE: Работа с графикой в си++ - 2007-11-13 00:45:24.606666
|
|
|
Jasmin
Сообщений: 2320
Оценки: 0
Присоединился: 2007-05-03 23:08:53.390000
|
Прикольная курсовая… В дипломе страниц много надеюсь? А то как пронесет, и подтереться нечем будет… quote:
ORIGINAL: BinZo ЗЫ советую использовать WINAPI ЫЫ не советую использовать WinAPI. Этим ты привязываешься к Мелкософту
|
|
|
RE: Работа с графикой в си++ - 2007-11-13 05:50:30.260000
|
|
|
PegasusX
Сообщений: 4
Оценки: 0
Присоединился: 2007-11-12 18:09:04.693333
|
Нет как решить уравнения и систему, я знаю. Просто не могу это реализовать именно в си. Никак не могу разобраться с системой координат и правильно нарисовать линии. Если есть у кого киньте плиз, справочник или книжку по графике в си++.
|
|
|
RE: Работа с графикой в си++ - 2007-11-13 11:33:00.903333
|
|
|
dj0nik
Сообщений: 103
Оценки: 0
Присоединился: 2007-06-21 17:48:32.633333
|
Начало координат в верхнем левом углу экрана, икс в право, игрик вниз, от этого и отталкивайся..
|
|
|
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 рулит.
|
|
|
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++, заранее благодарен..
|
|
|
RE: Работа с графикой в си++ - 2007-11-14 19:35:44.470000
|
|
|
Yashin
Сообщений: 964
Оценки: 0
Присоединился: 2007-05-09 20:18:01.153333
|
C чего ты взял, что она тебе нужна, гемороя не хватает что-ли? делай через WinApi. Функции тебе уже подсказали.
|
|
|
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. В теории так, на практике не знаю.
|
|
|
RE: Работа с графикой в си++ - 2007-11-14 21:13:54.413333
|
|
|
12yearsold_ksakep
Сообщений: 771
Оценки: 0
Присоединился: 2007-02-12 21:40:30.126666
|
quote:
Я скачал библиотеки Qt Open Source а как их поставить подскажите пожалста! ты с ума сошёл! рисовать надо через Xlib.
|
|
|
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
|
|
|
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. Просто тему не там запостил.
|
|
|
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->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->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>=0)
{
if (y11<=h)
MyDC.MoveTo(0,(int)(y11));
else
{
x1=(y11-h)/k1;
x11=x1;
y11=h;
MyDC.MoveTo((int)(x11),(int)(y11));
}
if (y12>=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>=0)
MyDC.MoveTo(0,(int)(y11));
else
{
x1=(y11)/k1;
x11=x1;
y11=0;
MyDC.MoveTo((int)(x11),(int)(y11));
}
if (y12<=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->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<=0)
{
if (y21>=0)
MyDC.MoveTo(0,(int)(y21));
else
{
x3=(y21)/k2;
x21=x3;
y21=0;
MyDC.MoveTo((int)(x21),(int)(y21));
}
if (y22<=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<=h)
MyDC.MoveTo(0,(int)(y21));
else
{
x3=(y21-h)/k2;
x21=x3;
y21=h;
MyDC.MoveTo((int)(x21),(int)(y21));
}
if (y22>=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;
}
|
|
|
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. зы. ах да, там в системе с плюсами/минусами стоит поиграться – ведь экранная система координат левая.
|
|
|
RE: Работа с графикой в си++ - 2007-12-08 22:01:44.426666
|
|
|
PegasusX
Сообщений: 4
Оценки: 0
Присоединился: 2007-11-12 18:09:04.693333
|
Я понял, но у меня вообще ни в какую не получается нарисовать эти линии, так чтоб после масштабирования точки пересечения, их пересечение тоже было видно.
|
|
|
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 и получить то что надо. Если не найдётся ни одной точки – значит что-то не то в формулах. и этт. в функции выделяй повторяющиеся куски… а то реально замучаешься читать что ты там понаписал.
|
|
|
|
|