2017-12-12 11 views
0

Ich erstelle einen Bildfilter, der einen Wabeneffekt durch das Finden der Durchschnitte von Gruppen von Sechsecken erzeugt. Dieser Code wird ein Gitter aus Sechsecken für jede gegebene Größe erzeugen, und wird schließlich auf die Größe der Leinwand beschränkt:bestimmen, ob ein bestimmtes Pixel innerhalb einer Form Verarbeitung ist

float unitSize = 20; 
float eqTriH = 0.8660254; 
int cellsX; 
int cellsY; 
void setup() { 
    size(700, 700); 
    cellsX = int(width/(unitSize*3)); 
    cellsY = int(height/(unitSize*eqTriH*2+eqTriH)); 
    smooth(); 
} 

void draw() { 
    for (int i = 0; i < cellsX; i++) { 
    for (int j = 0; j < cellsY; j++) { 
     beginShape(); 
     for (int k = 0; k < 6; k++) vertex(unitSize+i*unitSize*3+cos(TWO_PI/6*k)*unitSize, unitSize*eqTriH+j*unitSize*2*eqTriH+sin(TWO_PI/6*k)*unitSize); 
     endShape(CLOSE); 
     beginShape(); 
     for (int k = 0; k < 6; k++) vertex(unitSize*2.5+i*unitSize*3+cos(TWO_PI/6*k)*unitSize, unitSize*eqTriH*2+j*unitSize*2*eqTriH+sin(TWO_PI/6*k)*unitSize); 
     endShape(CLOSE); 
    } 
    } 
} 

Das funktioniert gut, aber ich kann nicht herausfinden, wie man für jeden angefangenen Sechseck, das gezeichnet wird, erhalten eine Anordnung von Pixelpositionen innerhalb jedes Sechsecks.

Wenn diese Frage zu vage ist, lassen Sie es mich bitte wissen, damit ich spezifischer werden kann.

EDIT: wenn ich sage, ich möchte feststellen, ob ein Pixel in der Form ist, ich meine, sobald ich das tun kann, werde ich durchschleifen, DANN ein Array erstellen.

+0

Ist Ihr Endziel, um herauszufinden, ob ein Punkt innerhalb eines Sechsecks ist? Warum müssen Sie die tatsächlichen Pixel überlappen? Was machst du mit ihnen? –

+0

@KevinWorkman Das Endziel wäre, die durchschnittliche Farbe von allem innerhalb eines Polygons zu finden. –

Antwort

1

Es gibt zwei Ansätze:

  • Spaziergang durch alle Bildpixel, bestimmen, welche Sechseck jedes Pixel gehört, und schreiben ihre Koordinaten in entsprechende Liste/Array

  • rasterize jedes Sechseck, immer Scan Linien - gebrauchsfertige kontinuierliche Pixel-Arrays.

Ich denke, dass der zweite Ansatz für Ihren Fall besser ist. Sie haben Koordinaten von Vertices. Es scheint, dass Ihre Sechsecke flach abgeflacht sind (horizontal), also scannen Sie das obere Trapez und dann das untere.

Pseudo-Code für untere Trapez:

for y = (centery; y <= centery + ysize; y++) 
    left_x = (int) themostleftx + (y - centery) * eqTriH 
    right_x = (int) themostright - (y - centery) * eqTriH 
    get horizontal segment of pixels (left_x,y)-(right_x,y) 
Verwandte Themen