• Domingo 15 de Diciembre de 2024, 12:47

Autor Tema:  Ayuda Con Quick Hull  (Leído 1757 veces)

Faustox

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Ayuda Con Quick Hull
« en: Martes 19 de Julio de 2005, 17:18 »
0
Estoy tratando de trazar la envolvente convexa de una nube de puntos que se seleccionan haciendo click con el mouse en la pantalla.
Para resumir quiero guardar las coordenadas de puntos donde se hace click con el mouse y eso va bien, necesito comparar los puntos buscando los puntos extremos es decir el que esta mas a la izquierda, más a la derecha, más arriba y más abajo y apartir de ellos trazar lineas que los unan.  Luego de eso me imagino que debo de usar el criterio de la izquierda; pero no paso de lo de los puntos extremos por que me resultan "otras cosas"
He aqui el codigo, ya se que a nadie le gusta detenerce a estar revisando codigo pero creo que es mejor asi.




#define ENTER 13
#define DIM 2
#define PMAX 100
#define ESC 27

void inicio (void);



/* MAIN */

void main (void)
{
int i,n;
int P[PMAX][DIM]; /*este array me guardará los puntos*/
int izq[1][1],der[1][1],sup[1][1],inf[1][1]; /* cada uno de estos un punt extremo*/
n=0;
i=0;

 inicio();
 cleardevice();
 mtest();
 mver();

inf[0][1]=P[0][1];

der[0][0]=P[0][0];

izq[0][0]=P[0][0];

sup[0][1]=P[0][1];




  while((mclick()!=2) && (i <= PMAX)){
          if (mclick() == 1)
            {
               mocultar();
               circle(mxpos(1)+1,mypos  (1)+1,2);
               P[0] = mxpos(1);
               P[1] = mypos(1);

               if(der[0][0]<P[0]){
                  der[0][0]=P[0];
                  der[0][1]=P[1];
               }
               if(izq[0][0]>P[0]){
                 izq[0][0]=P[0];
                 izq[0][1]=P[1];
               }
               if(inf[0][1]<P[1]){
                 inf[0][1]=P[1];
                 inf[0][0]=P[0];
               }
               if(sup[0][1]>P[1]){
                  sup[0][1]=P[1];
                  sup[0][0]=P[0];
                  }
               i=i+1;
               n=i;

            mver();
            getch();
            }


      }


printf("supY%d\n",sup[0][1]);
printf("supX%d\n",sup[0][0]);
printf("infY%d\n",inf[0][1]);
printf("infX%d\n",inf[0][0]);
printf("derX%d\n",der[0][0]);
printf("derY%d\n",der[0][1]);
printf("izqX%d\n",izq[0][0]);
printf("izqY%d\n",izq[0][1]);

getch();




      }

rir3760

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Ayuda Con Quick Hull
« Respuesta #1 en: Martes 19 de Julio de 2005, 17:58 »
0
Código: Text
  1. void main (void)
  2.  
Tomando en consideracion que no indicas el compilador y plataforma que utilizas seria mejor la definicion int main(void) o int main(), no hace daño, es mas portable y evita modificar el codigo cuando este se compila en compiladores en el modo mas estricto posible.

Código: Text
  1. int izq[1][1],der[1][1],sup[1][1],inf[1][1];
  2.  
Aqui defines cuatro arrays cuyo unico elemento es array[0][0], seria mejor que utilizaras la instruccion typedef en esta forma:
Código: Text
  1. typedef struct punto {
  2.    int x;
  3.    int y;
  4. } Punto;
  5.  
  6. /* mas codigo ... */
  7.  
  8. Punto izq, der, sup, inf;
  9.  

Código: Text
  1. inicio();
  2. cleardevice();
  3. mtest();
  4. mver();
  5.  
Y en esta parte llamas a un bloque de funciones pero la operacion de estas no tiene impacto en la funcion main ya que:
1) No defines variables globales que las funciones puedan modificar y
2) No les pasas argumentos que pudieran modificar.

Código: Text
  1. inf[0][1] = P[0][1];
  2. der[0][0] = P[0][0];
  3. izq[0][0] = P[0][0];
  4. sup[0][1] = P[0][1];
  5.  
En este bloque modificas el valor de los arrays inf, der, etc. en base al valor de los elementos del array P pero:
1) El valor de los elementos del array P no esta definido, en buen cristiano esto elementos pueden tener cualquier valor y
2) En C los indices de los arrays inician en 0: inf[0][1] y sup[0][1] no son indices validos.

Un saludo
The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz

Faustox

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Ayuda Con Quick Hull
« Respuesta #2 en: Miércoles 20 de Julio de 2005, 01:18 »
0
Uso Turbo C
Lo pruebo y regreso