/*----------------------------MegaWave2 module----------------------------*/
/* mwcommand
name = {classif_ppv};
version = {"1.0"};
author = {"no author"};
function = {"Calcule la carte de classification (plus proche voisin)"};
usage = {
 'n':[n=500]->n       "taille de l'image (carrée), par défaut 500",
 e1->e1               "échantillons de la classe 1 (2-Flist)",
 e2->e2               "échantillons de la classe 2 (2-Flist)",
 out<-classif_ppv     "résultat: carte de classification (Cimage)"
        };
*/

/* convention de remplissage de la carte de classification:
     80: classe 1 prédite
    170: classe 2 prédite 
*/
 
#include <stdio.h>
#include <math.h>
#include "mw.h"

Cimage classif_ppv(e1,e2,n)
     Flist e1,e2;
     int *n;
{
  Cimage out;
  int x,y,i;
  float xx,yy,*p,d,dmin1,dmin2;

  out = mw_change_cimage(NULL,*n,*n);

  /* parcours des pixels de la carte de classification (out) */
  for (x=0;x<*n;x++)
    for (y=0;y<*n;y++) {
      xx = (float)x/(float)(*n);
      yy = (float)y/(float)(*n);
      /* détermination du plus proche voisin (classe 1) */
      for (i=0,p=e1->values;i<e1->size;i++,p+=2) {
	d = (*p-xx)*(*p-xx)+(*(p+1)-yy)*(*(p+1)-yy);
	if (i==0 || d<dmin1) dmin1 = d;
      }
      /* détermination du plus proche voisin (classe 2) */
      for (i=0,p=e2->values;i<e2->size;i++,p+=2) {
	d = (*p-xx)*(*p-xx)+(*(p+1)-yy)*(*(p+1)-yy);
	if (i==0 || d<dmin2) dmin2 = d;
      }
      /* remplissage de la carte de classification */
      out->gray[*n*y+x] = ((dmin1<dmin2)?80:170);
    }

  return(out);
}
