Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2012-05-14 13:48:48 relier plusieurs points entre eux

marjorie-rf
nouveau membre
Date d'inscription: 2012-05-14
Messages: 2

relier plusieurs points entre eux



bonjour à tous,

je suis débutante en processing, et je bloque sur ce code. J'aimerai que processing me transforme des images en quelque chose de ce genre:
http://www.buamai.com/image/45399 (en moins complexe car bien sur c'est quand même Sergio Albiac), mais dans cet esprit de toile quitte à modifier par la suite mon image dans photoshop pour les transparences...
J'ai un code qui permet de mettre des points selon les pixels de l'image, je n'arrive pas a relier tous les points qui sont à une certaine distance les uns des autres.
est-ce compliqué a réaliser? est ce que quelqu'un pourrait m'apporter des précisions?
merci.
marjorie






"outline" by Procsilas Moscas, licensed under Creative Commons Attribution-Share Alike 3.0 and GNU GPL license.
Work: http://openprocessing.org/visuals/?visualID= 59807   
License:
http://creativecommons.org/licenses/by-sa/3.0/
http://creativecommons.org/licenses/GPL/2.0/

String iName="image.jpg";
 
void setup() {
  llegeixImatge("./"+iName);
  size(img.width, img.height);
}
 

 
int NP=10000;
int B=1; 
float THR=50; // range 5-50
float MD=10; // range 0-10
int NMP=6; // range 1-15
 
float[][] punts;
color[] cpunts;
int [] usat;
int [] NmP=new int[NMP];
float [] NdmP=new float[NMP];
 
int inici=0;
 
PImage img;
 
void llegeixImatge(String s) {
  img = loadImage(s);
img = loadImage("image.jpg");
}
 
float fVar(int x, int y) {
  // neighborhood 2B+1x2B+1 pixels
  float m=0;
  for (int k1=-B; k1<=B; k1++) {
    for (int k2=-B; k2<=B; k2++) {
      color c=img.pixels[(y+k1)*img.width+(x+k2)];
      m+=brightness(c);
    }
  }
  m/=float((2*B+1)*(2*B+1));
  float v=0;
  for (int k1=-B; k1<B; k1++) {
    for (int k2=-B; k2<B; k2++) {
      color c=img.pixels[(y+k1)*img.width+(x+k2)];
      v+=(brightness(c)-m)*(brightness(c)-m);
    }
  }
  v=sqrt(v)/(float) (2*B+1);   
 
  return v;
}
 
void creaPunts() {
  punts = new float[NP][2];
  cpunts = new color[NP];
  usat = new int[NP];
 
  int nint1=0;
  int nint2=0;
 
  for (int i=0; i<NP;) {
 
    int x=B+int(random(width-2*B));
    int y=B+int(random(height-2*B));
 
    //println(i+" = "+x+", "+y+": "+THR+", "+MD);
 
    // points need to be at least MD far from each other
    int flag=0;
    if (MD>0.0) { 
      for (int j=0; flag==0 && j<i; j++) {
        if (dist(x, y, punts[j][0], punts[j][1])<MD) {
          flag=1;
        }
      }
    }
 
    if (flag==0) {
      nint1=0;
      float f=fVar(x, y);
 
      // use only "valid" points     
      if (f>=THR) {
        nint2=0;
        punts[i][0]=x;
        punts[i][1]=y;
        cpunts[i]=img.pixels[y*img.width+x];
        usat[i]=0;
        i++;
      }
      else {
        nint2++;
        if (nint2>=10) {
          THR/=(1+1.0/float(NP-i));
          MD/=(1+1.0/float(NP-i));
          nint2=0;
        }
      }
    }
    else {
      nint1++;
      if (nint1>=10) {
        MD/=2.0;
        THR*=1.618;
        nint1=0;
      }
    }
  }
}
 
int NessimMesProper(int i) {
  if (NMP<=1) {
    int mP=-1;
    float dmP=dist(0, 0, width, height);
    for (int j=0; j<NP; j++) {
      if (usat[j]==0) {
        float jmP=dist(punts[i][0], punts[i][1], punts[j][0], punts[j][1]);
        if (jmP<dmP) {
          dmP=jmP;
          mP=j;
        }
      }
    }
    return mP;
  }
  else {
    for (int j=0; j<NMP; j++) {
      NmP[j]=-1;   
      NdmP[j]=dist(0, 0, width, height);
    }
    for (int j=0; j<NP; j++) {
      if (usat[j]==0) {
        float jmP=dist(punts[i][0], punts[i][1], punts[j][0], punts[j][1]);
        int k=NMP;
        while(k>0 && NdmP[k-1]>jmP) {
          k--;
        }
        if (k<NMP) {
          for (int l=0; l<(NMP-k)-1; l++) {
            NmP[(NMP-1)-l]=NmP[(NMP-1)-(l+1)];
            NdmP[(NMP-1)-l]=NdmP[(NMP-1)-(l+1)];
          }
          NmP[k]=j;
          NdmP[k]=jmP;
        }
      }
    }
    return NmP[NMP-1];
  }
}
 
int fase=0;
 
void draw() {
  if (fase==0) {
    creaPunts();
    background(#FFFFFF);

    fase=1;
  }
  else {
    if (inici!=-1) {
   
      usat[inici]=1;
 
      int seguent=NessimMesProper(inici);
      if (seguent!=-1) {
        point(punts[inici][0], punts[seguent][1]);
      }
      inici=seguent;
    }
    else {
      save("outline_"+iName);
      noLoop();
    }
  }
}

Dernière modification par marjorie-rf (2012-05-14 13:51:31)

Hors ligne

 

#2 2012-05-17 10:29:20 Re : relier plusieurs points entre eux

cgiles
membre
Lieu: Est de la France
Date d'inscription: 2005-05-25
Messages: 329

Re: relier plusieurs points entre eux



Le principal soucis c'est qu'il code en espagnol, et qu'il n'y a pas de commentaire :\

Hors ligne

 

#3 2012-05-17 11:29:02 Re : relier plusieurs points entre eux

cgiles
membre
Lieu: Est de la France
Date d'inscription: 2005-05-25
Messages: 329

Re: relier plusieurs points entre eux



En essayant de faire un truc qui correspond a ce que tu cherches, je suis arrivé a ça:
http://img213.imageshack.us/img213/139/marylinestring.jpg
http://img338.imageshack.us/img338/387/einsteinstring.jpg

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2025