codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
#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; } }
Private
[
?
]
Run code
Submit