Министерство образования и науки Российской Федерации
Новосибирский государственный технический университет
Лабораторная работа №1
Программирование графики
Факультет: ПМИ
Группа: ПМ-71
Студент: Малев К.С.
Преподаватель: Лисицин Д.В.
Дата сдачи:
Новосибирск 2008г.
Задание.
Разработать функции, рисующие на экране следующие геометрические фигуры:
– незакрашенный параллелограмм,
– закрашенный параллелограмм,
– два вложенных один в другой параллелограмма, внешняя фигура закрашена, за исключением пространства внутренней.
Разработать программу, демонстрирующую выполнение указанных функций, обеспечить ввод пользователем параметров фигур (координат и др.), параметров рисуемых линий и закраски. Включить в программу проверки нахождения фигуры в пределах экрана и вложенности двух фигур.
Анализ задачи
Внутренние и внешние представление данных
Исходными данными к этой задаче являются координаты четырех вершин параллелограмма, которые представляют собой непустое множеством V, мощностью 8.
Внутреннему представлению этого множества будут отвечать два массива констант, соответствующих координатам вершин по оси абсцисс и оси ординат.
Метод решения
a. Проверка на нахождение внутри границ экрана
b. Проверка на параллельность противолежащих сторон
c. В случае, если строятся вложенные один в другой параллелограммы, проверка на вложенность
Укрупнённый алгоритм решения задачи
Особую сложность представляют собой механизмы проверки условий. Фактически, при решении задачи, нахождение этих условий заняло большую часть времени. Поэтому они описаны ниже:
Проверка на нахождение внутри границ экрана.
Каждая координата должна удовлетворять следующей системе уравнений:
Проверка на параллельность противолежащих сторон.
Разности абсцисс и ординат соответствующих точек должны быть равны:
Проверка вложенность:
Разности абсцисс и ординат соответствующих точек должны быть равны:
Описание функций
void par (int y[],int x[])– строит параллелограмм по 4-м вершинам, введённых начиная с левой нижней точки, по часовой стрелке
float get_k (int i2, int i1, int y[], int x[]) – вычисляет коэффициент наклона прямой, соединяющей i1 и i2 точки.
int check (int y[],int x[])– функция проверки фигуры на принадлежность области и параллельности противолежащих сторон. В случае, если фигура не удовлетворяет необходимым условиям, возвращаемое значение – 0.
void incdatamsg() – функция сообщения об ошибки в введенных данных.
void where (int y[],int x[]) – функция, запрашивающая у пользователя координаты фигуры.
int where2 (FILE *fp,int y[],int x[])- функция, считывающая данных из файла.
void Draw (int *y,int *x) – функция построения параллелограмма заданного цвета
void DrawFill (int *y,int *x) – функция построения параллелограмма заданного цвета, с последующей заливкой.
void onein () – функция для отображения на экране двух вложенных параллелограммов.
void options () – графические опции. Для линий указываются толщина, тип, цвет, а для заливки – тип и цвет. Результат – линии и заливка фигур будут такими, какими их выбрал пользователь.
void how () – функция, позволяющая пользователю выбрать способ ввода данных. Вызывает where2 () или where (), в зависимости от способа ввода данных.
menu() – демонстрационное меню. Вызывает функции how (), options (), onein () и Draw(), DrawFill(), в зависимости от указаний пользователя.
main() – основная функция программы. Подключение графического режима, вызов menu и отключение графического режима по завершении работы программы.
3. Программа
#include <graphics.h>
//#include <omp.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
int xExt[5],yExt[5],xIn[5],yIn[5],FillStyle,FillColour,LineTough,LineColour
,LineStyle;
float k1_2,b1_2,k3_4,b3_4,k2_3,b2_3,k4_1,b4_1;
void par (int y[],int x[])
{
line (x[1],y[1],x[2],y[2]);
line (x[2],y[2],x[3],y[3]);
line (x[3],y[3],x[4],y[4]);
line (x[4],y[4],x[1],y[1]);
}
//count k
float get_k (int i2, int i1, int y[], int x[])
{
float k;
k=(y[i2]-y[i1])/(x[i2]-x[i1]);
return (k);
}
//check obj. If not suitable: 0
int check (int y[],int x[])
{
int r=0;
//|| check
if (((abs(y[3]-y[2]))==(abs(y[4]-y[1])))
&&((abs(x[4]-x[3]))==(abs(x[2]-x[1])))) r=1;
else r=0;
//inside check
for (int i=1;i<=4;i++)
{
if ( (x[i]>640) || (x[i]<0) || (y[i]<0) || (y[i]>480) ) r=0;
}
return (r);
}
//Check in order to be sure that smaller figure is inside bigger one: 0 if not
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.