#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define deltax(i,j) (mug[i].x - mug[j].x)
#define deltay(i,j) (mug[i].y - mug[j].y)
struct pt {int num; int x; int y;};
struct ptf {float x; float y;};
struct line {float a; float b; float c;};
struct ptD3 {int numD1; int numD2; int x; int y; float r;};
int inorout(struct pt *, struct pt * ,struct pt *);//Zapolnenie D2
void enterarr(struct pt *);//Zapolnenie D1
struct line getline(float x1, float y1, float x2, float y2);//Vichislenie ur-iya pryamoy
int distance(struct pt *, struct pt *, int , float , struct ptD3 *);//zapolnenie D3
void PasteSort(int , struct ptD3 *);//Sortirovka vstavkami
void swap(struct ptD3 *, int , int );//Obmen mestamy elementov massiva
float perimeter_calculation(struct pt *, int );//Vichislenie Perimetra
float area_calculation(struct pt *,int );//Vichislenie Ploshadi
int pofioff(struct ptf *, struct pt *);//point of intersection of figures
void sort_mug(struct pt *, int size);//sortirovka tochek mnogougolnika
int main()
{
int i, sizeD1, sizeD2, sizeD3, sizempoints, key;
float R, perimeter, area;
struct pt mug[4] = {1,1,1 , 2,15,1 , 3,10,8 , 4,2,14}, line[2]={5,-1,-1 , 6,8,15}, D1[20], *D2;
struct ptf magic_point[4];
struct ptD3 *D3;
FILE *file, *file_MUG, *file_D1, *file_RES;
if((file = fopen("sourse.txt", "rt")) == NULL)
{
printf("ERROR: sourse.txt IS NOT DETECTED\n");
getch();
return 0;
}
if((file_MUG = fopen("mug.txt", "rt")) == NULL)
{
printf("ERROR: mug.txt IS NOT DETECTED\n");
getch();
return 0;
}
if((file_D1 = fopen("d1.txt", "rt")) == NULL)//Tol'ko dlya chteniya
{
printf("ERROR: d1.txt IS NOT DETECTED\n");
getch();
return 0;
}
if((file_RES = fopen("result.txt", "r+t")) == NULL)//Otkrit' dlya chteniya i zapisi
{
printf("ERROR: result.txt IS NOT DETECTED\n");
getch();
return 0;
}
R = 7.2;
sizeD2 = 0;
sizeD3 = 0;
printf("Vvedite istochnik nachalnih dannih:\n1 - default\n2 - file\n3 - manual input\nPunkt N: ");
scanf("%d", &key);
switch(key)
{
case 2:
fscanf(file, "Radius = %f\nLine x1 = %d\nLine y1 = %d\nLine x2 = %d\nLine y2 = %d\n", &R, &line[0].x, &line[0].y, &line[1].x, &line[1].y);
for(i=0; i < 4; i++)
{
mug[i].num = i+1;
fscanf(file_MUG, "%d %d\n", &mug[i].x, &mug[i].y);
}
for(i = 0; i < 20; i++)
{
D1[i].num = i+1;
fscanf(file_D1, "%d %d\n", &D1[i].x, &D1[i].y);
}
sort_mug(mug, 4);
for(i = 0; i < 4; i++)
{
printf("%d %d\n", mug[i].x, mug[i].y);
}
break;
case 3:
printf("\nVvedite ogranichenie rastoyaniya tochek do pryamoy\nR = ");
scanf("%f", &R);
printf("Vvedite koordinati tochek mnogougolnika parami cherez probel\n");
for(i = 0; i < 4; i++)
{
mug[i].num = i+1;
printf("Enter x and y of point N%d\t",i+1);
scanf("%d %d\n", &mug[i].x, &mug[i].y);
}
sort_mug(mug, 4);
for(i = 0; i < 4; i++)
{
printf("%d %d", mug[i].x, mug[i].y);
}
printf("\nVvedite koordinati tochek massiva D1 parami cherez probel.\nkoordinati tochki v promezhutke 0<=x<=20 & 0<=y<=20\n");
enterarr(D1);
default:
printf("\nVzyati standartnie znacheniya ogranicheniya rastoyaniya tochek do pryamoy R\ni mnozhestvo tochek mnogougolnika\n\n");
printf("\nVvedite koordinati tochek massiva D1 parami cherez probel.\nkoordinati tochki v promezhutke 0<=x<=20 & 0<=y<=20\n");
enterarr(D1);
}
fclose(file);
fclose(file_MUG);
fclose(file_D1);
printf("Radius = %.3f\nLine x1 = %d\nLine y1 = %d\nLine x2 = %d\nLine y2 = %d\n", R, line[0].x, line[0].y, line[1].x, line[1].y);
printf("Coords of polygon peaks\n x y\n");
for(i = 0; i < 4; i++)
{
printf("%2d: %2d %2d\n", mug[i].num, mug[i].x, mug[i].y);
}
printf("D1 Array\n x y\n");
for(i = 0; i < 20; i++)
{
printf("%2d: %2d %2d\n", i+1, D1[i].x, D1[i].y);
}
D2 = (struct pt*)malloc(sizeof(struct pt) * 5);
sizeD2 = inorout(D1, D2, mug);
D3 = (struct ptD3*)malloc(sizeof(struct ptD3)*5);
sizeD3 = distance(line, D2, sizeD2, R, D3);
PasteSort(sizeD3,D3);
perimeter = perimeter_calculation(mug, 4);
area = area_calculation(mug, 4);
printf("Nahozhdenie tochek peresecheniya mnogougolnika i zadannoy prymoy:\n");
sizempoints = pofioff(magic_point, mug);
printf(" ============D2============= \n") ;
printf("___|_number_in_D1_|_x__|_y__|\n") ;
fprintf(file_RES," ============D2============= \n") ;
fprintf(file_RES,"___|_number_in_D1_|_x__|_y__|\n") ;
for(i = 0;i < sizeD2;i++)
{
printf("%2d:| %12d | %2d | %2d |\n", i+1,D2[i].num, D2[i].x, D2[i].y) ;
fprintf(file_RES,"%2d:| %12d | %2d | %2d |\n", i+1,D2[i].num, D2[i].x, D2[i].y) ;
}
printf(" ===================D3 UNSORTED===================== \n") ;
printf("____|_number_in_D1_|_number_in_D2_|_x_|_y_|_distance|\n") ;
fprintf(file_RES," ===================D3 UNSORTED===================== \n") ;
fprintf(file_RES,"____|_number_in_D1_|_number_in_D2_|_x_|_y_|_distance|\n") ;
for(i = 0;i < sizeD3;i++)
{
printf("%3d:|%12d |%12d |%2d |%2d |%9.3f|\n",i+1, D3[i].numD1, D3[i].numD2, D3[i].x, D3[i].y, D3[i].r) ;
fprintf(file_RES,"%3d:|%12d |%12d |%2d |%2d |%9.3f|\n",i+1, D3[i].numD1, D3[i].numD2, D3[i].x, D3[i].y, D3[i].r) ;
}
printf("_____________________________________________________\n") ;
fprintf(file_RES,"_____________________________________________________\n") ;
printf(" ====================D3 SORTED====================== \n") ;
printf("____|_number_in_D1_|_number_in_D2_|_x_|_y_|_distance|\n") ;
fprintf(file_RES," ===================D3 UNSORTED===================== \n") ;
fprintf(file_RES,"____|_number_in_D1_|_number_in_D2_|_x_|_y_|_distance|\n") ;
for(i = 0;i<sizeD3;i++)
{
printf("%3d:|%12d |%12d |%2d |%2d |%9.3f|\n",i+1, D3[i].numD1, D3[i].numD2, D3[i].x, D3[i].y, D3[i].r) ;
fprintf(file_RES,"%3d:|%12d |%12d |%2d |%2d |%9.3f|\n",i+1, D3[i].numD1, D3[i].numD2, D3[i].x, D3[i].y, D3[i].r) ;
}
printf("_____________________________________________________\n\n\n") ;
fprintf(file_RES,"_____________________________________________________\n\n\n") ;
printf("=================Tochki peresecheniya mnogougolnika i pryamoy===============\n") ;
fprintf(file_RES,"=================Tochki peresecheniya mnogougolnika i pryamoy===============\n") ;
if(sizempoints == 0)
{
printf("\n\t\tTochek netu.\n\n");
fprintf(file_RES,"\n\t\tTochek netu.\n\n");
}
for(i=0; i < sizempoints; i++)
{
printf("%2d: \tx=%.3f \t y=%.3f|\n",i+1, magic_point[i].x, magic_point[i].y);
fprintf(file_RES,"%2d: \tx=%.3f \t y=%.3f\n",i+1, magic_point[i].x, magic_point[i].y);
}
printf("___________________________________________________________________________\n\n") ;
fprintf(file_RES,"___________________________________________________________________________\n\n") ;
printf("\n\tperimeter = %f\n",perimeter);
printf("\n\tarea = %f\n",area);
fprintf(file_RES,"\n\tperimeter = %f\n",perimeter);
fprintf(file_RES,"\n\tarea = %f\n",area);
free(D2);
free(D3);
fclose(file_RES);
getch();
return 0;
}
void enterarr(struct pt *arr)
{
int i;
for(i=0; i < 20; i++)
{
arr[i].num = i + 1;
printf("Enter x and y of point N%d\t", arr[i].num);
scanf("%d %d", &(arr[i]).x, &(arr[i]).y);
if(((arr[i]).x < 0 || (arr[i]).x > 20) || ((arr[i]).y < 0 || (arr[i]).y > 20))
{
i--;
printf("\tERROR: 0<=x<=20 & 0<=y<=20. REPEAT\n");
}
printf("\n");
}
}
int inorout(struct pt *arr1,struct pt *arr2,struct pt *mug)//arr1=D1, arr2=D2, mug=mug
{
int i, j, size;
float ynn, ynv, xnl, xnp;
struct line mug_lines[4];
size = 0;
mug_lines[0] = getline(mug[0].x, mug[0].y, mug[1].x, mug[1].y);//AB
mug_lines[1] = getline(mug[1].x, mug[1].y, mug[2].x, mug[2].y);//BC
mug_lines[2] = getline(mug[2].x, mug[2].y, mug[3].x, mug[3].y);//CD
mug_lines[3] = getline(mug[3].x, mug[3].y, mug[0].x, mug[0].y);//DA
for(i = 0; i < 20; i++)
{
//printf("arr1[i] %f\n",(float)arr1[i].x);
ynn = -(mug_lines[0].a * arr1[i].x + mug_lines[0].c) / mug_lines[0].b;
ynv = -(mug_lines[2].a * arr1[i].x + mug_lines[2].c) / mug_lines[2].b;
xnl = -(arr1[i].y * mug_lines[3].b + mug_lines[3].c) / mug_lines[3].a;
xnp = -(arr1[i].y * mug_lines[1].b + mug_lines[1].c) / mug_lines[1].a;
if (ynn <= arr1[i].y && ynv >= arr1[i].y && xnl <= arr1[i].x && xnp >= arr1[i].x)
{
arr2[size].num = arr1[i].num;
arr2[size].x = arr1[i].x;
arr2[size].y = arr1[i].y;
size++;
if (size%5 == 0) arr2 = (struct pt *)realloc(arr2, sizeof(struct pt) * (size+5));
}
}
return size;
}
struct line getline(float x1, float y1, float x2, float y2)
{
float delta_y, delta_x;
struct line temp;
temp.a = y1 - y2;
temp.b = x2 - x1;
temp.c = -(temp.a * x1 + temp.b * y1);
return temp;
}
int distance(struct pt *line, struct pt *D2, int sizeD2, float R, struct ptD3 *D3)
{
int size, i;
struct line main_line, normal_line;
float x0, y0, r;
size = 0;
main_line = getline(line[1].x, line[1].y, line[0].x, line[0].y);
//printf("k=%f b=%f",main_line.k,main_line.b);
normal_line.a = -1 / main_line.a;
normal_line.b = 1 / main_line.b;
for(i = 0; i < sizeD2; i++)
{
normal_line.c = -normal_line.b * D2[i].y - normal_line.a * D2[i].x;
x0 = -(normal_line.b * main_line.c - main_line.b * normal_line.c) / (main_line.a * normal_line.b - normal_line.a * main_line.b);
y0 = -(normal_line.c * main_line.a - main_line.c * normal_line.a) / (main_line.a * normal_line.b - normal_line.a * main_line.b);
r = sqrt((x0 - D2[i].x) * (x0-D2[i].x) + (y0-D2[i].y) * (y0-D2[i].y));
//printf("x0=%f y0=%f r=%f\n",x0,y0,r);
if (r <= R)
{
D3[size].numD1 = D2[i].num;
D3[size].numD2 = i;
D3[size].x = D2[i].x;
D3[size].y = D2[i].y;
D3[size].r = r;
size++;
if (size%5 == 0) D3 = (struct ptD3 *)realloc(D3, sizeof(struct ptD3) * (size+5));
}
}
return size;
}
void PasteSort(int size, struct ptD3 *D3)//swap(D3,i-1,i);
{
int i, j;
i = 1;
j = 2;
while(i < size)
{
if (D3[i - 1].r <= D3[i].r)
{
i = j;
j++;
}
else
{
swap(D3,i - 1,i);
i--;
if (i == 0)
{
i = j;
j++;
}
}
}
}
void swap(struct ptD3 *arr, int i, int j)
{
struct ptD3 temp;
//printf("%f %f\n",arr[i].r,arr[j].r);
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
//printf("%f %f\n\n",arr[i].r,arr[j].r);
}
float perimeter_calculation(struct pt *mug, int size)
{
int i;
float result;
result = 0;
for(i = 0; i < size; i++)
{
result += sqrt(deltax((i+1)%size,i)*deltax((i+1)%size,i)+deltay((i+1)%size,i)*deltay((i+1)%size,i));
}
return result;
}
float area_calculation(struct pt *mug, int size)
{
int i;
float S;
S = 0;
for(i = 0; i < size; i++)
{
S += deltax((i+1)%size,i) * (mug[i].y+mug[(i+1)%size].y)/2.;
//printf("%f\n",S);
}
return -S;
}
int pofioff(struct ptf *mpoint, struct pt *mug)
{
char a;
int i, size;
float x, y;//,ynn,ynv,xnl,xnp;
struct line mug_lines[4], user_line;
struct ptf point[2];
printf("Esli vi hotite vvesti koordinati tochek cherez kotorie prohodit pryamaya\nvvedite ""x""\nEsli vi hotite vvesti kooficienty a, b i c v uravnenii pramoy to\nvvedite ""k""\n");
a = getch();
printf("%c\n", a);
switch(a)
{
case 'x':
printf("Vevedite koordinti 1 tochki cherez probel\n");
scanf("%f %f",&point[0].x, &point[0].y);
printf("Vevedite koordinti 2 tochki cherez probel\n");
scanf("%f %f",&point[1].x, &point[1].y);
user_line = getline(point[0].x, point[0].y, point[1].x, point[1].y);
//printf("%f %f\n\n",user_line.k,user_line.b);
break;
case 'k':
printf("Vvedite kooficientu a, b i c cherez probel\n");
scanf("%f %f %f",&user_line.a, &user_line.b, &user_line.c);
break;
default:
printf("\n\tERROR.\nVvedite kooficientu a, b i c cherez probel\n");
scanf("%f %f %f",&user_line.a, &user_line.b, &user_line.c);
}
//printf("Line k=%f b=%f\n",user_line.k,user_line.b);
mug_lines[0] = getline(mug[0].x, mug[0].y, mug[1].x, mug[1].y);//AB
mug_lines[1] = getline(mug[1].x, mug[1].y, mug[2].x, mug[2].y);//BC
mug_lines[2] = getline(mug[2].x, mug[2].y, mug[3].x, mug[3].y);//CD
mug_lines[3] = getline(mug[3].x, mug[3].y, mug[0].x, mug[0].y);//DA
size = 0;
for(i =0; i<4; i++)
{
x = -(mug_lines[i].c * user_line.b - mug_lines[i].b * user_line.c)/(user_line.b * mug_lines[i].a - user_line.a * mug_lines[i].b);
y = -(mug_lines[i].a * user_line.c - mug_lines[i].c * user_line.a)/(user_line.b * mug_lines[i].a - user_line.a * mug_lines[i].b);
//printf("x %f y %f\n",x,y);
if (x>=mug[i>0?(i+1):i].x && x<=mug[i>0?i:(i+1)].x && y>=mug[i>3?(i+1):i].y && y<=mug[i>3?i:(i+1)].y)
{
mpoint[size].x=x;
mpoint[size].y=y;
//printf("%f %f\n",mpoint[size].x,mpoint[size].y);
size++;
}
}
return size;
}
void sort_mug(struct pt *mug, int size)
{
int i, j, index;
struct pt temp,swap;
for(i =0; i < size; i++)
{
if (mug[i].x < mug[0].x && mug[i].y <= mug[0].y)
{
swap = mug[i];
mug[i] = mug[0];
mug[0] = swap;
}
}
for(i = 1; i < size; i++)
{
if (mug[1].y >= mug[i].y && mug[0].x < mug[i].y)
{
for(j = i+1; j < size; j++)
{
if (mug[i].y > mug[j].y) break;
else
{
swap = mug[i];
mug[i] = mug[1];
mug[1]=swap;
}
}
}
}
if (mug[2].x < mug[3].x)
{
swap = mug[2];
mug[2] = mug[3];
mug[3]=swap;
}
}