Тут ви можете виконати завдання чи задати питання по змiсту цього уроку.
Артур (Roker17) 2010-12-13 18:27:15
1) При роботі з комп'ютерною графікою доводиться мати справу з двома системами координат. Перша система - це система координат пристрою (або екранна система координат). Координатами крапки в цій системі є номер піксела в рядку X і номер рядка пікселів Y: 0 <= X <= Xmax 0 <= Y <= Ymax Початок координат розташовано в лівому верхньому кутку екрану. Параметри екранної системи координат (максимальне число пікселів в рядку Xmax та максимальне число рядків пікселів Ymax) залежать від типу монітора, відеоадаптера та поточного графічного режиму. Таким чином, ця система координат певним чином пов'язана з конкретним графічним пристроєм і режимами його роботи. Друга система координат - так звана світова або математична. Вона являє собою декартову систему (х, у), яка визначається програмістом, і є незалежною від конкретного графічного пристрою: xmin < x < xmax ymin < y < ymax Параметри, якими задаються діапазони зміни X і Y (Xmin, Ymin, Xmax, Ymax), визначають прямокутну область в математичному двовимірному просторі. Ці параметри залежать тільки від конкретного завдання. Світові координати і координати пристрої зв'язані між собою простими співвідношеннями:{не вдалось вставити зображення} Для того, щоб кожен раз, коли виникає необхідність у перетворенні координат з однієї системи в іншу, не писати ці вирази, зручно оформити обчислення X і Y у вигляді функцій. Наприклад: var xmin, xmax, ymin, ymax : real; function Xs( x:real ):longint; begin Xs := round( getmaxX * (x-xmin)/(xmax-xmin) ); end; function Ys( y:real ):longint; begin Ys := round( getmaxY * (1-(y-ymin)/(ymax-ymin)) ); end; |
БОДНАР ОЛЕКСАНДР СЕРГІЙОВИЧ (BODNAR) 2011-03-26 17:12:49
1. Я навчився працювати в математичній системі координат, раніш ми це ще не вчили, бо я тільки в 4-му класі. Зрозумів. 2. Взяв за основу функції XS та YS з дискусії (Артура) 3. Написав програму GR_DISKU, яка будує крапку на екрані, якщо задати її математичні координати і границі графіку (для масштабування) 4. Написав програму GRDISKU2, яка будує відрізок на екрані по заданих математичних координатах 2-х крапок 5. На екрані виходить такий самий графік, як і на бумазі Нижче додаю ці дві програми. { ************************************************************** } { программа пересчета математических КООРДИНАТ ТОЧКИ на экранные } { внедренная с программы дискусии до уроку 4 автора Артура } { -------------------------------------------------------------- } { 24/03/2011 Саша Боднар } { ************************************************************** } program gr_disku; uses crt,graph; var xar,yar:integer; { посчитанные экранные х,у} var xa,ya:real; { заданные математические х,у } var xmin,xmax,ymin,ymax: real;{ границы листа графика математичского} function xs(x:real):longint; { функция перерахунку Х, предложенная в дискусии} begin xs:=round(getmaxx*(x-xmin)/(xmax-xmin)); end; function ys(y:real):longint; { функция перерахунку У, предложенная в дискусии} begin ys:=round(getmaxy*(1-(y-ymin)/(ymax-ymin))); end; var dr,rm:integer; begin clrscr; { Задать координаты точки } write('Задайте х_математическое='); read(xa); write('Задайте y_математическое='); read(ya); { Задать границы графика математиского на листе } write('Задайте х_математическое минимальное='); read(xmin); write('Задайте x_математическое максимальное='); read(xmax); write('Задайте y_математическое минимальное='); read(ymin); write('Задайте y_математическое максимальное='); read(ymax); { Графический режим } dr:=detect; InitGraph(dr,rm,'d:\bp\bgi'); xar:=xs(xa); yar:=ys(ya); setcolor(15); putpixel(xar,yar,15); repeat until keypressed; closegraph; { Конец графического режима } writeln; writeln('Границы графика на бумаге по горизонтали: ',xmin:10:3,' ',xmax:10:3); writeln('Границы графика на бумаге по вертикали: ',ymin:10:3,' ',ymax:10:3); writeln; writeln('x_математическое=',xa:10:3,' ==> x_экранное=',xar,' пикселов'); writeln('y_математическое=',ya:10:3,' ==> y_экранное=',yar,' пикcелов'); readln; end. { ************************************************************** } { программа пересчета математических КООРДИНАТ ТОЧКИ на экранные } { внедренная с программы дискусии до уроку 4 автора Артура } { -------------------------------------------------------------- } { 24/03/2011 Саша Боднар } { ************************************************************** } program grdisku2; uses crt,graph; var x1a,y1a,x2a,y2a:real; {посчитанные экранные х1a,у1a,x2a,y2a } var x1e,y1e,x2e,y2e:integer; {заданные математические х1e,у1e,x2e,y2e } var xmin,xmax,ymin,ymax: real;{ границы листа графика математичского} function xs(x:real):longint; { функция перерахунку Х, предложенная в дискусии} begin xs:=round(getmaxx*(x-xmin)/(xmax-xmin)); end; function ys(y:real):longint; { функция перерахунку У, предложенная в дискусии} begin ys:=round(getmaxy*(1-(y-ymin)/(ymax-ymin))); end; var dr,rm:integer; begin clrscr; { Задать координаты точeк } write('Задайте х1_математическое='); read(x1a); write('Задайте y1_математическое='); read(y1a); write('Задайте х2_математическое='); read(x2a); write('Задайте y2_математическое='); read(y2a); { Задать границы графика математиского на листе } write('Задайте х_математическое минимальное='); read(xmin); write('Задайте x_математическое максимальное='); read(xmax); write('Задайте y_математическое минимальное='); read(ymin); write('Задайте y_математическое максимальное='); read(ymax); { Графический режим } dr:=detect; InitGraph(dr,rm,'d:\bp\bgi'); x1e:=xs(x1a); y1e:=ys(y1a); x2e:=xs(x2a); y2e:=ys(y2a); setcolor(15); line(x1e,y1e,x2e,y2e); repeat until keypressed; closegraph; { Конец графического режима } writeln; writeln('Границы графика на бумаге по горизонтали: ',xmin:10:3,' ',xmax:10:3); writeln('Границы графика на бумаге по вертикали: ',ymin:10:3,' ',ymax:10:3); writeln; writeln('x1_математическое=',x1a:10:3,' ==> x1_экранное=',x1e,' пикселов'); writeln('y1_математическое=',y1a:10:3,' ==> y1_экранное=',y1e,' пикcелов'); writeln('x2_математическое=',x2a:10:3,' ==> x2_экранное=',x2e,' пикселов'); writeln('y2_математическое=',y2a:10:3,' ==> y2_экранное=',y2e,' пикcелов'); readln; end. |