11/02/2009
pues mas apis
http://progression.jp/en/
es una api para poder programar aplicaciones flash sin tener que precuparse de programar ni html ni java ni javascript etc etc
http://www.libspark.org/wiki/saqoosha/FLARToolKit/en
FLex +ARToolkit
muuuy chido
http://www.seeingmachines.com/product/faceapi/
pues aru se burla pero yo digo que esta padre
lo que si debo poner en marcha es un trac
http://trac.edgewall.org/
10/31/2009
AR
http://canesta.com/
es una compañia que ya habia visto, tienen un experimento en el cual tienen un cuerpo inverso en un campo hecho de estos apartejos
3D Vision Enables Everyday Devices to "See"
bueno otras aplicaciones mas
Performance of a Time-of-Flight Range Camera for Intelligent Vehicle Safety Applications
10/30/2009
a new challanger appears
http://alternativaplatform.com/en/
y en flash
y con conectividad
y y y mejor me largo a dormir
por parte del servidor
bueno no lo he checado pero lo hare (lo juro)
http://www.smartfoxserver.com/
otro mas
http://photon.exitgames.com/
al parecer es muuuuuuy compatible con unity
bueno tambien esta neutron
Neutron® provides 24/7 game hosting and a rich-set of out-of-the-box features for the development
of multiplayer online games for PC, Mac, browser and mobile platforms including iPhone & Android.
Neutron allows game developers to easily create award winning multi-user gaming experiences while
it minimizes time-to-market and projects risks. Neutron integrates seamlessly with Photon to create
custom functionality if needed.
algo asi como un server pa ñoñear
Diseño
bueno no puedo decir mucho dle otro ;)
Bueno he encontrado esto
http://game-engine.visual3d.net/
se ve bien
en xna
2/06/2009
1/29/2009
The.Poughkeepsie.Tapes.DVDRip.XviD.2008-HOOKAH.avi
esa string venia millones de veces en un arhivo llamado asi...
odio a los trolls de emule
1/15/2009
volviendo al blog
Que tal baturros
les dejo los algoritmos A* BFS y DFS
1 // ianuevo.cpp : Defines the entry point for the console application.
2 //
3
4 #include <stdio.h>
5 #include <math.h>
6 #include <iostream>
7
8 #include <GL/gl.h>
9 #include <GL/glut.h>
10
11 #define MAXNODOS 50
12 #define MAXVERTICES 200
13 #define max 50
14 #define nodostotal 21
15
16
17
18 struct punto
19 {
20 float x,y;
21 };
22
23 struct separacion
24 {
25 float sx,sy;
26 };
27 struct nodo
28 {
29 int rojo;
30 int id;
31 punto geometria;
32 separacion metrica;
33 };
34
35 struct grafo
36 {
37 int numeronodos;
38 nodo nodos[MAXNODOS];
39 punto pmin,pmax;
40 };
41
42 //usamos estas estructuras para calcular las posiciones relativas de los nodos
43
44 struct queue
45 {
46 int inicio, final, total;
47 int info[max];
48 };
49
50 struct stack
51 {
52 int topo;
53 int info[max + 1];
54 };
55
56
57
58
59 /*
60 id.- ciudad
61 01.- Amealco 08.- Huimilpan 15.- San Joaquín
62 02.- Arroyo Seco 09.- Jalpan de Serra 16.- San Juan del Río
63 03.- Bernal 10.- Landa de Matamoros 17.- Santa Rosa
64 04.- Cadereyta 11.- Pedro Escobedo 18.- Tequisquiapan
65 05.- La Cañada 12.- Peñamiller 19.- Tolimán
66 06.- Colón 13.- Pinal de Amoles 20.- Villa del Pueblito
67 07.- Ezequiel Montes 14.- Querétaro
68 */
69
70 char *ciudades[21] = {
71 "","Amealco","Arroyo Seco","Bernal","Cadereyta","La Canada","Colon","Ezequiel Montes",
72 "Huimilpan","Jalpan de Serra","Landa de Matamoros","Pedro Escobedo","Penamiller","Pinal de Amoles",
73 "Queretaro","San Joaquin","San Juan del Rio","Santa Rosa","Tequisquiapan","Toliman","Villa del Pueblito"
74
75 /* "","Amealco","Arroyo Seco","Bernal","Cadereyta","La Cañada","Colón","Ezequiel Montes",
76 "Huimilpan","Jalpan de Serra","Landa de Matamoros","Pedro Escobedo","Peñamiller","Pinal de Amoles",
77 "Querétaro","San Joaquín","San Juan del Río","Santa Rosa","Tequisquiapan","Tolimán","Villa del Pueblito"
78 */ };
79 int matrizadyacencia[21][21] =
80 {
81 /* A Ar B C lC Co E H J L P Pe Pi Q S Sj Sr T To V */
82 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
83 {1, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0}, // 01 Amealco -> 08 Huimilpan, 16 San Juan del Río
84 {2, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // 02 Arroyo Seco -> 09 Jalpan de Serra
85 {3, 0, 0, 0, 0, 41, 23, 20, 0, 0, 0, 0, 62, 92, 0, 0, 0, 0, 0, 26, 0}, // 03 Bernal -> 05 La Cañada, 06 Colón, 07 Ezequiel Montes, 12 Peñamiller, 13 Pinal de Amoles, 19 Tolimán
86 {4, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0}, // 04 Cadereyta -> 07 Ezequiel Montes, 15 San Joaquín
87 {5, 0, 0, 41, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 50, 0, 0}, // 05 La Cañada -> 03 Bernal, 06 Colón, 14 Querétaro, 18 Tequisquiapan
88 {6, 0, 0, 23, 0, 50, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0}, // 06 Colón -> 03 Bernal, 05 La Cañada, 07 Ezequiel Montes 19 Tolimán
89 {7, 0, 0, 20, 12, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0}, // 07 Ezequiel Montes -> 03 Bernal, 04 Cadereyta, 06 Colón, 18 Tequisquiapan
90 {8, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 30}, // 08 Huimilpan -> 01 Amealco, 14 Querétaro, 20 Villa del Pueblito
91 {9, 0, 48, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0}, // 09 Jalpan de Serra -> 02 Arroyo Seco, 10 Landa de Matamoros, 13 Pinal de Amoles
92 {0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // 10 Landa de Matamoros -> 09 Jalpan de Serra
93 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 0, 0, 0}, // 11 Pedro Escobedo -> 14 Querétaro, 16 San Juan del Río
94 {2, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 69, 0, 0, 0, 60, 0}, // 12 Peñamiller -> 03 Bernal, 13 Pinal de Amoles, 15 San Joaquín, 19 Tolimán
95 {3, 0, 0, 92, 0, 0, 0, 0, 0, 40, 0, 0, 49, 0, 0, 90, 0, 0, 0, 0, 0}, // 13 Pinal de Amoles -> 03 Bernal, 09 Jalpan de Serra, 12 Peñamiller
96 {4, 0, 0, 0, 0, 7, 0, 0, 34, 0, 0, 31, 0, 0, 0, 0, 0, 20, 0, 0, 7}, // 14 Querétaro -> 05 La Cañada, 08 Huimilpan, 11 Pedro Escobedo, 17 Santa Rosa, 20 Villa del Pueblito
97 {5, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 69, 90, 0, 0, 0, 0, 0, 0, 0}, // 15 San Joaquín -> 03 Bernal, 04 Cadereyta, 12 Peñamiller
98 {6, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 20, 0, 0}, // 16 San Juan del Río -> 0 1 Amealco, 11 Pedro Escobedo, 18 Tequisquiapan
99 {7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 26}, // 17 Santa Rosa -> 14 Querétaro, 20 Villa del Pueblito
100 {8, 0, 0, 0, 0, 50, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0}, // 18 Tequisquiapan -> 05 La Cañada, 07 Ezequiel Montes, 16 San Juan del Río
101 {9, 0, 0, 26, 0, 0, 31, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0}, // 19 Tolimán -> 03 Bernal, 06 Colón, 12 Peñamiller
102 {0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 7, 0, 0, 26, 0, 0, 0} // 20 Villa del Pueblito -> 08 Huimilpan, 14 Querétaro, 17 Santa Rosa
103 };
104
105 int d[21]={0};
106 int costos[21]={0};
107 int visitado[21]={0};
108 int padres[21]={0};
109 int vi[21]={0};
110 int pa[21]={0};
111 int r;
112 int nmin=0;
113 static char label[100];
114
115
116 float angulo=0.0;
117
118 grafo grafobusqueda;
119
120 void camino(int id)
121 {
122 if(padres[id]!=0)
123 {
124 camino(padres[id]);
125 }
126
127 printf(" %s ",ciudades[id]);
128 }
129
130
131 #pragma region geometria
132
133 float distancia(struct nodo a, struct nodo b)
134 {
135 float distx = a.geometria.x - b.geometria.x;
136 float disty = a.geometria.y - b.geometria.y;
137 float d = sqrt(distx*distx + disty*disty);
138 return d;
139 }
140 void repulsion(struct nodo a, struct nodo b)
141 {
142 int i = a.id;
143 int j = b.id;
144 float costo;
145 float k=1.0;//cte de separacion
146 float r=100;//radio maximo de desplazamiento, del mapa vi que la distancia maxima entre dos poblaciones era 90 asi que tome un valor un poco mayor
147 float d;//distancia de la repulsión
148 float f;//fuerza de la repulsión
149
150 float distx = a.geometria.x - b.geometria.x;
151 float disty = a.geometria.y - b.geometria.y;
152 d = sqrt(distx*distx + disty*disty);
153 costo= matrizadyacencia[i][j];
154
155 if(d<r)
156 {
157 f=powf(k,2.0f)/(powf(d,2.0f)*costo);
158 }
159 else
160 {
161 f=powf(k,2.0f)/(powf(r,2.0f)*costo);
162 }
163
164 b.metrica.sx += f*distx;
165 b.metrica.sy += f*disty;
166 a.metrica.sx -= f*distx;
167 a.metrica.sy -= f*disty;
168
169 }
170 void atraccion(struct nodo a, struct nodo b)
171 {
172
173 int i = a.id;
174 int j = b.id;
175
176 float k=1.0;//cte de separacion
177 float r=5;//radio minimo de desplazamiento, del mapa vi que la distancia minima entre dos poblaciones era 7 asi que tome un valor un poco menor
178 float d;//distancia de la repulsión
179 float f;//fuerza de la repulsión
180 float costo;
181
182 costo= matrizadyacencia[i][j];
183
184 float distx = a.geometria.x - b.geometria.x;
185 float disty = a.geometria.y - b.geometria.y;
186 d = sqrt(distx*distx + disty*disty);
187
188 if(costo!=0)
189 {
190 f=(powf(d,2.0f)-powf(costo,2.0f))/costo;
191 }
192 else
193 {
194 f=(powf(d,2.0f)-powf(costo,2.0f))*1;
195 }
196
197 f*=k*.5+100;
198 f/=d;
199
200
201 b.metrica.sx += f*distx;
202 b.metrica.sy += f*disty;
203 a.metrica.sx -= f*distx;
204 a.metrica.sy -= f*disty;
205
206 }
207
208 void calculaposiciones(void)
209 {
210 nodo a,b;
211
212 for(int i =1; i< nodostotal; i++)
213 {
214 a = grafobusqueda.nodos[i];
215 for(int j =1; j< nodostotal; j++)
216 {
217 b = grafobusqueda.nodos[j];
218 repulsion(a,b);
219 }
220 }
221 for(int i =1; i< nodostotal; i++)
222 {
223 a = grafobusqueda.nodos[i];
224 for(int j =1; j< nodostotal; j++)
225 {
226 b = grafobusqueda.nodos[j];
227 atraccion(a,b);
228 }
229 }
230
231 for(int i =1; i< nodostotal; i++)
232 {
233 grafobusqueda.nodos[i].geometria.x += grafobusqueda.nodos[i].metrica.sx;
234 grafobusqueda.nodos[i].geometria.y += grafobusqueda.nodos[i].metrica.sy;
235 }
236
237 }
238
239 void iniciagrafo(void)//estas rutinas son para acomodar el mapeo de los nodos de tal manera que me de las distancias relativas
240 { //para implementar el metodo a*
241 int i;
242 int n;
243 float inf = 1000;
244 grafobusqueda.numeronodos = nodostotal;
245
246 grafobusqueda.pmax.x = -inf;
247 grafobusqueda.pmax.y = -inf;
248 grafobusqueda.pmin.x = inf;
249 grafobusqueda.pmin.y = inf;
250
251 for(i=0;i<=grafobusqueda.numeronodos;i++)//se inician todos los nodos del grafo general a 0
252 {
253 grafobusqueda.nodos[i].id = i;
254 grafobusqueda.nodos[i].rojo = 0;
255 grafobusqueda.nodos[i].geometria.x = rand()%100;
256 grafobusqueda.nodos[i].geometria.y = rand()%100;
257 grafobusqueda.nodos[i].metrica.sx=0;
258 grafobusqueda.nodos[i].metrica.sy= 0;
259 }
260 grafobusqueda.nodos[14].geometria.x = 0;
261 grafobusqueda.nodos[14].geometria.y = 0;
262 grafobusqueda.nodos[2].geometria.x += 5;
263
264
265
266 }
267
268 void calculaminimoymaximo(void)
269 {
270 for(int n=1;n<nodostotal;n++)//vemos los limites del mapeo54
271 {
272 if(grafobusqueda.nodos[n].geometria.x < grafobusqueda.pmin.x)
273 {
274 grafobusqueda.pmin.x = grafobusqueda.nodos[n].geometria.x;
275 }
276 if(grafobusqueda.nodos[n].geometria.y < grafobusqueda.pmin.y)
277 {
278 grafobusqueda.pmin.y = grafobusqueda.nodos[n].geometria.y;
279 }
280 if(grafobusqueda.nodos[n].geometria.x > grafobusqueda.pmax.x)
281 {
282 grafobusqueda.pmax.x = grafobusqueda.nodos[n].geometria.x;
283 }
284 if(grafobusqueda.nodos[n].geometria.y > grafobusqueda.pmax.y)
285 {
286 grafobusqueda.pmax.y = grafobusqueda.nodos[n].geometria.y;
287 }
288 }
289 }
290
291 #pragma endregion operaciones geometricas para el calculo relativo de posiciones
292
293 #pragma region queue
294
295 void iniciarqueue(queue *q)
296 {
297 q->inicio = 1;
298 q->final = 0;
299 q->total = 0;
300 }
301
302 int queuevacio(queue *q)
303 {
304 return(q->total == 0 ? 1 : 0);
305 }
306
307 int queuelleno(queue *q)
308 {
309 return(q->total == nodostotal ? 1 : 0);
310 }
311
312 int cola(int id)
313 {
314 return(id==nodostotal ? 1 : id+1);
315 }
316 void insertarenqueue(queue *q, int id)
317 {
318 if(!queuelleno(q))
319 {
320 q->final=cola(q->final);
321 q->info[q->final]=id;
322 q->total++;
323 }
324 }
325 void anadiraqueue(queue *q, int id)
326 {
327 r++;
328 if(!queuelleno(q))
329 {
330 q->final=r;
331 q->info[q->final]=id;
332 q->total++;
333 }
334 }
335
336 int dequeue(queue *q)
337 {
338 int ret = 0;
339
340 if(!queuevacio(q))
341 {
342 ret = q->info[q->inicio];
343 q->inicio = cola(q->inicio );
344 q->total--;
345 }
346 return ret;
347 }
348
349 int quitardequeue(queue *q)
350 {
351 int ret = 0;
352
353 if(!queuevacio(q))
354 {
355 ret = q->info[q->inicio];
356 q->inicio = r--;
357 q->total--;
358 }
359 return ret;
360 }
361
362
363
364 #pragma endregion operaciones de queue
365
366 #pragma region stack
367
368 void iniciarstack(stack *s)
369 {
370 s->topo = 0;
371 }
372
373 int stackvacio(stack *s)
374 {
375 return s->topo==0 ? 1 : 0;
376 }
377
378 int stacklleno(stack *s)
379 {
380 return s->topo == max ? 1 : 0;
381 }
382
383 void Push(stack *s, int id)
384 {
385 if(!stacklleno(s))
386 {
387 s->topo++;
388 s->info[s->topo] = id;
389 }
390 }
391
392 int Pop(stack *s)
393 {
394 int ret = 0;
395
396 if(!stackvacio(s))
397 {
398 ret = s->info[s->topo];
399 s->topo--;
400 }
401
402 return ret;
403 }
404 #pragma endregion operaciones de stack
405
406 float heuristica(int inicio, int final)
407 {
408 stack *s = new stack();
409 int condicion =0;
410 float h =0;
411 iniciarstack(s);
412 Push(s, inicio);
413
414 for(int i =0;i<nodostotal;i++)
415 {
416 vi[i]=0;
417 }
418 for(int i=0;i<nodostotal+1;i++)
419 {
420 vi[i]=0;
421 pa[i]=0;
422 }
423
424
425 for(int j = 1;j<3;j++)
426 {
427 int y = Pop(s);
428 if(y == final)
429 {
430 camino(y);
431 condicion = 1;
432 }
433 else
434 {
435 vi[y] = 1;
436
437 for(int v = 1;v <= nodostotal-1; v++)
438 {
439 if(matrizadyacencia[y][v] != 0)
440 {
441 if(vi[v] == 0)
442 {
443 vi[v] = 1;
444 pa[v] = y;
445
446 if(v != final)
447 {
448 Push(s, v);
449 h=distancia(grafobusqueda.nodos[v],grafobusqueda.nodos[inicio]);
450 }
451 else
452 {
453 h=distancia(grafobusqueda.nodos[y],grafobusqueda.nodos[inicio]);
454 return h;
455 }
456 }
457 }
458 }
459 }
460 }
461 return h;
462 }
463
464
465
466
467 void bfs(int inicio, int final)
468 {
469 queue *q = new queue();
470 int condicion = 0;
471 r=0;
472 iniciarqueue(q);
473
474 anadiraqueue(q, inicio);
475
476 while(queuevacio(q)==0 || condicion == 1)
477 {
478 int u = quitardequeue(q);
479
480 if(u == final)
481 {
482 printf("mismo nodo");
483 camino(u);
484 condicion = 1;
485 }
486 else
487 {
488 visitado[u]= 1;
489
490 for(int v = 1;v<=nodostotal-1;v++)//leemos reenglon un de la matriz
491 {
492 if(matrizadyacencia[u][v] != 0)//vemos si hay algun nodo por el que nos podamos mover
493 {
494 if(visitado[v]==0)
495 {
496 visitado[v]=1;
497 padres[v]=u;
498
499 if(v !=final)
500 {
501 if(!queuelleno(q))
502 {
503 anadiraqueue(q, v);//agregamos el id del nodo por el cual nos movimos
504 camino(v);
505 printf("\n");
506 }
507 else
508 {
509 printf("queue lleno");
510 condicion =1;
511 }
512 }
513 else
514 {
515 camino(v);
516 return;
517 }
518 }
519 }
520 }
521 }
522 }
523 }
524
525
526
527 void ids(int inicio, int final)
528 {
529 queue *q = new queue();
530 int condicion = 0;
531 iniciarqueue(q);
532 insertarenqueue(q, inicio);
533
534 while(queuevacio(q)==0 || condicion == 1)
535 {
536 int u = dequeue(q);
537
538 if(u == final)
539 {
540 printf("mismo nodo");
541 camino(u);
542 condicion = 1;
543 }
544 else
545 {
546 visitado[u]= 1;
547
548 for(int v = 1;v<=nodostotal-1;v++)//leemos reenglon un de la matriz
549 {
550 if(matrizadyacencia[u][v] != 0)//vemos si hay algun nodo por el que nos podamos mover
551 {
552 if(visitado[v]==0)
553 {
554 visitado[v]=1;
555 padres[v]=u;
556
557 if(v !=final)
558 {
559 if(!queuelleno(q))
560 {
561 insertarenqueue(q, v);//agregamos el id del nodo por el cual nos movimos
562 camino(v);
563 printf("\n");
564 }
565 else
566 {
567 printf("queue lleno");
568 condicion =1;
569 }
570 }
571 else
572 {
573 camino(v);
574 return;
575 }
576 }
577 }
578 }
579 }
580 }
581 }
582
583
584
585 void dfs(int inicio, int final)
586 {
587
588 stack *s = new stack();
589 int condicion =0;
590
591 iniciarstack(s);
592 Push(s, inicio);
593
594 while(stackvacio(s) == 0 || condicion == 1)
595 {
596 int u = Pop(s);
597
598 if(u == final)
599 {
600 printf("mismo nodo");
601 camino(u);
602 condicion = 1;
603 }
604 else
605 {
606 visitado[u] = 1;
607
608 for(int v = 1; v <= nodostotal-1; v++)
609 {
610 if(matrizadyacencia[u][v] != 0)
611 {
612 if(visitado[v] == 0)
613 {
614 visitado[v] = 1;
615 padres[v] = u;
616
617
618 if(v != final)
619 {
620 if(!stacklleno(s))
621 {
622 Push(s, v);
623 camino(v);
624 printf("\n");
625 }
626 else
627 {
628 printf("Stack lleno.");
629 condicion = 1;
630 }
631 }
632 else
633 {
634 camino(v);
635 return;
636 }
637 }
638 }
639 }
640 }
641 }
642 }
643
644 void ucs(int inicio, int final)
645 {
646 stack *s = new stack();
647 int condicion = 0;
648 int min=1000;
649 int nodomin = 0;
650
651 iniciarstack(s);
652 Push(s, inicio);
653
654 while(stackvacio(s) == 0 || condicion == 1)
655 {
656 int u = Pop(s);
657 if(u == final)
658 {
659 printf("mismo nodo.");
660 camino(u);
661 condicion = 1;
662 }
663 else
664 {
665 visitado[u] = 1;
666 min=1000;
667 nodomin=0;
668
669 for(int v=1;v<nodostotal;v++){d[v]=matrizadyacencia[u][v];}
670
671 for(int v=1;v<nodostotal;v++)
672 {
673 if(visitado[v]!=0)
674 {
675 continue;
676 }
677 if(d[v]>0 && d[v]<min)
678 {
679 min=d[v];
680 nodomin=v;
681 }
682 }
683 visitado[nodomin] = 1;
684
685
686 if(visitado[nodomin]==visitado[u])
687 {
688 padres[nodomin] = u;
689 costos[nodomin] = d[nodomin];
690 if(nodomin != final)
691 {
692 if(!stacklleno(s))
693 {
694 Push(s, nodomin);
695 camino(nodomin);
696 printf(" %d",costos[nodomin]);
697 printf("\n");
698 }
699 else
700 {
701 printf("stack lleno.");
702 condicion = 1;
703 }
704 }
705 else
706 {
707 condicion=1;
708 camino(nodomin);
709 printf(" %d",costos[nodomin]);
710 return;
711 }
712 }
713 }
714
715 }
716 }
717
718 void a(int inicio, int final)
719 {
720 stack *s = new stack();
721 int condicion = 0;
722 int min=1000;
723 int nodomin = 0;
724
725 iniciarstack(s);
726 Push(s, inicio);
727
728 while(stackvacio(s) == 0 || condicion == 1)
729 {
730 int u = Pop(s);
731
732 if(u == final)
733 {
734 printf("mismo nodo.");
735 camino(u);
736 condicion = 1;
737 }
738 else
739 {
740
741 visitado[u] = 1;
742 min=1000;
743 nodomin=0;
744
745 for(int v = 1; v < nodostotal; v++){d[v]=matrizadyacencia[u][v];}
746
747 for(int v = 1; v < nodostotal; v++)
748 {
749 if(d[v] != 0)
750 {
751 d[v] += (int)heuristica(v,final);
752 }
753 }
754 for(int v=1;v<nodostotal;v++)
755 {
756 if(visitado[v]!=0)
757 {
758 continue;
759 }
760 if(d[v]>0 && d[v]<min)
761 {
762 min=d[v];
763 nodomin=v;
764 }
765 }
766 visitado[nodomin] = 1;
767 padres[nodomin] = u;
768 costos[nodomin] = d[nodomin];
769
770 if(visitado[nodomin]==visitado[u])
771 {
772 if(nodomin != final)
773 {
774 if(!stacklleno(s))
775 {
776 Push(s, nodomin);
777 camino(nodomin);
778 printf(" %d",costos[nodomin]);
779 printf("\n");
780 }
781 else
782 {
783 printf("stack lleno.");
784 condicion = 1;
785 }
786 }
787 else
788 {
789 condicion=1;
790 camino(nodomin);
791 printf(" %d",costos[nodomin]);
792 return;
793 }
794 }
795 }
796
797 }
798 }
799
800 void id(int inicio, int final)
801 {
802
803 stack *s = new stack();
804 int condicion =0;
805 int m =0;
806
807 iniciarstack(s);
808 Push(s, inicio);
809
810 for(m=1;m<nodostotal;m++)
811 {
812 int u = Pop(s);
813
814 if(u == final)
815 {
816 printf("mismo nodo");
817 camino(u);
818 condicion = 1;
819 return;
820 }
821 else
822 {
823
824
825 for(int v = 1; v <= nodostotal-1; v++)
826 {
827 if(matrizadyacencia[u][v] != 0)
828 {
829 if(visitado[v] == 0)
830 {
831 visitado[v] = 1;
832 padres[v] = u;
833
834
835 if(v != final)
836 {
837 if(!stacklleno(s))
838 {
839 visitado[u] = 1;
840 Push(s, v);
841 printf("%d",m);
842 camino(v);
843 printf("\n");
844 }
845 else
846 {
847 printf("Stack lleno.");
848 }
849 }
850 else
851 {
852 camino(v);
853 return;
854 }
855 }
856 }
857 }
858 }
859 }
860 }
861
862 #pragma region opengl
863
864 void init(void)
865 {
866 glClearColor (1.0, 1.0, 1.0, 0.5);
867 glShadeModel (GL_FLAT);
868 }
869
870 void inline drawString (char *s)
871 {
872 unsigned int i;
873 for (i=0; i<strlen(s); i++)
874 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, s[i]);
875 }
876
877
878 void display(void)
879 {
880 glClear (GL_COLOR_BUFFER_BIT);
881 glColor3f (0, 0, 0);
882 glLoadIdentity();
883 gluLookAt (0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
884 glRotatef(angulo,0,0,1.0);
885
886 float x,y;
887
888 int cont,cont2;
889 for (cont=1;cont<grafobusqueda.numeronodos;cont++)
890 {
891 glPushMatrix();
892
893 if(grafobusqueda.nodos[cont].rojo ==1 )
894 {
895 glColor3f(0.2, 0.5, 0.1);
896 }
897 else
898 {
899 glColor3f(0.0, 0.0, 0.0);
900 }
901
902 glTranslatef(grafobusqueda.nodos[cont].geometria.x/grafobusqueda.pmax.x , grafobusqueda.nodos[cont].geometria.y/grafobusqueda.pmax.y, 0);
903 glutSolidSphere(.02, 32, 32);
904 glPopMatrix();
905 for (cont2=cont;cont2<grafobusqueda.numeronodos;cont2++)
906 {
907 if (matrizadyacencia[cont][cont2]!=0)
908 {
909 if(grafobusqueda.nodos[cont2].rojo ==1 )
910 {
911 glColor3f(0.2, 0.5, 0.1);
912 }
913 else
914 {
915 glColor3f(0.0, 0.0, 0.0);
916 }
917 glBegin(GL_LINES);
918 glVertex2f(grafobusqueda.nodos[cont].geometria.x/grafobusqueda.pmax.x , grafobusqueda.nodos[cont].geometria.y/grafobusqueda.pmax.y);
919 glVertex2f(grafobusqueda.nodos[cont2].geometria.x/grafobusqueda.pmax.x , grafobusqueda.nodos[cont2].geometria.y/grafobusqueda.pmax.y);
920 glEnd();
921 }
922 }
923
924 }
925 for(cont =1; cont<grafobusqueda.numeronodos;cont++)
926 {
927 glColor3f(0.2, 0.2, 0.2);
928 sprintf (label, " %2.0d %s",cont,ciudades[cont]);
929 glRasterPos2f (grafobusqueda.nodos[cont].geometria.x/grafobusqueda.pmax.x,grafobusqueda.nodos[cont].geometria.y/grafobusqueda.pmax.y);
930 drawString (label);
931 }
932
933
934
935 glFlush ();
936 glutSwapBuffers();
937 }
938
939 void reshape(int w, int h)
940 {
941 glViewport (0, 0, (GLsizei) w, (GLsizei) h);
942 glMatrixMode (GL_PROJECTION);
943 glLoadIdentity ();
944 glFrustum (-1, 1, -1, 1, 1.5, 25.0);
945 glMatrixMode (GL_MODELVIEW);
946 }
947
948 void keyboard(unsigned char key, int x, int y)
949 {
950 switch (key) {
951 case 27:
952 exit(0);
953 break;
954 }
955 }
956
957 void idle(void)
958 {
959 static int timelast=0;
960 int time;
961 time = glutGet(GLUT_ELAPSED_TIME);
962 if (time-timelast>10){
963 timelast=time;
964 if (angulo<360){
965 angulo+=0.05;
966 } else {
967 angulo=0.0;
968 }
969
970 }
971
972 calculaposiciones();
973
974
975
976 glutPostRedisplay();
977 }
978
979 #pragma endregion operaciones de opengl
980
981 int main(int argc, char** argv)
982 {
983 int inicio =1, fin=2,i;
984 int d;
985 int costototal=0;
986
987 printf("lista de ciudades en el mapa\n");
988
989 for(int i=1;i<=nodostotal - 1; i++)
990 {
991 printf("\n%2d - %s",i, ciudades[i]);
992 }
993
994 printf("\nIndique la ciudad de origen: ");
995 scanf("%d",&inicio);
996 // }while(inicio>0&&inicio<nodostotal);
997
998 printf("\nIndique la ciudad de destino: ");
999 scanf("%d",&fin);
1000 // }while(fin>0&&fin<nodostotal);
1001
1002 for(i = 0;i<=nodostotal-1;i++)
1003 {
1004 visitado[i]=0;
1005 }
1006
1007 printf("\n\nBFS\n");
1008 bfs(inicio, fin);
1009
1010 for(i = 0;i<=nodostotal-1;i++)
1011 {
1012 visitado[i]=0;
1013 }
1014
1015 printf("\n\nID\n");
1016 ids(inicio, fin);
1017
1018 for(i = 0;i<=nodostotal-1;i++)
1019 {
1020 visitado[i]=0;
1021 }
1022
1023 printf("\n\nDFS\n");
1024 dfs(inicio, fin);
1025
1026 for(i = 0;i<=nodostotal-1;i++)
1027 {
1028 visitado[i]=0;
1029 }
1030
1031 printf("\n\nUCS\n");
1032 ucs(inicio, fin);
1033
1034 for(int j=1;j<nodostotal;j++)
1035 {
1036 costototal += costos[j];
1037 }
1038 printf("\ncosto total: %d",costototal);
1039
1040 for(i = 0;i<nodostotal;i++)
1041 {
1042 visitado[i]=0;
1043 costos[i]=0;
1044 }
1045 iniciagrafo();
1046 calculaminimoymaximo();
1047
1048 printf("\n\nA*\n");
1049 a(inicio, fin);
1050
1051 for(int j=1;j<nodostotal;j++)
1052 {
1053 costototal += costos[j];
1054 }
1055 printf("\ncosto total: %d",costototal);
1056
1057 for(i = 0;i<=nodostotal-1;i++)
1058 {
1059 visitado[i]=0;
1060 }
1061
1062 printf("\n\nID segundo algoritmo\n");
1063 id(inicio, fin);
1064
1065
1066 /*
1067 * Inicializando OpenGL
1068 * */
1069 glutInit(&argc, argv);
1070 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
1071 glutInitWindowSize (800, 800);
1072 glutInitWindowPosition (100, 100);
1073 glutCreateWindow (argv[0]);
1074 init ();
1075 glutDisplayFunc(display);
1076 glutReshapeFunc(reshape);
1077 glutKeyboardFunc(keyboard);
1078 glutIdleFunc(idle);
1079
1080 /*
1081 * Inicializando Entrada del Grafo
1082 * */
1083
1084 /*
1085 * Entrando en el ciclo
1086 * */
1087
1088 glutMainLoop();
1089
1090 return 0;
1091 }
en post posteriores explicare paso por paso y el resultado del codigo