Реализации различных алгоритмов на Си / псевдографика отрезок
.doc
-
Задание
Написать программу, реализующую целочисленный алгоритм построения графического примитива.
Вариант 21: отрезок.
-
Листинг программы
#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");
}