当前位置: 首页 > 知识库问答 >
问题:

将2D数组旋转α度

卞云瀚
2023-03-14

我写了一个函数,它接受两个参数:

>

  • JPG图像作为3D数组

    α给出的旋转度我的方法是:

    公共静态整数[][]旋转(整数[][]img,双alpha){双rad=Math.toRadians(alpha);双sin=Math.sin(rad);双cos=Math.cos(rad);

     int height = img.length;
     int width = img[0].length;
    
     int[][] rotate = new int[height][width];
    
     for(int i = 0; i < height; i++) {
         for(int j = height - i - 1; j < width; j++) {
    
             if(j < height && i < width) {
    
                 double i_new = Math.floor(cos * (img[i].length - i) - sin * (img[j].length - j)) + i;
                 double j_new = Math.floor(sin * (img[i].length - i) + cos * (img[j].length - j)) + j;
    
                 rotate[i][j] = img[(int)j_new][(int)i_new];
             }
         }
     }
     return rotate;
    

    }

    在固定索引范围的同时,输出是一个黑色的图像。我错过了什么?

  • 共有1个答案

    卫弘义
    2023-03-14

    过了一会儿,我找到了解决方案。

    注意:它不使用任何特殊的预定义库。

    在矩阵上运行的全局函数:

    public static int[][] rotate(int[][] img, double alpha) {
    
        double rad = Math.toRadians(alpha);                             //construct of the relevant angles
        double sin = Math.sin(rad);
        double cos = Math.cos(rad);
    
        int height = img.length;
        int width = img[0].length;
    
        int[][] rotate = new int[height][width];
    
        int a = height / 2;                                             //we will use the area of a and b to compare coordinates by the formula given
        int b = width / 2;
    
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
    
                double i_new = Math.floor(cos * (i - a) - sin * (j - b)) + a;       // following the conversion function
                double j_new = Math.floor(sin * (i - a) + cos * (j - b)) + b;
    
                if (i_new >= rotate.length || i_new < 0 || j_new >= rotate[0].length || j_new < rotate[0][0]) { // if out of scope of the conversion --> print none
                    System.out.print("");                                           //mainly cause 'continue' statements are not necessary in java and JS
                } else {
                    rotate[(int) i_new][(int) j_new] = img[i][j];                   //convert
                }
            }
        }
    
        return rotate;
    }
    

    旋转每个 2D 矩阵的全局函数:

    public static int[][][] rotate_alpha(int[][][] img, double alpha) {
    
        int height = img[0].length;
        int width = img[0][0].length;
    
        int[][][] rotated = new int[3][height][width];
    
        for (int k = 0; k < 3; k++) {
            rotated[k] = rotate(img[k], alpha);
        }
    
        return rotated;
    }
    

    希望这个问题现在已经解决,并且遵守所有干净代码的标准。

     类似资料:
    • 问题内容: 在Java中,如何将ArrayList转换为二维数组Object [] []? 从评论中:我将用更多细节向您描述问题:XML文件包含联系人列表(例如姓名,地址…)。我可以获得此信息的唯一方法是通过ArrayList,该列表将提供给我。由于需要将该数组列表的内容以有序方式存储在Java Swing表中,因此我正在考虑将其转换为对象的二维数组 问题答案: 知道每个联系人具有的属性数量,我设

    • 问题内容: 因此,目标是将阵列中的元素正确旋转一次。举个例子; 如果, 则将成为 这是我所拥有的: 但是,这无法说明何时大于数组的长度。我读到我应该将更大的存储在另一个Array中,但是看到变量是不确定的,因此我不确定这是最好的解决方案。提前致谢。 问题答案: 在代码中添加一个模数组长度: 您还应该创建一个要复制到的新值,以免覆盖以后需要的值。

    • 问题内容: 是否可以轻松地“旋转” PHP中的数组? 像这样:1,2,3,4-> 2,3,4,1 为此有某种内置的PHP函数吗? 问题答案: 当前大多数答案都是正确的,但前提是您不关心索引: 输出: 要保留索引,您可以执行以下操作: 输出: 也许有人可以比我的四行方法更简洁地进行轮换,但这还是行得通的。

    • 问题内容: 我在一个一维数组中有一个例子。它只会输出列。我的想法是使用2d数组选择行和列。这是我的代码: myfile.csv 输出: 名字蒂姆汤姆 问题答案: 我只是将split结果()添加到a中,如果您确实希望将其作为2d数组,则在事后将其转换。

    • 问题内容: 假设我有一个彩色图像,这自然将由python中的3维数组表示,例如形状(nxmx 3),并将其称为img。 我想要一个新的二维数组,将其称为“ narray”,其形状为(3,nxm),以便该数组的每一行分别包含R,G和B通道的“扁平化”版本。而且,它应该具有这样的属性:我可以通过类似以下方法轻松地重建任何原始通道 问题是如何从“ img”构造“ narray”?简单的img.resha

    • 问题内容: 我正在尝试将二维数组转换为具有命名字段的结构化数组。我希望2D数组中的每一行成为结构化数组中的新记录。不幸的是,我没有尝试过以我期望的方式工作。 我从开始: 我想转换为以下形式: 我尝试过的 这两种方法都尝试将myarray中的每个条目转换为具有给定dtype的记录,因此将插入多余的零。我不知道如何获取它以将每一行转换为一条记录。 另一尝试: 这次不执行任何实际转换。内存中的现有数据只