#include<stdio.h> #include<stdlib.h> #include<math.h> #include<graphics.h> #define MAX_LINEAS 50 unsigned char *archivo[3]; int *datos_enteros; int *nodo_local[4]; float *x,*y,*potencial; float *datos_reales; float *datos_potenciales; char *nodos_adyacentes; long int num_nodos; int num_elem; int num_lineas; float potencial_mayor; float potencial_menor; float espaciamiento; float *bases,x_max=0,y_max=0; char *tipo_de_elemento; float *pendientes; float x_menor; float x_mayor; float y_menor; float y_mayor; float potencial_base; int i,j,k,l; int *puntos_en_linea; float *x_linea[MAX_LINEAS]; float *y_linea[MAX_LINEAS]; int graf_max_x,graf_max_y; float escala_x,escala_y; int modo_grafico; main() { entra_datos(); acceso_lista(); acceso_enteros(); organiza_datos_enteros(); acceso_reales(); organiza_datos_reales(); acceso_potenciales(); organiza_potenciales(); organiza_nodos_adyacentes(); establece_potenciales_extremos(); establece_espaciamiento(); establece_tipo_de_elemento(); organiza_datos_elementos(); ordena(); inicia_graficos(); grafica_lineas(); } entra_datos() { clrscr(); scanf("%d",&num_lineas); clrscr(); } acceso_lista() { FILE *fp; int i; clrscr(); fp=fopen("a:\\lista.txt","rt"); printf("Archivos que contienen los datos\n\n"); for(i=0;(i<=2);i++) { archivo[i]=(unsigned char *)malloc(100); if(!archivo[i]) exit(1); fscanf(fp,"%s",archivo[i]); printf("Dato %d = %s\n",i+1,archivo[i]); } teclazo(); fclose(fp); } acceso_enteros() { FILE *fp; int i,num_datos; clrscr(); fp=fopen("a:\\efismae.txt","rt"); fscanf(fp,"%d",&num_datos); printf("Cantidad de datos enteros = %d\n\n",num_datos); datos_enteros=(int *)malloc((num_datos+1)*sizeof(int)); if(!datos_enteros) exit(1); for(i=0;(i<num_datos);i++) { fscanf(fp,"%d",(datos_enteros+i)); printf("Dato %d = %d\n",i+1,datos_enteros[i]); if(wherey()==20) teclazo(); } teclazo(); fclose(fp); } organiza_datos_enteros() { int i; int j=2; clrscr(); num_nodos=datos_enteros[0]; num_elem=datos_enteros[1]; for(i=1;i<=3;i++) { nodo_local[i]=(int *)malloc((num_elem+1)*sizeof(int)); if(!nodo_local[i]) exit(1); } for(i=1;i<=num_elem;i++) { nodo_local[1][i]=datos_enteros[i+j]; printf("Nodo local[1][%d] = %d\n",i,nodo_local[1][i]); if(wherey()==20) teclazo(); j++; nodo_local[2][i]=datos_enteros[i+j]; printf("Nodo local[2][%d] = %d\n",i,nodo_local[2][i]); if(wherey()==20) teclazo(); j++; nodo_local[3][i]=datos_enteros[i+j]; printf("Nodo local[3][%d] = %d\n",i,nodo_local[3][i]); if(wherey()==20) teclazo(); } free(datos_enteros); teclazo(); } acceso_reales() { FILE *fp; int i,num_datos; float n_datos; clrscr(); fp=fopen("a:\\efismar.txt","rt"); fscanf(fp,"%f",&n_datos); num_datos=(int)n_datos; printf("Cantidad de datos flotantes = %d\n\n",num_datos); datos_reales=(float *)malloc((num_datos+1)*sizeof(float)); if(!datos_reales) exit(1); for(i=0;(i<num_datos);i++) { fscanf(fp,"%f",(datos_reales+i)); printf("Dato %d = %f\n",i+1,datos_reales[i]); if(wherey()==20) teclazo(); } teclazo(); fclose(fp); } organiza_datos_reales() { int i; int j=0; clrscr(); x=(float *)malloc((num_nodos+1)*sizeof(float)); if(!x) exit(1); y=(float *)malloc((num_nodos+1)*sizeof(float)); if(!y) exit(1); for(i=1;i<=num_nodos;i++) { x[i]=datos_reales[j]; printf("X[%d] = %f\n",i,datos_reales[j]); if(wherey()==20) teclazo(); j++; y[i]=datos_reales[j]; printf("Y[%d] = %f\n",i,datos_reales[j]); if(wherey()==20) teclazo(); j++; } free(datos_reales); teclazo(); } acceso_potenciales() { FILE *fp; int i,num_datos; float n_datos; clrscr(); fp=fopen("a:\\efresul.txt","rt"); fscanf(fp,"%f",&n_datos); num_datos=(int)n_datos; printf("Cantidad de datos potenciales = %d\n\n",num_datos); datos_potenciales=(float *)malloc((num_datos+1)*sizeof(float)); if(!datos_potenciales) exit(1); for(i=0;(i<num_datos);i++) { fscanf(fp,"%f",(datos_potenciales+i)); printf("Dato %d = %E\n",i+1,datos_potenciales[i]); if(wherey()==20) teclazo(); } for(i=0;i<=2;i++) { free(archivo[i]); } teclazo(); fclose(fp); } organiza_potenciales() { int i; int j=0; clrscr(); potencial=(float *)malloc((num_nodos+1)*sizeof(float)); if(!potencial) exit(1); for(i=1;i<=num_nodos;i++) { potencial[i]=datos_potenciales[j]; printf("Potencial[%d] = %E\n",i,datos_potenciales[j]); if(wherey()==20) teclazo(); j++; } free(datos_potenciales); teclazo(); } organiza_nodos_adyacentes() { int h,j,k; long int l; clrscr(); nodos_adyacentes=(char *)malloc((num_nodos*num_nodos+1)*sizeof(char)); if(!nodos_adyacentes) exit(1); for(l=0;l<=num_nodos*num_nodos+1;l++) { *(nodos_adyacentes+l)=0; } for(h=1;h<=num_nodos;h++) { for(i=1;i<=3;i++) { for(j=1;j<=num_elem;j++) { if(nodo_local[i][j]==h) { for(k=1;k<=3;k++) { *(nodos_adyacentes+((h-1)*num_nodos)+nodo_local[k][j])=1* (nodo_local[k][j]!=h); printf("Nodos adyacentes[%d][%d] = %d\n",h, nodo_local[k][j],*(nodos_adyacentes+((h-1)*num_nodos)+ nodo_local[k][j])); if(wherey()==20) teclazo(); } } } } } for(i=1;i<3;i++) { free(nodo_local[i]); } teclazo(); } establece_potenciales_extremos() { int i; for(i=1;i<=num_nodos;i++) { if(i==1) { potencial_mayor=potencial[i]; potencial_menor=potencial[i]; } if(potencial[i]>potencial_mayor) potencial_mayor=potencial[i]; if(potencial[i]<potencial_menor) potencial_menor=potencial[i]; } printf("El potencial mayor es: %E\n",potencial_mayor); printf("El potencial menor es: %E\n",potencial_menor); teclazo(); } establece_espaciamiento() { int i; bases=(float *)malloc((num_lineas+1)*sizeof(float)); if(!bases) exit(1); espaciamiento=(potencial_mayor-potencial_menor)/num_lineas; teclazo(); for(i=1;i<=num_lineas;i++) { bases[i]=potencial_mayor-espaciamiento*(i-1); printf("Bases [%d] = %E\n",i,bases[i]); } teclazo(); } establece_tipo_de_elemento() { long int k; int j; float pendiente; tipo_de_elemento=(char *)malloc((num_nodos*num_nodos+1)*sizeof(char)); if(!tipo_de_elemento) exit(1); for(k=0;k<num_nodos*num_nodos+1;k++) { *(tipo_de_elemento+k)=0; } pendientes=(float *)malloc((num_nodos*num_nodos+1)*sizeof(float)); if(!pendientes) exit(1); for(i=0;i<num_nodos*num_nodos+1;i++) { *(pendientes+i)=0; } for(i=0;i<=num_nodos;i++) { for(j=i+1;j<=num_nodos;j++) { if(*(nodos_adyacentes+(i*num_nodos)+j)==1) { if(x[i+1]-x[j]==0) { *(tipo_de_elemento+(i*num_nodos)+j)=1; continue; } if(y[i+1]-y[j]==0) { *(tipo_de_elemento+(i*num_nodos)+j)=2; continue; } pendiente=(y[i+1]-y[j])/(x[i+1]-x[j]); *(pendientes+(i*num_nodos)+j)=pendiente; if(pendiente>0) { *(tipo_de_elemento+(i*num_nodos)+j)=3; } if(pendiente<0) { *(tipo_de_elemento+(i*num_nodos)+j)=4; } } } } for(i=0;i<=num_nodos;i++) { for(j=i+1;j<=num_nodos;j++) { printf("Tipo de elemento [%d][%d] = %d\n" ,i+1,j,*(tipo_de_elemento+(i*num_nodos)+j)); } teclazo(); } for(i=0;i<=num_nodos;i++) { for(j=i+1;j<=num_nodos;j++) { printf("Pendiente de elemento [%d][%d] = %f\n" ,i+1,j,*(pendientes+(i*num_nodos)+j)); } teclazo(); } } organiza_datos_elementos() { puntos_en_linea=(int *)malloc((num_lineas+1)*sizeof(int)); if(!puntos_en_linea) exit(1); for(i=1;i<=num_lineas;i++) { *(puntos_en_linea+i)=0; } for(i=1;i<=num_lineas;i++) { x_linea[i]=(float *)malloc(sizeof(float)); if(!x_linea[i]) exit(1); y_linea[i]=(float *)malloc(sizeof(float)); if(!y_linea[i]) exit(1); } for(i=0;i<=num_nodos;i++) { for(j=i+1;j<=num_nodos;j++) { if(*(nodos_adyacentes+(i*num_nodos)+j)==1) { if(potencial[i+1]>potencial[j]) { potencial_mayor=potencial[i+1]; potencial_menor=potencial[j]; } else if(potencial[i+1]<potencial[j]) { potencial_mayor=potencial[j]; potencial_menor=potencial[i+1]; } if(potencial[i+1]==potencial[j]) { potencial_mayor=potencial_menor= potencial[i+1]; } printf("Elemento %d %d\n",i+1,j); printf("El potencial mayor es %E\n",potencial_mayor); printf("El potencial menor es %E\n",potencial_menor); if(x[i+1]>x[j]) { x_mayor=x[i+1]; x_menor=x[j]; } else if(x[i+1]<x[j]) { x_mayor=x[j]; x_menor=x[i+1]; } if(x[i+1]==x[j]) { x_mayor=x_menor=x[i+1]; } if(y[i+1]>y[j]) { y_mayor=y[i+1]; y_menor=y[j]; } else if(y[i+1]<y[j]) { y_mayor=y[j]; y_menor=y[i+1]; } if(y[i+1]==y[j]) { y_mayor=y_menor=y[i+1]; } printf("Coordenada x mayor %E\n",x_mayor); printf("Coordenada x menor %E\n",x_menor); printf("Coordenada y mayor %E\n",y_mayor); printf("Coordenada y menor %E\n",y_menor); teclazo(); if(x_mayor>x_max) x_max=x_mayor; if(y_mayor>y_max) y_max=y_mayor; for(k=1;k<=num_lineas;k++) { if(potencial_mayor<=bases[k] && potencial_mayor>=bases[k+1]) { potencial_base=bases[k]; l=k; continue; } } if(*(tipo_de_elemento+(i*num_nodos)+j)==1) { elemento_vertical(); } if(*(tipo_de_elemento+(i*num_nodos)+j)==2) { elemento_horizontal(); } if(*(tipo_de_elemento+(i*num_nodos)+j)==3) { elemento_inclinado_derecha(); } if(*(tipo_de_elemento+(i*num_nodos)+j)==4) { elemento_inclinado_izquierda(); } } } } free(x); free(y); } elemento_vertical() { int veces; float cte; float argum1; float argum2; float referencia; k=l; printf("Esta es la subrutina para elemento vertical \n"); printf("El potencial base es : %E\n",potencial_base); argum2=potencial_mayor-potencial_menor; if(argum2==0) { teclazo(); return; } referencia=potencial_mayor; potencial_mayor=potencial_base; printf("Coordenadas x1,y1 x2,y2 del elemento %d - %d : %2.2f,%2.2f %2.2f,%2.2f\n",i+1,j,x[i+1],y[i+1],x[j],y[j]); argum1=pow((y_mayor-y_menor),2); cte=sqrt(argum1)/argum2; for(l=1;l<=num_lineas;l++) { for(veces=1;potencial_mayor-veces*espaciamiento>=potencial_menor; veces++) { *(puntos_en_linea+k)+=1; x_linea[k]=(float *)realloc(x_linea[k], (puntos_en_linea[k]+1)*sizeof(float)); if(!x_linea[k]) exit(1); y_linea[k]=(float *)realloc(y_linea[k], (puntos_en_linea[k]+1)*sizeof(float)); if(!y_linea[k]) exit(1); x_linea[k][puntos_en_linea[k]]=x_menor; y_linea[k][puntos_en_linea[k]]=y_menor+ ((referencia-(potencial_mayor-espaciamiento*veces))*cte); printf("Coordenadas punto %E : %E %E\n", (potencial_mayor-espaciamiento*veces), x_linea[k][puntos_en_linea[k]], y_linea[k][puntos_en_linea[k]]); k++; if(potencial_mayor-veces*espaciamiento>=potencial_menor) { l=num_lineas; continue; } } } teclazo(); } elemento_horizontal() { int veces; float cte; float argum1; float argum2; float referencia; k=l; printf("Esta es la subrutina para elemento horizontal \n"); printf("El potencial base es : %E\n",potencial_base); argum2=potencial_mayor-potencial_menor; if(argum2==0) { teclazo(); return; } referencia=potencial_mayor; potencial_mayor=potencial_base; printf("Coordenadas x1,y1 x2,y2 del elemento %d - %d : %2.2f,%2.2f %2.2f,%2.2f\n",i+1,j,x[i+1],y[i+1],x[j],y[j]); argum1=pow((x_mayor-x_menor),2); cte=sqrt(argum1)/argum2; for(l=1;l<=num_lineas;l++) { for(veces=1;potencial_mayor-veces*espaciamiento>=potencial_menor; veces++) { *(puntos_en_linea+k)+=1; x_linea[k]=(float *)realloc(x_linea[k], (puntos_en_linea[k]+1)*sizeof(float)); if(!x_linea[k]) exit(1); y_linea[k]=(float *)realloc(y_linea[k], (puntos_en_linea[k]+1)*sizeof(float)); if(!y_linea[k]) exit(1); x_linea[k][puntos_en_linea[k]]=x_menor+ ((referencia-(potencial_mayor-espaciamiento*veces))*cte); y_linea[k][puntos_en_linea[k]]=y_menor; printf("Coordenadas punto %E : %E %E\n", (potencial_mayor-espaciamiento*veces), x_linea[k][puntos_en_linea[k]], y_linea[k][puntos_en_linea[k]]); k++; if(potencial_mayor-veces*espaciamiento>=potencial_menor) { l=num_lineas; continue; } } } teclazo(); } elemento_inclinado_derecha() { int veces; float cte; float argum1; float argum2; float referencia; float inclinacion; k=l; printf("Esta es la subrutina para elemento inclinado a la derecha\n"); printf("El potencial base es : %E\n",potencial_base); inclinacion=atan(*(pendientes+(i*num_nodos)+j)); argum2=potencial_mayor-potencial_menor; if(argum2==0) { teclazo(); return; } referencia=potencial_mayor; potencial_mayor=potencial_base; printf("Coordenadas x1,y1 x2,y2 del elemento %d - %d : %2.2f,%2.2f %2.2f,%2.2f\n",i+1,j,x[i+1],y[i+1],x[j],y[j]); argum1=pow((x_mayor-x_menor),2)+pow((y_mayor-y_menor),2); cte=sqrt(argum1)/argum2; for(l=1;l<=num_lineas;l++) { for(veces=1;potencial_mayor-veces*espaciamiento>=potencial_menor; veces++) { *(puntos_en_linea+k)+=1; x_linea[k]=(float *)realloc(x_linea[k], (puntos_en_linea[k]+1)*sizeof(float)); if(!x_linea[k]) exit(1); y_linea[k]=(float *)realloc(y_linea[k], (puntos_en_linea[k]+1)*sizeof(float)); if(!y_linea[k]) exit(1); x_linea[k][puntos_en_linea[k]]=x[i+1]+ ((referencia-(potencial_mayor-espaciamiento*veces))*cte* cos(inclinacion)); y_linea[k][puntos_en_linea[k]]=y[i+1]+ ((referencia-(potencial_mayor-espaciamiento*veces))*cte* sin(inclinacion)); printf("Coordenadas punto %E : %E %E\n", (potencial_mayor-espaciamiento*veces), x_linea[k][puntos_en_linea[k]], y_linea[k][puntos_en_linea[k]]); k++; if(potencial_mayor-veces*espaciamiento>=potencial_menor) { l=num_lineas; continue; } } } teclazo(); } elemento_inclinado_izquierda() { int veces; float cte; float argum1; float argum2; float referencia; float inclinacion; k=l; printf("Esta es la subrutina para elemento inclinado a la izquierda\n"); printf("El potencial base es : %E\n",potencial_base); inclinacion=atan(*(nodos_adyacentes+(i*num_nodos)+j)); argum2=potencial_mayor-potencial_menor; if(argum2==0) { teclazo(); return; } referencia=potencial_mayor; potencial_mayor=potencial_base; if(y[i+1]>y[j] && potencial[i+1]<potencial[j]) referencia=potencial_menor; printf("Coordenadas x1,y1 x2,y2 del elemento %d - %d : %2.2f,%2.2f %2.2f,%2.2f\n",i+1,j,x[i+1],y[i+1],x[j],y[j]); argum1=pow((x_mayor-x_menor),2)+pow((y_mayor-y_menor),2); cte=sqrt(argum1)/argum2; for(l=1;l<=num_lineas;l++) { for(veces=1;potencial_mayor-veces*espaciamiento>=potencial_menor; veces++) { *(puntos_en_linea+k)+=1; x_linea[k]=(float *)realloc(x_linea[k], (puntos_en_linea[k]+1)*sizeof(float)); if(!x_linea[k]) exit(1); y_linea[k]=(float *)realloc(y_linea[k], (puntos_en_linea[k]+1)*sizeof(float)); if(!y_linea[k]) exit(1); x_linea[k][puntos_en_linea[k]]=x[i+1]- ((referencia-(potencial_mayor-espaciamiento*veces))*cte* cos(inclinacion)); y_linea[k][puntos_en_linea[k]]=y[i+1]+ ((referencia-(potencial_mayor-espaciamiento*veces))*cte* sin(inclinacion)); printf("Coordenadas punto %E : %E %E\n", (potencial_mayor-espaciamiento*veces), x_linea[k][puntos_en_linea[k]], y_linea[k][puntos_en_linea[k]]); k++; if(potencial_mayor-veces*espaciamiento>=potencial_menor) { l=num_lineas; continue; } } } teclazo(); } ordena() { for(i=1;i<=num_lineas;i++) { quicksort(1,puntos_en_linea[i]); } } quicksort(int izq, int der) { int j,k; float x,y,y1; j=izq; k=der; x=x_linea[i][(izq+der)/2]; do { while(x_linea[i][j]<x && k<=der) j++; while(x<x_linea[i][k] && k>izq) k--; if(j<=k) { y=x_linea[i][j]; y1=y_linea[i][j]; x_linea[i][j]=x_linea[i][k]; y_linea[i][j]=y_linea[i][k]; x_linea[i][k]=y; y_linea[i][k]=y1; j++; k--; } } while(j<=k); if(izq<k) quicksort(izq,k); if(j<der) quicksort(j,der); } inicia_graficos() { int graphmode; int graphdriver; graphdriver=DETECT; initgraph(&graphdriver,&graphmode,""); graf_max_x=getmaxx(); escala_x=(float)(graf_max_x/x_max); graf_max_y=getmaxy(); escala_y=(float)(graf_max_y/y_max); modo_grafico=getgraphmode(); } grafica_lineas() { int origen_x,origen_y; int siguiente_x,siguiente_y; for(i=1;i<=num_lineas;i++) { origen_x=(int)(x_linea[i][1]*escala_x); origen_y=(graf_max_y-(int)(y_linea[i][1]*escala_y)); moveto(origen_x,origen_y); for(j=2;j<=puntos_en_linea[i];j++) { siguiente_x=(int)(x_linea[i][j]*escala_x); siguiente_y=(graf_max_y-(int)(y_linea[i][j]*escala_y)); lineto(siguiente_x,siguiente_y); } } getch(); closegraph(); clrscr(); teclazo(); } teclazo() { printf("\nPresione una tecla para continuar ... "); getch(); clrscr(); }