gpt4 book ai didi

java - 将 block 分成象限

转载 作者:行者123 更新时间:2023-11-29 03:02:46 29 4
gpt4 key购买 nike

假设我有一个 10x10 的 block ,我的目标是将其分成象限,然后一旦完成,返回第一象限并分成四个象限,转到第二象限并打破将其分成四个象限,依此类推,直到它们都被破坏,然后返回到第一个象限并为新的一组 block 重复此操作。

所以基本上我想将一个 block 分成 4 个部分,然后将每个新 block 分成四个部分,并继续这种模式。

这是我目前的代码:

private static void getBlockAverage(int startHeight, int endHeight, int startWidth, int endWidth, BufferedImage img, BufferedImage blockImg) {

int red = 0;
int green = 0;
int blue = 0;
int rgb = 0;

if(endHeight <= 1 || endWidth <= 1) {
return;
}

// get average
for(int i = startHeight; i < endHeight; i++) {
for(int j = startWidth; j < endWidth; j++) {
rgb = img.getRGB(j, i);
red += (rgb >> 16) & 0xFF;
green += (rgb >> 8) & 0xFF;
blue += (rgb) & 0xFF;
}
}

// get average color
red = red /((startWidth - endWidth) * (startHeight - endHeight));
green = green/((startWidth - endWidth) * (startHeight - endHeight));
blue = blue/((startWidth - endWidth) * (startHeight - endHeight));
Color color = new Color(red,green,blue);

// apply
for(int i = startHeight; i < endHeight; i++) {
for(int j = startWidth; j < endWidth; j++) {
blockImg.setRGB(j, i, color.getRGB());
}
}

getBlockAverage(startHeight, endHeight/2, startWidth, endWidth/2, img, blockImg);
getBlockAverage(endHeight/2+1, endHeight, endWidth, endWidth/2, img, blockImg);
getBlockAverage(startHeight, endHeight/2, endWidth/2+1, endWidth, img, blockImg);
getBlockAverage(endHeight/2+1, endHeight, endWidth/2+1, endWidth, img, blockImg);


}

所以我正在做的是尝试递归调用这个函数,它将继续将每个 block 分成象限,但我继续得到堆栈溢出。

我的代码所做的是获取图像,获取该 block 的平均颜色并显示它。这是一个相对简单的概念,我将稍微调整一下以获得一些很酷的图像,但那是为了以后,现在我正在尝试解决这个问题。

这里编辑的是 System.out.println(startHeight + ""+ endHeight + ""+ startWidth + ""+ endWidth);

0 72 0 108
0 36 0 54
0 18 0 27
0 9 0 13
0 4 0 6
0 2 0 3
0 1 0 1
0 1 2 3
3 4 0 3
3 4 0 1
3 4 2 3
3 4 2 3
3 4 2 3
3 4 2 3
3 4 2 3
3 4 2 3

然后重复 3 4 2 4 直到我得到堆栈溢出。

最佳答案

进行递归时,三个特征很重要:

  1. 打破条件
  2. 实际工作量
  3. 整理递归结果

具体来说:

private static void getBlockAverage(int startHeight, int endHeight, int startWidth, int endWidth, BufferedImage img, BufferedImage blockImg) {
// break recursion on empty block
if(endHeight <= startHeight || endWidth <= startWidth)
return;

if(startHeight + 1 == endHeight || startWidth + 1 == endWidth) {
// work on single columns or rows of pixels
// results are stored to blockImg...
} else {
// recurse
getBlockAverage(startHeight, (startHeight + endHeight)/2, startWidth, (startWidth + endWidth)/2, img, blockImg);
getBlockAverage((startHeight + endHeight)/2, endHeight, startWidth, (startWidth + endWidth)/2, img, blockImg);
getBlockAverage(startHeight, (startHeight + endHeight)/2, (startWidth + endWidth)/2, endWidth, img, blockImg);
getBlockAverage((startHeight + endHeight)/2, endHeight, (startWidth + endWidth)/2, endWidth, img, blockImg);
// now collate the results in blockImg...
}
}

关于java - 将 block 分成象限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33828524/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com