PDA

Ver la versión completa : gráficos de polinomios



rower
27-08-2006, 01:23
hola, en mi curso de la facultad me pidieron que haga un programa que resuelva polinomios de interpolación por diferentes métodos, lagrange por ejemplo, y que los grafique, mi duda es: qué tengo que utilizar, en c o en vb, para poder graficar el polinomio? no quiero saber cómo se hace, sino qué tengo que investigar para poder graficar un polinomio, si tengo que usar alguna librería o api de windows o no se, algo de eso, muchas gracias!

Polimeron
27-08-2006, 09:44
Si lo haces en C y ademas lo haces bajo linux, las graficas las puedes hacer con gnu plot.

rower
27-08-2006, 18:48
mmmm no, en windows tiene que correr

gondar_f
27-08-2006, 19:29
En visual Basic es relativamente sencillo. Puedes dibujar directamente encima de un formulario, pero mejor que lo hagas sobre un control PictureBox.
Para ello se usan ciertos métodos gráficos, como:
Print
PSet
Line
Circle
...

En C de consola tambien es relativamente fácil, solo es cuestión de pasarse a modo grafico y utilizar funciones equivalentes a las que hay en VB. Pero si te soy sincero, mejor que lo hagas en VB.

PD: esto es referido al Visual Basic 6, en cuanto al VB.NET no tengo ni idea si aun funcionan.

r9200se
27-08-2006, 19:31
Si, es mejor que uses VB. Si tienes muchas dudas te puedo pasar algun ejemplo de la utilización de métodos gráficos.

rower
27-08-2006, 23:03
ok, voy a intentar en VB

gondar_f
28-08-2006, 17:37
Suerte, cualquier duda, ya sabes donde estamos.

rower
01-09-2006, 03:51
nuevamente, al final tengo que hacerlo en C nomás, para el tema de los gráficos se que tengo que usar la librería graphics.h, ahora bien, estuve buscando en google pero no encontré mucho y ya estoy medio frustrado, alguien sabe alguna página donde pueda encontrar (explicadas), las funciones de esa librería? para ver si encuentro la que me ayude a graficar un maldito polinomio, gracias :0=

smaug_
01-09-2006, 09:45
No se si te serviran, y es lo que quieres, pero es lo que he encontrado. Suerte ^^

http://www.sromero.org/articulos/#gfx
http://sarien.sourceforge.net/sourcedoc/graphics_8h-source.html
http://sarien.sourceforge.net/sourcedoc/graphics_8h.html

rower
03-09-2006, 16:04
otro problema (Estoy alternando entre el gráfico y esto, es lo que me falta): para graficar el polinomio de interpolacion, los puntos me los pasan en un arch .txt de la forma {X1,Y1},{X2,Y2},......,{Xn,Yn}, yo creo que lo que necesito es tratar el arch como una secuencia de caracteres, es decir, por ejemplo, que me vaya avanzando caracteres mientras encuentre "{" o "}" o ",", si no avanza más, es porque estoy parado en un número, y de ahí, almacenarlo en una lista por ejemplo, vi la función fgetc(), que me lee un caracter, pero necesito, como dije, ir tomando determinados caracteres, existe alguna función que pueda hacer esto?

Giskard
04-09-2006, 05:50
Tengo un sencillo programa hecho en Visual c++ que precisamente grafica cualquier polinomio que escribas y en el rango que le des, aunque ese proyecto lo hice para la materia de compiladores por lo que encontrarás mucho código de análisis gramático y análisis lexicográfico que talvez no necesites.
La forma en la que dibuja la funcion es pasándola de infija a posfija (usando pilas) para irle dando valores a x e irlos graficando, talvez pueda servirte de guía para lo que quieres.

rower
05-09-2006, 01:42
mmmm no se si es taanto, sería graficar nomás un polinomio, necesitaria nombres de funciones nomás, me gustaría llegar a hacerlo solo, y otra cosa es lo de las cadenas de caracteres, como dije en el post anterior, como puedo contar caracteres de una cadena?

Giskard
05-09-2006, 02:46
para saber si un caracter es número o letra debes poner la siguiente condición
if(caracter >= '0' && caracter <='9')
de esta forma la función if regresará verdadero cuando el caracter sea un número y regresará falso cuando no sea número, este if lo puedes meter en un ciclo que vaya checando caracter por caracter, después con la función "atoi" (alfa to integer) conviertes esa cadena a un número entero para que puedas manipularlo.
Cualquier duda estamos para ayudarte, saludos

rower
05-09-2006, 04:49
ahhh, ahí está, cada vez estoy mas cerca. Estuve probando, pero el atoi se usa char* letra; int x:
x = atoi (letra);
pero el problema es que yo tengo definido sin puntero, es decir char letra, y me da un warning y no me funciona el programa, no se puede usar el atoi de esta forma?

smaug_
05-09-2006, 10:30
después con la función "atoi" (alfa to integer) conviertes esa cadena a un número entero para que puedas manipularlo.
Yo no se mucho de C, pero char*letra normalmente se suele referir mas a un array de caracteres, vamos una cadena. Mete todos los numeros primero en una array de caracteres y luego se lo pasas como parametroa "atoi()".

rower
05-09-2006, 15:20
lo que pasa es que para eso tengo que definir un array, y yo no se cuantos números voy a tener en el fichero, y no voy a sobredimensionar el array, entonces, mi idea era en una variable caracter ir guardando caracter por caracter del fichero, si era número, lo convierto a entero con atoi(); pero ahí me da error, y también cuando uso strcat(), eso solo para concatenar strings? yo quiero concatenar un string con un caracter, no se puede?

Polimeron
06-09-2006, 12:09
Pues según lo que estaba mirando, la forma mas facil para que funcione atoi() es a traves de los arrays y como no quieres gastar memoria innecesaria en c lo puedes hacer reservando memoria para un caracter con malloc/calloc y luego con cada lectura hacer un realloc para expandir el array. Es menos eficiente evidentemente pero bueno, creo que funcionaria. De todas formas esto seria mucho mas facil implementarlo en c++ por el manejo de la memoria dinámica. Otra forma es realizandolo de tu forma; lees cada caracter pero declarando puntero a caracter y realizando conversion, no tiene porque ser un array(aunque si parece mas facil como dije):

#include <stdio.h>
#include <stdlib.h>

int main()
{
char *numPtr = "1";

printf( "Convirtiendo la cadena \"%s\" en un numero: %d\n", numPtr, atoi(numPtr) );
system("PAUSE");
return 0;
}


Saludos.

rower
06-09-2006, 15:01
después de muchos intentos fallidos me salió esta dichosa función, les agradezco por haberme ayudado, :D

rower
08-09-2006, 15:47
ahora con mi último tema, estoy con el gráfico del polinomio, con este código:

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

void inicio(void)
{
int gdriver = DETECT, /* Que detecte qué pantalla tengo */
gmode, codError; /* Modo gráfico, código de error */

initgraph(&gdriver, &gmode, ""); /* Intento pasar a modo gráfico */
codError = graphresult(); /* Miro si hay error */
if (codError != grOk) /* Si lo hay... */
{
printf("Error de gráficos: %s\n", /* Aviso */
grapherrormsg(codError)); /* Muestro el error */
printf("Pulse una tecla para salir...");
getch(); /* Espero */
exit(1); /* y abandono el programa */
}

}

int main(void) /* Cuerpo del programa */
{
int xmax, ymax; /* Variables locales: aquí guardaré
las coordenadas máximas de la pantalla */
float x,y; /* x es la primera coordenada de los puntos,
que recorreré con bucle "for"; y es la
segunda coordenada, calculada */

int xPant,yPant; /* Coordenadas que se veran en pantalla, una
vez escaladas y desplazadas */

float xIni, xFin, /* Limites de visualizacion */
escalaX, escalaY, /* Escala en X (calculada) y en Y (fijada) */
despX, despY, /* Desplaz en X (calculado) y en Y (fijado) */
xIncr; /* Incremento en X (inversa de la escala) */

inicio(); /* Paso a modo gráfico */

xmax = getmaxx(); /* Miro cuales son las coordenadas */
ymax = getmaxy(); /* máximas de la pantalla */

xIni = -10; /* Limites a usar en el eje X */
xFin = 10;

escalaX = xmax / (xFin-xIni); /* Escala en X (calculada) */
escalaY = 10; /* Escala en Y (prefijada) */

despX = xmax/2; /* Desplazamiento en pantalla del (0,0) */
despY = ymax/2;
xIncr = 1/escalaX;

/* Dibujo el eje de abcisas (X) */
setcolor(YELLOW);
moveto (0, despY);
linerel (xmax,0);

/* Dibujo el eje de ordenadas (Y) */
setcolor(YELLOW);
moveto (despX, 0);
linerel (0,ymax);


for (x=xIni; x<xFin; x+=xIncr)
{ /* Coordenada x: recorro toda la pantalla */
y = x*x -2*x - 10; /* Función a dibujar: Y = X^2 - 2x +10 */
xPant = (int) ( x*escalaX + despX );
yPant = (int) ( - y*escalaY + despY );
putpixel(xPant,yPant,WHITE); /* y muestro cada punto */
}

getch(); /* Espero a que se pulse una tecla */
closegraph(); /* Y termino con el modo gráfico */
return 0;
}


pero en la parte marcada en negrita, en vez de usar y = x*x -2*x - 10; hago y = calculo(x); pero parece que la llamada a dicha función le hace algo, xq al poner que grafique, me tapa la mitad de la pantalla con un color gris, en cambio si pongo una operación simple, me grafica sin problemas, qué puedo hacer??
gracias

Giskard
08-09-2006, 20:19
deberías usar un debugger, poniendo un "breakpoint" en esa función para revisar instrucción por instrucción y ver dónde se encuentra el problema.

Lo difícil en la programación es encontrar los errores en un código, casi siempre me tardo más en esto que en escribirlo.

Suerte

Polimeron
09-09-2006, 19:26
Podrias enviar la función que utilizas para el calculo, para ver si existe algo raro porahi porque en el resto de codigo por lo pronto no veo fallos. Saludos

rower
09-09-2006, 19:44
ok, pongo lo q hice hasta ahora:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>

typedef
struct lista
{
int datox;
int datoy;
struct lista* prox;
} nodo;
typedef
nodo* punt;

punt carga()
{
FILE* arch;char letra;punt prim1;char string[2]; punt q; punt t; int i;char caract[10000];
arch = fopen("c:\\datos.txt","rt");
prim1 = NULL;
for (i = 1; i<=3;i++)
letra = fgetc(arch);
while (letra != EOF)
{
q = (nodo*)malloc(sizeof(nodo));
strcpy(caract,"");
while (letra != ';')
{
string[0] = letra;
string[1] ='\0';
strcat(caract,string);
letra = fgetc(arch);
}
q->datox = atoi(caract);
strcpy(caract,"");
letra = fgetc(arch);
while (letra != '}')
{
string[0] = letra;
string[1] = '\0';
strcat(caract,string);
letra = fgetc(arch);
}
q->datoy = atoi(caract);
while ((letra != '{') && (letra != EOF))
letra = fgetc(arch);
if (letra == '{')
letra = fgetc(arch);
if (prim1 == NULL)
prim1 = q;
else
t->prox = q;
q->prox = NULL;
t = q;

}
free(q);
return prim1;

}

float calculo (float k,punt prim)
{
float v;float f;int actual;
punt H;punt T;int h;

v = 1;f = 0;
H = prim; T = prim;
while (H != NULL)
{
actual = H->datox;
while (T != NULL)
{
if (actual == (T->datox))
T = T->prox;
if (T != NULL)
{
v =v * ((k-(T->datox))/(actual - (T->datox)));
T = T->prox;
}
else
break;
}
f=f+(v*(H->datoy));
H = H->prox;
T = prim;
v = 1;
}

return f;
}
void inicio()
{
int gdriver = DETECT,
gmode, codError; /* Modo gráfico, código de error */

initgraph(&gdriver, &gmode, "c:\\Tc\\BGI"); /* Intento pasar a modo gráfico */
codError = graphresult(); /* Miro si hay error */
if (codError != grOk) /* Si lo hay... */
{
printf("Error de gráficos: %s\n", /* Aviso */
grapherrormsg(codError)); /* Muestro el error */
printf("Pulse una tecla para salir...");
getch(); /* Espero */
exit(1); /* y abandono el programa */
}

}

int gra() /* Cuerpo del programa */
{
punt fo;

int xmax, ymax; /* Variables locales: aquí guardaré
las coordenadas máximas de la pantalla */
float x,y; /* x es la primera coordenada de los puntos,
que recorreré con bucle "for"; y es la
segunda coordenada, calculada */

int xPant,yPant; /* Coordenadas que se veran en pantalla, una
vez escaladas y desplazadas */

float xIni, xFin, /* Limites de visualizacion */
escalaX, escalaY, /* Escala en X (calculada) y en Y (fijada) */
despX, despY, /* Desplaz en X (calculado) y en Y (fijado) */
xIncr; /* Incremento en X (inversa de la escala) */

inicio(); /* Paso a modo gráfico */

xmax = getmaxx(); /* Miro cuales son las coordenadas */
ymax = getmaxy(); /* máximas de la pantalla */

xIni = -10; /* Limites a usar en el eje X */
xFin = 10;

escalaX = xmax / (xFin-xIni); /* Escala en X (calculada) */
escalaY = 10; /* Escala en Y (prefijada) */

despX = xmax/2; /* Desplazamiento en pantalla del (0,0) */
despY = ymax/2;
xIncr = 1/escalaX;

/* Dibujo el eje de abcisas (X) */
setcolor(YELLOW);
moveto (0, despY);
linerel (xmax,0);

/* Dibujo el eje de ordenadas (Y) */
setcolor(YELLOW);
moveto (despX, 0);
linerel (0,ymax);


for (x=xIni; x<xFin; x+=xIncr)
{ /* Coordenada x: recorro toda la pantalla */
fo = carga();
y = calculo(x,fo); /* Función a dibujar: Y = X^2 - 2x +10 */
xPant = (int) ( x*escalaX + despX );
yPant = (int) ( - y*escalaY + despY );
putpixel(xPant,yPant,WHITE); /* y muestro cada punto */
}

getch(); /* Espero a que se pulse una tecla */
closegraph(); /* Y termino con el modo gráfico */
return 0;
}

void main ()
{
float x,chebish;float valor;char tecla;float h;float f;punt w;float to;float t1;
char n;
w = carga();

printf("Ingresar el Extremo Inferior del Intervalo\n");
scanf("%f",&to);
printf("Ingresar el Extremo Superior del Intervalo\n");
scanf("%f",&t1);

do
{

printf("1.C lculo del Polinomio de Largange\n");
printf("2.C lculo de la Derivada\n");
printf("3.C lculo de la Integral\n");
printf("4.Ch‚bishev\n");
printf("5.Salir\n");
tecla = getch();
switch(tecla)
{
case '1':
{

printf("Ingresar el punto donde se calcular el Polinomio de Interpolaci¢n\n");
scanf("%f",&x);
valor = calculo(x,w);
printf("El valor del Polinomio de Interpolaci¢n en el punto %f es %f \n\a",x,valor);
getch();
gra();
break;
}
case '2':
{
printf("Ingresar el Incremento\n");
scanf("%f",&h);
f = ((4*calculo((to+h),w))-(3*calculo(to,w))-(calculo((to+(2*h)),w)))/(2*h);
printf("el valor de la derivada en %f es %f\n ",to,f);
getch();
break;
}
}
}
while (tecla != '5');
}