草庐IT

c++ - 一种在一维数组(位图)内迭代矩形区域的算法

coder 2023-11-15 原文

这是一个奇怪的问题,我很难为它写一个标题。

我正在处理像素(更具体地说是位图),无法弄清楚实用地访问每个数组单元格的(简单)数学。

我的 Canvas 是 [n16 x 16] 像素,n 始终为 1 或更大。

这是一张基本的 n = 2 Canvas 的照片:

http://i.imgur.com/mabwQfJ.png

我想让我的神奇算法做的是从 0 运行到 495 而不触及浅灰色区域,然后从 16 运行到 512(实际上是单元格 511,我的错)而不触及深灰色区域。

因此,0 到 15,跳过 16 到 31,然后是 32 到 47,等等。

对于 n = 3:

http://i.imgur.com/TqJMWl6.png

在这种情况下,0-735 会跳过较浅的灰色区域,16-751 会跳过两边的区域,32-767 会跳过较深的灰色区域。

我尝试过的:

这是我的代码的摘录,希望它有用并展示了我已经尝试过的内容。这是计算“idxpos”值的部分。

// Let's say length = 3 for now.
for (int character = 0; character < length; ++character)
{
    // in case you're wondering, it grabs 16x16 characters from an ASCII spritesheet
    charpos = (string[character] - ' ') * 16 * 16;

    // Runs through the spritesheet character map
    // this is a huge 16x1520 bitmap.
    for (int pixel = 0; pixel < 16 * 16; ++pixel)
    {
        // ignore this, just me messing around with pixel tinting
        r = (((CharMap[charpos + pixel] >> 0) & 0xFF) + 255 - u);
        g = (((CharMap[charpos + pixel] >> 8) & 0xFF) + 255 - v);
        b = (((CharMap[charpos + pixel] >> 16) & 0xFF) + 255 - w);
        newcolour = RGB(r, g, b);

        // THIS is the part I am stuck on:
        idxpos = pixel + (character * 16 * 16);

        bitmap[idxpos] = CharMap[charpos + j];
    }
}

你可能明白了。这对我来说听起来很简单,但我想不通。

哦,我对可以为我处理所有位图内容的神奇库不感兴趣,我无法使用它。

最佳答案

如果我正确地回答了你的问题,你想按照你提到的顺序访问它们。这是执行该操作的代码(给定您的 n):

for(int i = 0; i < n; i++) //which section we are going through
{
  for(int row = 0; row < size; row++) //size = 16, better use on of your constants
  { 
    for(int col = 0; col < size; col++)
    {
      int pixelIndex = size * (row * n) + col + size * i; 
      /*the last one is an offset - it moves the 
      index to the right as far as we need.
      If you need two coordinates (as in (x,y))
      instead of one number, it is: */
      int x = row, y = col + size * i;
      doSomethingWithPixel(pixelIndex);
    }
  }
}

希望这对您有所帮助。

关于c++ - 一种在一维数组(位图)内迭代矩形区域的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29803370/

有关c++ - 一种在一维数组(位图)内迭代矩形区域的算法的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  3. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  4. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  5. ruby-on-rails - 缺失区域;使用 :region option or export region name to ENV ['AWS_REGION' ] - 2

    我知道还有其他相同的问题,但他们没有解决我的问题。我不断收到错误:Aws::Errors::MissingRegionErrorinBooksController#create,缺少区域;使用:region选项或将区域名称导出到ENV['AWS_REGION']。但是,这是我的配置开发.rb:config.paperclip_defaults={storage::s3,s3_host_name:"s3-us-west-2.amazonaws.com",s3_credentials:{bucket:ENV['AWS_BUCKET'],access_key_id:ENV['AWS_ACCE

  6. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  7. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

  8. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  9. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  10. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

随机推荐