Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Реализации различных алгоритмов на Си / псевдографика отрезок

.doc
Скачиваний:
18
Добавлен:
20.06.2014
Размер:
74.75 Кб
Скачать

3

  1. Задание

Написать программу, реализующую целочисленный алгоритм построения графического примитива.

Вариант 21: отрезок.

  1. Листинг программы

#include <iostream>

#include <math.h>

void draw(int x0, int y0, int x1, int y1)

{

int Xlen=x1-x0;//проекция отрезка на ось Х

int Ylen=y1-y0;//проекция отрезка на ось У

float *E=(float *)malloc((Xlen+1)*sizeof(float));

int *masX=(int *)malloc(sizeof(int)*(Xlen+1));//массив координиат Х от Х0(Ах) до Х1(Вх)

int *masY=(int *)malloc(sizeof(int)*(Xlen+1));//

double *d_masY=(double *)malloc(sizeof(double)*(Xlen+1));//массив значений уравнения прямой в каждой из координат отрезка

char **g_mas=(char **)malloc(sizeof(char)*(y1+1));//g_mas - двумерный массив (X x Y), состоящий из точек и символов *

for(int i=0;i<(y1+1);i++)

g_mas[i]=(char *)malloc(sizeof(char)*(x1+1));

for(int i=0;i<(y1+1);i++)//"обнуление" массива

for(int j=0;j<(x1+1);j++)

g_mas[i][j]='.';

for(int i=0;i<(Xlen+1);i++)//заполнение массива координат Х

masX[i]=x0+i;

for(int i=0;i<(Xlen+1);i++)//заполнение массива значний по оси У

d_masY[i]=((double)(masX[i]-x0))/((double)Xlen)*((double)Ylen)+y0;

masY[0]=y0;

E[0]=(float)(d_masY[1]-d_masY[0])/(masX[1]-masX[0])-0.5;

for(int i=0;i<Xlen;i++)

{

E[i+1]=E[i]+(float)(d_masY[i+1]-d_masY[i])/(masX[i+1]-masX[i]);

if(E[i+1]>0)

{

masY[i+1]=masY[i]+1;

E[i+1]=E[i+1]-1;

}

else

masY[i+1]=masY[i];

printf("%f\t%d\n",E[i],masY[i]);

}

for(int i=0;i<(Xlen+1);i++)

{

g_mas[y1-masY[i]][masX[i]]='*';

if(i<Xlen)

{

int d=(masY[i+1]-masY[i])/2;//разниуа по У

if(d>1)//если половина больше 1, то заполняем недостающие элементы

{

for(int j=1;j<d;j++)

g_mas[y1-masY[i]-j][masX[i]]='*';

for(int j=d;j<(masY[i+1]-masY[i]);j++)

g_mas[y1-masY[i]-j][masX[i+1]]='*';

}

}

}

for(int i=0;i<(y1+1);i++)

{

for(int j=0;j<(x1+1);j++)

printf("%c", g_mas[i][j]);

printf("\n");

}

}

void menu()

{

int x0=0, y0=0, x1=0, y1=0;

printf("\nВведите координаты начальной точки: ");

scanf("%d %d", &x0, &y0);

printf("\nВведите координаты конечной точки: ");

scanf("%d %d", &x1, &y1);

if(x1<x0 || x0>80 || x1>80 || y0>24 || y1>24)

{

printf("Подобное нарисовать нельзя!");

printf("\nПожалуйста, повторите попытку...\n\n");

system("pause");

system("cls");

menu();

}

else

{

printf("График:\n\n");

draw(x0, y0, x1, y1);

}

}

void main()

{

setlocale(LC_ALL, "Rus");

menu();

system("pause");

}