C/Visual C - Ayuda urgente Proyecto de Fin de Grado

 
Vista:
sin imagen de perfil

Ayuda urgente Proyecto de Fin de Grado

Publicado por David (2 intervenciones) el 27/08/2016 13:39:58
Necesito crear un programa en C con el que se genere el Triangulo de Sierpinski como proyecto final de carrera. había pensado en un programa que el usuario indique las iteraciones que quiera que tenga el triangulo y éste se genere aleatóriamente a partir del comando rand(time(NULL)). Posteriormente que los puntos generados se incluyan en un fichero y que los puntos se representen a partir de Gnuplot. Normalmente se denomina Juego del Caos.
El problema está en que he intentado crearlo y no se ni por donde cogerlo, y necesitaria alguien que me diera consejos de como poder realizar la tarea.
Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Aarón Castillo
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Ayuda urgente Proyecto de Fin de Grado

Publicado por Aarón Castillo (20 intervenciones) el 27/08/2016 21:04:22
Muestra lo que hayas escrito de código hasta ahora o bien el pseudocódigo y con gusto te ayudamos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda urgente Proyecto de Fin de Grado

Publicado por David (2 intervenciones) el 04/09/2016 18:01:56
Por ahora este es el programa. En sí funciona, pero me gustaria saber como hacer para pedir al usuario el punto inicial que quiera y comprobar si este pertenece al triángulo. Por otra parte, me gustaria que el propio programa hiciera que gnuplot lo representase directamente, y no teniendo que abrir el programa una vez compuesto el fichero.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*----------------------*/
/*    JOC DEL CAOS      */
/*----------------------*/
 
/*INCLUSIONS*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
 
/*ESTRUCTURES*/
typedef struct{
        double x,y;
}punt;
 
 
int main(void) {
	int a;
	char nom [60];
	int it;
	int aux;
	int vert;
	FILE *fit;
	punt e1;
	punt e2;
	punt e3;
	punt pm;
	punt pi;
 
	e1.x = 0;
	e1.y = 0;
 
	e2.x = 0;
	e2.y = 1;
 
	e3.x = 1;
	e3.y = 0;
 
	pi.x = 0;
	pi.y = 0;
 
	srand(time(NULL));
	/*OBRIR ARXIU*/
 
        printf("Nom arxiu: \n");
        scanf(" %[^\n]s",nom);
        fit=fopen(nom,"w");
        if(fit==NULL){
                printf("Error en el fopen de l'arxiu...\n\n");
                exit(1);
        }
 
 
/*ITERACIONS*/
 
        printf("Número d'iteracions desitjades: ");
        scanf("%d",&it);
        printf("\n\n");
 
        for(aux=0;aux<50;aux++){
                vert=rand() % 3;
                vert++;
                printf("%d - %d: ",aux,vert);
                if(vert==1){
                        pm.x=(pi.x+e1.x)/2.;
                        pm.y=(pi.y+e1.y)/2.;
                        pi.x=pm.x;pi.y=pm.y;
                        printf("%le , %le\n",pm.x,pm.y);
                }else{
                        if(vert==2){
                                pm.x=(pi.x+e2.x)/2.;
                                pm.y=(pi.y+e2.y)/2.;
                                pi.x=pm.x;pi.y=pm.y;
                                printf("%le , %le\n",pm.x,pm.y);
                        }else{
                                pm.x=(pi.x+e3.x)/2.;
                                pm.y=(pi.y+e3.y)/2.;
                                pi.x=pm.x;pi.y=pm.y;
                                printf("%le , %le\n",pm.x,pm.y);
                        }
                }
        }
 
        for(aux=0;aux<=it;aux++){
                vert=rand() % 3;
                vert++;
                if(vert==1){
                        pm.x=(pi.x+e1.x)/2.;
                        pm.y=(pi.y+e1.y)/2.;
                        pi.x=pm.x;pi.y=pm.y;
                        fprintf(fit,"%le %le\n",pm.x,pm.y);
                }else{
                        if(vert==2){
                                pm.x=(pi.x+e2.x)/2.;
                                pm.y=(pi.y+e2.y)/2.;
                                pi.x=pm.x;pi.y=pm.y;
                                fprintf(fit,"%le %le\n",pm.x,pm.y);
                        }else{
                                pm.x=(pi.x+e3.x)/2.;
                                pm.y=(pi.y+e3.y)/2.;
                                pi.x=pm.x;pi.y=pm.y;
                                fprintf(fit,"%le %le\n",pm.x,pm.y);
                        }
                }
 
        }
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aarón Martín
Val: 75
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Ayuda urgente Proyecto de Fin de Grado

Publicado por Aarón Martín (20 intervenciones) el 18/09/2016 23:59:35
Hola, disculpa la demora, espero no sea muy tarde aún.
Paso a paso comentamos las inquietudes que tenías:

Primero, para verificar que un punto esté dentro del triángulo, yo usé un poco de geometría básica aclarando que esta fue la solución que di cuando estaba en la universidad, de modo que si encuentras algo para mejorar, bienvenidas sean las sugerencias.

Te adjunto una imagen que imprime mi programa del triángulo de Sierpinski.

Fractal

Lo primero que notarás es que "recargué" el triángulo hacia el lado izquierdo, ésto con la finalidad de facilitar las operaciones de verificación de puntos dentro del triángulo, así como la impresión gráfica.

Ahora, los vértices en mi triángulo siempre serán el origen O(0,0), el P1(0,100) y el P2(100,0), es decir, los catetos del triángulo son de tamaño 100, esto se lo puse arbitrariamente.

Entonces para saber si un punto vive dentro del triángulo o no, primero tienes que encontrar la ecuación de la recta que pasa por los puntos P1 y P2 (línea rosa), ya que esa recta servirá como el límite para identificar a los puntos válidos.

Una vez identificada la recta (es muy sencillo averiguarla), ahora debes averiguar cuál es la distancia del punto O a la recta P1P2 (llámale d1, línea verde), ya que esta es la distancia máxima que puede ser permitida para que el punto viva dentro del triángulo.

Pero esta condición no es suficiente, tienes que hacer los pasos anteriores para calcular la distancia del punto P1 a la recta OP2 (llámale d2, línea roja) y del punto P2 a la recta OP1 (llámale d3, línea azul).

He colocado en la imagen la fórmula para calcular la distancia de un punto a una recta.

Finalmente cualquier punto que quieras solicitar no deberá pasar de estas distancias con respecto de los vértices, es decir, supón que el punto que pediste al usuario se llama K, así:

d(O,K) <= d1
d(P1,K) <= d2
d(P2,K) <= d3

Como podrás notar, el hecho de haber colocado el triángulo del lado izquierdo sirvió de mucho pues así me ahorré muchas operaciones, ahora que si quieres centrar el triángulo la misma idea prevalece pero deberías hacer traslaciones en los ejes coordenados y las operaciones se complican un poco.

Con respecto de gnuplot, no estoy muy familiarizado con la herramienta, pero por lo que entiendo tu problema es que guardas tus puntos en un archivo y luego una vez terminado el programa ejecutas gnuplot, sin embargo lo que quieres es que se creen y grafiquen los puntos en una sola ejecución.
Lo que te puedo decir es que C tiene formas de ejecutar comandos exteriores, usando la instrucción exec por ejemplo; de hecho leyendo un poco encontré esta liga de utilidad, parece que resuelve lo que pides.

https://sushpa.wordpress.com/2008/05/29/calling-gnuplot-from-within-c-or-python/

Si necesitas ayuda estoy a tus órdenes.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar