我正在创建一个图像过滤器,通过查找六边形组的平均值来创建蜂窝效果。 此代码将为任何给定大小生成六边形网格,并最终将限制为画布的大小:
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);
}
}
}
这很好,但是,我无法弄清楚如何绘制每个六边形内的六边形数组。
如果这个问题太模糊,请告诉我,以便我可以更具体。
编辑:当我说我想确定一个像素是否在形状中时,我的意思是,一旦我能做到这一点,我就会循环,然后创建一个数组。
答案 0 :(得分:1)
有两种方法:
遍历所有图像像素,确定每个像素所属的六边形,并将其坐标写入相应的列表/数组
栅格化每个六边形,获取扫描线 - 即用型连续像素阵列。
我认为第二种方法对你的情况更好。你有顶点的坐标。看起来你的六边形是平顶的(水平的),所以扫描上方的梯形然后扫描底部的一个。
底部梯形的伪代码:
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)