Processing
Børre Stenseth
Problemer >Hexagon

Hexagon (sekskant)

Hva

Vi skal se litt på geometrien i en sekskant, og vi skal lage en mønster av sekskanter.

Begreper som du finner i dokumentasjonen til Processing Reference

color(), fill(), stroke(),
PShape, createShape(),endShape()
sin(), cos()
Relevante Skisser
hexagon1, hexagon2, hexagonmonster, polygons

Vi skal tegne en sekskant på to forskjellige måter. Begge gir dette resultatet:

hexagon

De to metodene representerer etter min erfaring en ganske typisk situasjon når vi programmerer i slik grafiske omgivelser. Den første metoden er ganske intiutiv og vi finner på en måte veien rent algoritmisk. Den andre metoden er basert på et matematisk, geometrisk resonnemet.

Metode1

Skissen er slik:

_hexagon1.pde
//En regulær sekskant (hexagon)
float side=50.0;
void setup(){
  size(160,130);
  noLoop();
}
void draw(){
  background(255);
  translate(30,60); 
  drawSekskant();
}
void drawSekskant(){
  pushMatrix();
    stroke(0,0,255);
    rotate(-TWO_PI/12);
    for(int i=0; i< 6;i++){
      line(0,0, 0,side);
      translate(0,side);
      rotate(-TWO_PI/6);
    }
  popMatrix();
}

Det vi har gjort her, drawSekskant(), er rett og slett at vi har dratt med oss en strek i en vandring rundt sekskanten. Vi går seks steg, hver med en lengde lik sidekanten, og vi snur oss 6o grader i hvert hjørne (60*6=360). Vi kan på en måte si at i har tegnet en ufullstendig sirkel. Hvis vi øker antall steg og reduserer vinkelen i hvert hjørne tilsvarende kan dette bli slik:

somsirkel

Skissen som lager dette er slik:

_polygons.pde
// likesidede mangekanter
float side;
void setup(){
  side=35.0;
  size(500,500);
  noLoop();
}
void draw(){
  background(255);
  stroke(0,0,255);
  translate(side,200);
  for(int ix=3;ix<40;ix++)
    drawPolygon(ix);   
}
void drawPolygon(int n){
  pushMatrix();
    for(int i=0; i< n;i++){
      line(0,0, 0,side);
      translate(0,side);
      rotate(-TWO_PI/n);
    }
  popMatrix();
}

Metode2

Her tar vi utgangspunkt i en analyse av dimensjonene i et hexagon:

Skissen regner ut a og b ved hjelp av sinus og cosinus og er slik:

_hexagon2.pde
float side=50.0;
void setup(){
  size(160,130);
  noLoop();
}
void draw(){
  background(255);
  translate(30,60); 
  drawSekskant();
}
void drawSekskant(){
  PShape sekskant;
  float a=side*cos(TWO_PI/12);// 30 grader
  float b=side*sin(TWO_PI/12);    
  sekskant = createShape();
  sekskant.beginShape();
    sekskant.stroke(255,0,0);
    sekskant.vertex(0      ,0);
    sekskant.vertex(b      ,-a);
    sekskant.vertex(side+b ,-a);
    sekskant.vertex(side+2*b ,0);
    sekskant.vertex(side+b ,a);
    sekskant.vertex(b      ,a);
  sekskant.endShape(CLOSE);
  shape(sekskant);
}

Hexagonmønster

Vi skal ordne et antall hexagoner i et sammenhengende mønster. Vi lager noe slikt:

monster

Her må vi forholde oss til hexagonenes forhold til hverandre. Det er vel ganske klart at metode1 ovenfor er det beste utgangspunktet. Vi kan ressonere ut fra følgende plan:

hexagonberegning

Vi ordner oss slik at hvert hexagon beskrives med et objekt. Når vi klikker på det skrur vi av og på synligheten:

_hexagonObj.pde
class hexagon{
  float xPos;
  float yPos;
  color col;
  PShape hShape;
  boolean synlig;
  hexagon(float xPos,float yPos, color col){
    this.xPos = xPos;
    this.yPos = yPos;
    this.col = col;
    this.synlig=true;
    this.hShape=createShape();
    this.hShape.beginShape();
    this.hShape.fill(this.col);
      this.hShape.vertex(0,0);
      this.hShape.vertex(b,-a);
      this.hShape.vertex(side+b,-a);
      this.hShape.vertex(2*side,0);
      this.hShape.vertex(side+b,a);
      this.hShape.vertex(b,a);
    this.hShape.endShape(CLOSE);
  }  
  void tegn(){
     if(!this.synlig)
       return;
     pushMatrix();
      translate(this.xPos,this.yPos);
      shape(this.hShape);
     popMatrix();
  }
  boolean truffet(){
    float centerX=this.xPos+side/2+b;
    float centerY=this.yPos;
    // omtrentlig
    if( dist(mouseX,mouseY,centerX,centerY) < side){
      this.synlig=!this.synlig;
      return true;
    }
    return false;
  }
}

Selve skissen er slik:

_hexagonmonster.pde

Oppgaverforslag

Alternative plasseringer

Lage en skisse som legger ut hexagoner i et annet mønster

Avsløring

Legg et bilde bak exagonene og la brukeren finne ut hva/hvem bildet representerer med færrest mulig klikk på hexagoner (som kan skrus av og på). Eller la hexagonene skru seg tilfeldig av og på helt til brukeren kjenner igjen bildet.

Dessuten

Visste du forresten at fotballer ofte sys sammen av 2 0hexagoner og 12 pentagoner (5-kanter):

Problemer >Hexagon