我正在创建一个图像过滤器,该滤波器将通过找到六角形组的平均值来创建蜂窝效应。此代码将对任何给定尺寸生成六角形的网格,并最终仅限于画布的大小:
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);
}
}
}
这可以正常工作,但是,我无法弄清楚如何在每个绘制的六角形中都能在每个六角形内获取一系列像素位置。
如果这个问题太模糊了,请让我知道,以便我更具体。
编辑:当我说我想确定像素是否处于形状时,我的意思是,一旦可以做到这一点,我将循环遍历,然后创建一个数组。
有两种方法:
-
浏览所有图像像素,确定每个像素所属的六边形,然后在相应的列表/array
中写下其坐标 将每个六角形的栅格化,获得扫描线 - 即可使用的连续像素阵列。
我认为第二种方法对您的情况更好。您有顶点的坐标。看来您的六角形是扁平的(水平),因此扫描上梯形然后底部。
底部梯形的伪代码:
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)