Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: petit_cm en 26 Marzo 2017, 13:14 PM

Título: Ayuda para resolver el programa
Publicado por: petit_cm en 26 Marzo 2017, 13:14 PM
Por favor, alguien podría ayudarme a realizar un código C que resuelva el siguiente problema? Necesito vuestra ayuda

"Realiza una función que, dado un punto en el plano, un radio y un número de lados, devuelva un vector con los vértices de un polígono regular con tales lados y radio, centrado en el punto dado. "
Título: Re: Ayuda para resolver el programa
Publicado por: MAFUS en 26 Marzo 2017, 13:39 PM
¿Cómo vas de trigonometría?  :huh:
Título: Re: Ayuda para resolver el programa
Publicado por: petit_cm en 26 Marzo 2017, 18:09 PM
Bueno trigonometria me defiendo, pero esta funcion si sabes hacerla te agradeceria muchisimo que me pasases el codigo.
Muchas graciaas
Título: Re: Ayuda para resolver el programa
Publicado por: ivancea96 en 26 Marzo 2017, 18:35 PM
~No se hacen tareas~

Empieza por obtener la ecuación para sacar los puntos.
Luego, solo es copiarla a C y agregar un par de formalidades de cualquier lenguaje de programación.
Título: Re: Ayuda para resolver el programa
Publicado por: MAFUS en 26 Marzo 2017, 23:16 PM
Así es. Como dice Ivancea96 no se hacen tareas. Ajudamos a realizarlas, pero ofrecemos códigos hechos.
Título: Re: Ayuda para resolver el programa
Publicado por: petit_cm en 27 Marzo 2017, 20:27 PM
La principal duda que tengo es la función matemática para calcular la posición de los vertices a partir de el centro, el radio y el número de lados. Si me podeis ayudar a obtenerla, a partir de ahi puedo empezar a trabajar.
Título: Re: Ayuda para resolver el programa
Publicado por: engel lex en 27 Marzo 2017, 20:28 PM
CitarLa principal duda que tengo es la función matemática para calcular la posición de los vertices a partir de el centro, el radio y el número de lados.

que no sabes? muestra lo que has intentado y donde tienes la falla/duda
Título: Re: Ayuda para resolver el programa
Publicado por: petit_cm en 27 Marzo 2017, 20:32 PM
Como obtener la posición del vértice a partir del radio, número de lados y el centro. No se como plantear la ecuación que me de como resultado esa posición.
Título: Re: Ayuda para resolver el programa
Publicado por: engel lex en 27 Marzo 2017, 20:39 PM
no me dices nada...

que no sabes plantear de la ecuación? (muestra la ecuación)
Título: Re: Ayuda para resolver el programa
Publicado por: petit_cm en 27 Marzo 2017, 20:43 PM
Esto seria correcto para obtener las posiciones cartesianas x e y de cada vertice del poligono en un plano?

alpha = 360 / cantidad de lados del poligono
radian = 180/PI 
xc + radio*cos(angulo/radian)
yc + radio*sin(angulo/radian)
angulo = angulo+alpha
Título: Re: Ayuda para resolver el programa
Publicado por: engel lex en 27 Marzo 2017, 20:48 PM
quien es xc y yc? los sumas, pero no los asignas
Título: Re: Ayuda para resolver el programa
Publicado por: ivancea96 en 27 Marzo 2017, 21:09 PM
Cita de: petit_cm en 27 Marzo 2017, 20:43 PM
Esto seria correcto para obtener las posiciones cartesianas x e y de cada vertice del poligono en un plano?

alpha = 360 / cantidad de lados del poligono
radian = 180/PI 
xc + radio*cos(angulo/radian)
yc + radio*sin(angulo/radian)
angulo = angulo+alpha

Es correcto. Y aquí es donde entra la parte de programación. Tienes que sacar N vértices, no 1. Así que tendrás que hacer esas ecuaciones N veces (bucle for).

Código (cpp) [Seleccionar]
angulo = angulo+alpha;
Haces eso tras cada cálculo, y calculas el siguiente, sin más. Ya lo tienes.

Como detalle, las funciones cos() y sin() son de la librería <math.h>. A parte de eso, no deberías tener más problemas.
Haz el programa, y si te encuentras con algún otro problema, coméntalo y pasa el código.

Por cierto, los códigos ponlos en las etiquetas GeSHi (al hacer el mensaje, tienes arriba para colocarlas)
Título: Re: Ayuda para resolver el programa
Publicado por: petit_cm en 30 Marzo 2017, 17:00 PM
He hecho esta función para calcular la coordenadas x e y de los vértices, pero no funciona y se que no esta bien hecha, me podéis ayudar a corregir los errores o decirme lo que falte? Muchas gracias

v[0]  es la coordenada x del centro, v[1]  es la coordenada y del centro, v[2] el radio y t el numero de lados.
Programa hecho en lenguaje C


void vertices(double *v, double *res, int t){
int i;

double angulo;
angul==0;

double alpha;
alpha==360/ t;

double radian;
radian=180/3.1416;

for(i=0;i<t; i=i+1){

res[i]= v[0]+v[2]*cos(angulo/radian);
angulo=angulo + alpha;

}
for(i=0;i<t; i=i+1){

res[i]= v[1]+v[2]*sin(angulo/radian);
angulo=angulo + alpha;

}

Título: Re: Ayuda para resolver el programa
Publicado por: ivancea96 en 30 Marzo 2017, 22:48 PM
Varios detalles...
En primer lugar, trata de ver los errores que te da el compilador, para corregir lo más básico:

Pusiste angul en evz de angulo en la línea 5.
Luego, pusiste angulo==0;. Eso no es una asignación, eso es una comparación. Una asignación es, como pusiste en los fors, 1 solo signo igual:
angulo = 0;
Lo mismo en la línea 8.

Luego... ¿Cómo quieres que sea la respuesta?
En primer lugar, voy a suponer que a la función le pasas un array double* ya lleno y de tamaño t*2. Presupondré también que la respuesta es {x1, y1, x2, y2,... xN, yN}. Fíjate que en el segundo for, estás sobreescribiendo el array (por tanto, deshaciendo el trbaajo dle primer for).

Tal vez quisieras algo así (con 1 for te llega):
for(i=0;i
Título: Re: Ayuda para resolver el programa
Publicado por: petit_cm en 30 Marzo 2017, 22:52 PM
Mi programa es este, consigo obtener un vertice, pero los valores x e y de este no son correctos y no consigo que muestre en pantalla todos los vertices, solo muestra uno, el primero. Hasta la linia 75 funciona correctamente.  A partir de ahi no se obtiene el resultado deseado.




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

#define TAM 100

// Prototipos de las funciones
int leeIVector(int *v, int max);
int leeDVector(double *v, int max);
int leeIVector2(int *v, int max);
int leeDVector2(double *v, int max);
void escIVector(int *v, int l);
void escDVector(double *res,double *ress, int t);
void vertices(double *v, double *res, int t);
void vertices2(double *v, double *ress, int t);


//Funcion main
int main()
{
int l, v[100];
double vd[100];
double res[100];
double ress[100];
double x;


// Hacemos los mismo con el de reales
l = leeDVector2(vd, 100);

vertices(vd,res, l);

vertices2(vd,ress,1);

escDVector(res,ress,1);







// Nada puede ir mal
exit(EXIT_SUCCESS);
}

//Funcion para introducir datos
int leeDVector2(double *v, int max)
{
char aux[200];
int t;

printf("Introduce la coordenada x del punto:");
fgets(aux, TAM - 1, stdin);
v[0] = atof(aux);

printf("Introduce la coordenada y del punto:");
fgets(aux, TAM - 1, stdin);
v[1] = atof(aux);

printf("Introduce el radio:");
fgets(aux, TAM - 1, stdin);
v[2] = atof(aux);

printf("Introduce numero de lados:");
fgets(aux, TAM - 1, stdin);
t = atof(aux);


return t;
}

//Funcion calculo vertices

void vertices(double *v, double *res, int t){
int i;

double angulo;


double alpha;
alpha=360/ t;

double radian;
radian=180/3.1416;

double cos(double x);

for(i=0;i<t; i=i+1){

res[i]= v[0]+v[2]*cos(angulo/radian);

angulo=angulo +alpha;
}
}

void vertices2(double *v, double *ress, int t){
int i;

double angulo;


double alpha;
alpha=360/ t;

double radian;
radian=180/3.1416;

double sin(double x);

for(i=0;i<t; i=i+1){

ress[i]= v[0]+v[2]*sin(angulo/radian);

angulo=angulo +alpha;

}
}

//Imprimir

void escDVector(double *res,double *ress, int t)
{
int i;

printf("\n\nVector con %d elementos:\n\n", t);
for (i = 0; i < t; i++)
printf("Elemento %d: %lf %lf\n", i + 1, res[i],ress[i]);

puts("\n"); // Lineas en blanco para que sea mas legible
}


Título: Re: Ayuda para resolver el programa
Publicado por: ivancea96 en 31 Marzo 2017, 00:09 AM
Salió cortado mi mensaje anterior :X

for(i=0; i < t; i=i+1){

res[i*2]= v[0]+v[2]*cos(angulo/radian);
res[i*2 + 1]= v[1]+v[2]*sin(angulo/radian);
angulo=angulo + alpha;

}


Y conrespecto a tu código de ahora... Donde calculas el Y, pusiste v[0] en vez de v[1].