Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: majojimu en 3 Julio 2013, 21:19 pm



Título: Ayuda ordenar ejes
Publicado por: majojimu en 3 Julio 2013, 21:19 pm
Hola.
Necesito ayuda para ordenar los vértices de un polígono convexo.
Tengo los siguientes vértices (x,y).
-9.75, 1.12.
-5.5, -0.5
-9.75, -1.12
-8, 1
-7.75, -1.4

Pues bien, lo que quiero es organizar dichos vértices para formar un polígono convexo.

Muchas gracias de antemano.


Título: Re: Ayuda ordenar ejes
Publicado por: engel lex en 3 Julio 2013, 23:08 pm
algo que le digo a todoslos nuevos practicamente...

1- escribe lo que quieres (ya lo hiciste)
2- muestra lo que tienes (coloca tu codigo, procura usar las etiquetas GeSHi de la edicion de textos del foro)
3- di donde te trancaste o que te causa problemas

estamos aqui para ayudarnos... no para hacer trabajos o tareas


Título: Re: Ayuda ordenar ejes
Publicado por: majojimu en 4 Julio 2013, 09:21 am
Hola.
Necesito ayuda para ordenar los vértices de un polígono convexo.
Tengo los siguientes vértices (x,y).
-9.75, 1.12.
-5.5, -0.5
-9.75, -1.12
-8, 1
-7.75, -1.4

Pues bien, lo que quiero es organizar dichos vértices para formar un polígono convexo.

Muchas gracias de antemano.

Tengo el siguiente código escrito, pero me falla el punto pivote, que cambia de valor en la funcion angleCmp. Los datos que se toman en Vect p, son los indicados arriba.

Código
  1. #include "OrdenGraham.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. angulo::angulo()
  7. {
  8.  
  9. };
  10. angulo::~angulo()
  11. {
  12.  
  13. };
  14.  
  15. float distsqr(const point &a, const point &b)
  16. {
  17. return (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y);
  18. };
  19.  
  20. float dist(const point &a, const point &b)
  21. {
  22. return sqrt(distsqr(a, b));
  23. };
  24.  
  25. float cross(const point &a, const point &b, const point &c){
  26. float d = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
  27. if(fabs(d) < 1e-9) return 0.0;
  28. return d;
  29. };
  30.  
  31. bool angleCmp(const point &self, const point &that)
  32. {
  33.    //angulo a;
  34. float t = cross(an.pivote, that, self);
  35. if(t < 0.0) return true;
  36. if(t == 0)
  37. {
  38. return (distsqr(an.pivote, self) < distsqr(an.pivote, that));
  39. }
  40. return false;
  41. };
  42.  
  43.  
  44. Vect graham(Vect p)
  45. {
  46.     angulo an;
  47.     for(int i = 1; i < p.size(); ++i)
  48. {
  49. if(p[i].y < p[0].y || (p[i].y == p[0].y && p[i].x < p[0].x ))
  50. swap(p[0], p[i]);
  51. }
  52.  
  53.     an.pivote = p[0];
  54.  
  55. cout <<"orden"<<endl;
  56. for(int i = 0; i < p.size(); ++i)
  57. {
  58.             cout << p[i].x << "  " << p[i].y << endl;
  59.     }
  60.     return p;
  61. };
  62.  

Código
  1. #ifndef ORDEN_GRAHAM
  2. #define ORDEN_GRAHAM
  3.  
  4. #include <cmath>
  5. #include <iostream>
  6. #include <vector>
  7.  
  8. struct point
  9. {
  10. float x, y;
  11. point() {}
  12. point(float X, float Y): x(X), y(Y) {}
  13. };
  14.  
  15. typedef std::vector<point> Vect;
  16. float distsqr(const point &a, const point &b);
  17. float dist(const point &a, const point &b);
  18. float cross(const point &a, const point &b, const point &c);
  19. bool angleCmp(const point &self, const point &that);
  20. Vect graham(Vect p);
  21.  
  22.  
  23. class angulo
  24. {
  25.      public:
  26.             angulo();
  27.             ~angulo();
  28.             point pivote;
  29. };
  30.  
  31. #endif



Gracias


Título: Re: Ayuda ordenar ejes
Publicado por: eferion en 4 Julio 2013, 09:37 am
Si es un polígono convexo se entiende que debería tener un centro de gravedad (CG)... es decir, un punto central que esté equidistante de todos sus vértices.

Con todo, para que sea convexo, se entiende que si la secuencia de vértices es V1, V2, V3, ..., entonces el ángulo CG^V1 es menor que CG^V2 y este a su vez menor que CG^V3... y así

Es como un reloj, el CG será el eje de las manecillas, si suponemos V0 las 12, V1 la 1, V2 las 2, etc...
CG^V0 = 0
CG^V1 = 360/12 = 30
CG^V2 = 360/6 = 60
CG^V3 = 90
...

Solo habría que ordenar esos ángulos y ya tendrías el orden de los vértices.

Bueno, técnicamente CG^V0 es un vector, lo que tienes que hacer es coger un primer vector como referencia y después calcular el ángulo del resto de vectores con respecto al de referencia.