Геометрические примитивы
Построение отрезков, окружностей, циклоидов, трохоидов, узоров и вписанных многоугольников, используя различные системы и дифференциальные уравнения. Кривые в полярных координатах. Функции действительного аргумента. Переход к декартовой системе.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 19.03.2009 |
Размер файла | 161,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Отчет о лабораторной работе №1
ГЕОМЕТРИЧЕСКИЕ ПРИМИТИВЫ
Прямая
Задание 1. Построить отрезки прямых, используя уравнение:
Y=k*X+b
для k=0, k=1, k=10000, k=0.2, k=1.5 (приращение ДХ принять постоянным):
dy/dx=Дy/Дx=const
Величину const принять равной значению k, определенному выше.
Текст программы:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
main()
{
int driver,mode,i;
float x1,x2,y1,y2,k,b;
printf("\n\nУравнение вида Y=K*X+B\n\n");
printf("Введите K:...");
scanf("%f",&k);
printf("Введите B:...");
scanf("%f",&b);
x1=0; y1=k*x1+b; x2=200; y2=k*x2+b;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,450,630,450); line(630,450,625,455);
line(630,450,625,445); line(0,70,0,450); line(0,70,5,75);
for(i=10;i<=600;i=i+10) line(0+i,450,0+i,448);
for(i=10;i<=300;i=i+10) line(0,450-i,2,450-i);
setcolor(YELLOW);
line(x1,450-y1,x2,450-y2);
getch();
}
Результат выполнения:
при k=0 b=10, k=0,3 b=5 k=0,6 b=10 k=1 b=10
Вывод: при изменении параметра k от 0 до 1 прямая поворачивается на определённые углы. Параметр b отвечает за координату у начальной точки прямой.
Задание 2. Построить отрезки прямых, используя уравнения:
X=x1*(1-t)+x2*t
Y=y1*(1-t)+y2*t
Полагать, что 1(x1;y1) - начало отрезка, 2(x2;y2) - конец отрезка, а независимый параметр t изменяется от 0 до 1. Рассмотреть поведение отрезка при значениях параметра t>1 и t<0.
Текст программы:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
main()
{
int driver,mode,i,x1,x2,y1,y2;
float t,dt,x,y,a,b;
printf("\n\nУравнение вида X=x1*(1-t)+x2*t\n");
printf(" Y=y1*(1-t)+y2*t\n\n");
x1=300; y1=225; x2=400; y2=125;
printf("Введите границы изменения параметра t:...");
scanf("%f%f",&a,&b);
printf("Введите шаг изменения t:...");
scanf("%f",&dt);
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220); line(630,225,625,230);
line(300,0,300,450); line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
for(t=a;t<=b;t=t+dt)
{
x=x1*(1-t)+x2*t;
y=y1*(1-t)+y2*t;
putpixel(x,y,YELLOW);
}
getch();
}
Результат выполнения:
х1=50; y1=50; x2=100; y2=100; x1=120; y1=50; x2=40; y2=80;
Вывод: При изменении t отрезок смещается, а при уменьшении шага уплотняется.
Окружность
Задание 1. Построить окружность, используя уравнение:
(X-a)2+(Y-b)2=R2
a=150, b=100, R=50 (a=0, b=0, R=80)
Текст программы:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
main()
{
long int driver,mode,i,a,b,r;
float x,y1,y2,stepen;
printf("\n\nУравнение вида (x-a)2+(y-b)2=r2\n\n");
printf("Введите A:...");
scanf("%ld",&a);
printf("Введите B:...");
scanf("%ld",&b);
printf("Введите R:...");
scanf("%ld",&r);
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220); line(630,225,625,230);
line(300,0,300,450); line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
stepen=1/2.;
for(x=a-r;x<=a+r;x=x+1)
{
y1=pow((pow(r,2)-pow((x-a),2)),stepen)+b;
y2=-pow((pow(r,2)-pow((x-a),2)),stepen)+b;
putpixel(300+x,225-y1,YELLOW);
putpixel(300+x,225-y2,YELLOW);
}
getch();
}
Результат выполнения:
a=10, b=4, r=30
Задание 2. Построить окружность, используя уравнение:
X=a+R*cos(ц)
Y=b+R*sin(ц)
a=150, b=100, R=50 (a=0, b=0, R=80)
Текст программы:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
main()
{
long int driver,mode,i,a,b,r;
float x,y,step,pi,fi;
printf("\n\nУравнения вида X=a+R*cos(fi)\n");
printf(" Y=b+R*sin(fi)\n\n");
printf("Введите A:...");
scanf("%ld",&a);
printf("Введите B:...");
scanf("%ld",&b);
printf("Введите R:...");
scanf("%ld",&r);
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220); line(630,225,625,230);
line(300,0,300,450); line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
step=1/2.;
pi=3.14;
for(fi=0;fi<=2*pi;fi=fi+0.01)
{
x=a+r*cos(fi);
y=b+r*sin(fi);
putpixel(300+x,225-y,YELLOW);
putpixel(300+x,225-y,YELLOW);
}
getch();
}
Результат выполнения:
a=10, b=4, r=30
Задание 3. Построить окружность, рассматривая дифференциальное уравнение:
dy/dx=-x/y,
решением которого может быть:
Xn+1=Xn+еYn
Yn+1=Yn - еXn
Значение величины е принять равной 2-n (2n-1<=R<=2n, начало окружности совпадает с началом координат, радиус равен расстоянию от начала координат до первой точки 1(x1;y1)), или улучшенный вариант:
Xn+1=Xn+еYn
Yn+1=Yn - еXn+1
Текст программы:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
main()
{
long int driver,mode,i,n;
float e,x,y;
printf("\n\nУравнения вида X(n+1)=X(n)+E*Y(n)\n");
printf(" Y(n+1)=Y(n)-E*X(n+1)\n\n");
printf("Введите количество точек окружности N:...");
scanf("%ld",&n);
x=0;
y=50;
printf("Введите E:...");
scanf("%f",&e);
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220); line(630,225,625,230);
line(300,0,300,450); line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
for(i=1;i<=n+1;i=i+1)
{
putpixel(300+x,225-y,YELLOW);
x=x+e*y;
y=y-e*x;
}
getch();
}
Результат выполнения:
n=75, е=0.1
Вывод: При уменьшении е окружность принимает более правильную форму.
Задание 4. Построить окружность, используя итерационные уравнения:
Xn+1=Xn*cos(ц)+Yn*sin(ц)
Yn+1=Yn*cos(ц)-Xn*sin(ц)
Значение угла ц принять постоянным ц=2р/n (n - число точек окружности).
Текст программы:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
main()
{
long int driver,mode,i,n;
float x,y,x1,y1,fi;
printf("\n\nУравнения вида X(n+1)=X(n)*cos(fi)+Y(n)*sin(fi)\n");
printf(" Y(n+1)=Y(n)*cos(fi)-X(n)*sin(fi)\n\n");
printf("Введите количество точек окружности N:...");
scanf("%ld",&n);
x1=x=0; y1=y=50; fi=6.28/n;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220); line(630,225,625,230);
line(300,0,300,450); line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
for(i=1;i<=n+1;i=i+1)
{
putpixel(300+x,225-y,YELLOW);
x=x1*cos(fi)+y1*sin(fi);
y=y1*cos(fi)-x1*sin(fi);
x1=x;
y1=y;
}
getch();
}
Результат выполнения:
N=500, x=50, y=50, r=50 N=100, x=50, y=50, r=50 N=50, x=50, y=50, r=40
Вывод: чем большее количество точек мы берём, тем больше спираль похожа на окружность.
Кривые в полярных координатах
Уравнение кривой в полярной системе координат имеет вид:
с=R(ц)
где с - расстояние до начала координат, ц - угол отклонения от горизонтальной оси, R - произвольная функция действительного аргумента, которая определяет вил кривой. Зависимость между с и ц может быть и нефункциональной, тогда ее можно задать неявно (F(с, ц)=0) или системой параметрических уравнений (с=с(t), ц=ц(t)). Переход к декартовой системе осуществляется преобразованием:
X=с*cos(ц)
Y=с*sin(ц)
Текст программы:
#include<stdio.h>
#include<graphics.h>
main()
{
long int driver,mode,i;
float x,y,pi,fi,alfa;
printf("\n\nУравнения вида X=F(alfa)*cos(fi)\n");
printf(" Y=F(alfa)*sin(fi)\n");
getch();
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220); line(630,225,625,230);
line(300,0,300,450); line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
pi=3.14;
for(alfa=0;alfa<=5;alfa=alfa+1)
{
for(fi=0;fi<=2*pi;fi=fi+0.0001)
{
x=(tan(fi)+alfa*20)*sin(fi);
y=(tan(fi)+alfa*20)*cos(fi);
putpixel(300+x,225-y,YELLOW);
}
}
getch();
}
Результат выполнении:
Циклоиды
Построить для различных значений параметров кривые, описываемые уравнениями:
X=a+R*cos(ц)+A*cos(и)
Y=b+R*sin(ц)+B*sin(и)
Текст программы:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
main()
{
long int driver,mode,i,a1,a2,b1,b2,r;
float x,y,pi,fi,alfa;
printf("\n\nУравнения вида X=a+R*cos(alfa)+A*cos(fi)\n");
printf(" Y=b+R*sin(alfa)+B*sin(fi)\n");
printf("Введите a:..."); scanf("%ld",&a1);
printf("Введите b:..."); scanf("%ld",&b1);
printf("Введите A:..."); scanf("%ld",&a2);
printf("Введите B:..."); scanf("%ld",&b2);
printf("Введите R:..."); scanf("%ld",&r);
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220); line(630,225,625,230);
line(300,0,300,450); line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
pi=3.14;
for(alfa=1;alfa<=2*pi;alfa=alfa+1)
for(fi=0;fi<=2*pi;fi=fi+0.01)
{
x=a1+r*cos(alfa)+a2*cos(fi);
y=b1+r*sin(alfa)+b2*sin(fi);
putpixel(300+x,225-y,YELLOW);
}
getch();}
Результат выполнения:
Трохоиды
Построить для различных значений параметров кривые, описываемые уравнениями:
X=a+Rx*cos(ц/sx+Дx)
Y=b+Ry*sin(ц/sy+Дy)
Тест программы:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
main()
{
long int driver,mode,i,a,b;
float x,y,fi,pi,sx,sy,dx,dy,rx,ry;
printf("\n\nУравнения вида X=a+rx*cos(fi/sx+dx)\n");
printf(" Y=b+ry*sin(fi/sy+dy)\n");
printf("Введите a:..."); scanf("%ld",&a);
printf("Введите b:..."); scanf("%ld",&b);
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220); line(630,225,625,230);
line(300,0,300,450); line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
pi=3.14;
sx=1; /* закручивание */
sy=0.1;
dx=0.7; /* смещение петель */
dy=0.7;
rx=0.8; /* растяг по ширине */
ry=0.6; /* растяг по высоте */
for(fi=0;fi<=2*pi;fi=fi+0.001)
{
x=a+rx*cos(fi/sx+dx)*200;
y=b+ry*sin(fi/sy+dy)*200;
putpixel(300+x,225-y,YELLOW);
}
getch();
}
Результат выполнения:
Узоры
Построить огибающую семейства окружностей, проходящей через фиксированную точку А базовой окружности, на которой лежат центры рисующих окружностей.
Текст программы:
#include<stdio.h>
#include<graphics.h>
main()
{
long int driver,mode,i;
float x,y,pi,fi,alfa;
driver=DETECT; mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220);
line(630,225,625,230); line(300,0,300,450);
line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
pi=3.14;
for(alfa=0;alfa<=140;alfa=alfa+1)
for(fi=0;fi<=pi;fi=fi+0.01)
{
x=cos(alfa+fi)*sin(fi)*220;
y=cos(alfa+fi)*cos(fi)*220;
putpixel(300+x,225-y,YELLOW);
}
getch();
}
Результат выполнения:
Используя схему деления отрезка в данном отношении, построить вписанные многоугольники.
Текст программы:
#include<stdio.h>
#include<graphics.h>
#include<math.h>
main()
{
long int driver,mode,i;
float x,y;
driver=DETECT; mode=0;
initgraph(&driver,&mode,"d:\\tc\\bgi");
line(0,225,630,225); line(630,225,625,220); line(630,225,625,230);
line(300,0,300,450); line(300,0,295,5); line(300,0,305,5);
for(i=0;i<=300;i=i+10) line(300+i,225,300+i,223);
for(i=0;i<=300;i=i+10) line(300-i,225,300-i,227);
for(i=0;i<=200;i=i+10) line(300,225-i,302,225-i);
for(i=0;i<=200;i=i+10) line(300,225+i,298,225+i);
for(i=0;i<=1000;i=i+2)
{
line(290+i,215-i,310+i,215+i);
line(310+i,215+i,310-i,235+i);
line(310-i,235+i,290-i,235-i);
line(290-i,235-i,290+i,215-i);
i=i+3;
}
getch();
}
Результат выполнения:
Подобные документы
Математический аппарат исследования САУ. Дифференциальные уравнения, описывающие движение системы являю тся уравнениями динамики. Дифференциальные уравнения САУ, ее элементы. Дифференциальные уравнения высокого порядка. Математическая модель системы.
реферат [81,2 K], добавлен 17.10.2008Угловое распределение волновой функции электрона для водородоподобной модели атомов. Описание электронных свойств атома с помощью уравнения Шредингера. Построение графика 3D4d-орбитали в среде LabView с заменой декартовой системы координат на сферическую.
практическая работа [646,3 K], добавлен 14.11.2015Разработка программы-приложения для создания композиции кривых второго порядка в полярных координатах. Описание используемых констант, переменных, компонентов, процедур и функций. Источники входной и выходной информации. Требования к программе и системе.
реферат [125,2 K], добавлен 28.05.2014Дифференциальные уравнения как уравнения, в которых неизвестными являются функции одного или нескольких переменных, причем в уравнения входят не только сами функции, но и их производные. Решение операторным методом, с помощью рядов, методом Эйлера.
курсовая работа [301,4 K], добавлен 27.03.2011Построение графика функции. Поиск корней уравнения методом половинного деления. Определение минимума функции методом перебора и значения аргумента. Вычисление определенного интеграла на заданном отрезке с использованием метода правых прямоугольников.
контрольная работа [316,1 K], добавлен 13.11.2014Расчет и построение таблицы значений функции (протабулирование функции) при различных значениях аргумента. Нахождение наибольшего и наименьшего значений функции на отрезке и построение графика. Рабочий лист Excel в режимах отображения значений и формул.
контрольная работа [30,0 K], добавлен 27.05.2010Появление дифференциальных уравнений при описании систем управления. Элементы теории дифференциальных уравнений. Определитель Вронского. Формула Лиувилля. Дифференциальные уравнения при описании непрерывных систем. Понятие пространства состояний.
реферат [1,0 M], добавлен 29.09.2008Рабочее приложение для вычисления принадлежности точки заданной области. Реализация и проверка корректности ввода данных: радиуса, условий попарного пересечения окружностей, принадлежности центров окружностей одной прямой, заключенной внутри окружностей.
курсовая работа [596,7 K], добавлен 13.01.2014Векторная компьютерная графика. Графические примитивы. Графические возможности языка программирования Pascal. Методические рекомендации к изучению графики в языке программирования Pascal. Построение графиков функций.
курсовая работа [28,3 K], добавлен 13.06.2007История создания и развитие языка программирования Pascal, его версии. Особенности и порядок построения графика функции на языке Turbo Pascal с использованием декартовой системы координат. Блок схема алгоритма процедур, листинг и тестирование программы.
курсовая работа [102,7 K], добавлен 23.12.2011