Press "Enter" to skip to content

Draw with health data 1.0 / Processing


Génération de dessin à partir des données du logiciel « Santé » de l’iPhone;
Le fichier healthXml.xml est généré par analyse et nettoyage du fichier exporter.xml du logiciel « Santé » grâce à un javascript (dossier: parsingXmlData) ;Le tronc de l’arbre est généré en fonction de l’heure de la marche; La taille des branches correspond à la distance parcourue, le nombre de sections des branches, aux pas et l’inclinaison, à la durée de la marche.

Sources: drawWithHealthData.pde / Processing 3.0.1

XML xml;
XML[] recordXml;
XML[] newDateRecordsXml;
int numRecords;
int recordId = 90; //choix de l'id de l'enregistrement


void setup() {
  size(1280, 960);
  background(255, 255, 255);
  smooth();
  
  //Chargement et stockage des données XML
  xml = loadXML("healthXml.xml");
  recordXml = xml.getChildren("record");
  numRecords = recordXml.length;
  println("Enregistrements: " + numRecords);
  readXML();
}

void draw() {
}

//Fonction de dessin de l'arbre
void drawTree(){
  newDateRecordsXml = recordXml[recordId].getChildren("records");
  String recordDate = recordXml[recordId].getString("date");
  int treePartSize = height/14;
  
  stroke(51, 153, 255);
  fill(0);
  strokeWeight(1);
  textSize(20);
  text(recordDate, width/2, height-20);
  
  //Dessin du tronc
  for(int i=0; i<12; i++){
    strokeWeight(i*0.3+1);
    line(width/2, i*treePartSize + treePartSize, width/2, (i+1)*treePartSize + treePartSize);
  }
  
  //Dessin des branches
  for(int i=0; i<newDateRecordsXml.length; i++){
    //Definition des vecteurs pour l'orientation des branches
    PVector vSelected, v12, v24;
    vSelected = new PVector();
    v12 = new PVector(-1, -0.5);
    v24 = new PVector(1, -0.5);
    
    //Récuperation des données des enregistrements
    int[] recordTime = int(split(newDateRecordsXml[i].getChildren("time")[0].getContent(), ':'));
    int recordHours = recordTime[0];
    int recordMinutes = int(recordTime[1]*10/60);
    int recordSteps = int(newDateRecordsXml[i].getChildren("steps")[0].getContent());
    String timeVector = str(recordHours) + '.' + str(recordMinutes);
    float timeFactor = float(timeVector);
    float recordDistance = float(newDateRecordsXml[i].getChildren("distance")[0].getContent())*200;
    float recordDuration = float(newDateRecordsXml[i].getChildren("duration")[0].getContent());
    
    //calcul de la position de naissance des branches
    int branchX = width/2;
    float branchY = (abs(12-timeFactor))*treePartSize + treePartSize;
    
    //Choix de l'orientation des branches en fonction de l'heure ( <=12:gauche, >12: droite)
    if(recordHours <= 12){
      vSelected = v12;
    }else{
      vSelected = v24;
    }
    
    // Calcul du nombre et de la taille des sections des branches en fonction du nombre de pas
    float branchPart = (recordDistance*2) / recordSteps;
    float branchWeight = recordDuration/1000;
    
    //Génération du dessin des branches
    for(int j=1; j<recordSteps+1; j++)
    {
      strokeWeight((recordSteps-j)*0.003);
      line(vSelected.x*(branchPart*(j-1)) + branchX, (vSelected.y + branchWeight)*(branchPart*(j-1)) + branchY , vSelected.x*(branchPart*j) + branchX, (vSelected.y + branchWeight)*(branchPart*j) + branchY);
    }
  }
}


void readXML() {
  // Boucle de traitement des données XML
  for (int i = 0; i < 1; i++) {
    // Selection des données du tableau XML pour chaque entrée
    newDateRecordsXml = recordXml[recordId].getChildren("records");
    String recordDate = recordXml[recordId].getString("date");
    println("Record date: " + recordDate);
    
    for(int j=0; j<newDateRecordsXml.length; j++){
      String recordsId = newDateRecordsXml[j].getChildren("recordId")[0].getContent();
      String recordsTime = newDateRecordsXml[j].getChildren("time")[0].getContent();
      float recordsDuration = float(newDateRecordsXml[j].getChildren("duration")[0].getContent());
      float recordsDistance = float(newDateRecordsXml[j].getChildren("distance")[0].getContent());
      int recordsSteps = int(newDateRecordsXml[j].getChildren("steps")[0].getContent());
      println("   - " + recordsId + " / Début: " + recordsTime + " / Durée: " + recordsDuration + " / Distance: " + recordsDistance + " / Pas: " + recordsSteps + ".");
    }
  }
  
  drawTree();
}

Comments are closed.