tesis.c



#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();

}