将点从一个坐标映射到另一个坐标

本文关键字:坐标 一个 映射 另一个 | 更新日期: 2023-09-27 18:04:22

我有一个颜色为0到254的表

我做X次迭代,在每次迭代中我选择X颜色。例如,在第0次迭代中,我选择color[0],而在第4次迭代中,我选择color[4]。

当有256次迭代时它很好。问题是当我想要1000次迭代时。我还是想在0到255之间选择颜色。对于彼此相邻的迭代,它们可以是相同的,例如1,1,2,2,3,3,4,4…254.254.我不想用模来包住它。例如:x = c mod 255;

所有迭代(无论多少次)的颜色必须在0到254之间。

我认为这是一个将点从一维映射到另一维的问题。如果您愿意,请重新调整范围的大小。

函数可以像这样:

int getColor(int iteration, int iterations_count)

将点从一个坐标映射到另一个坐标

将[0,1000]范围内的数字映射到[0,255]范围内,除1000再乘255

如果我理解你想要什么,你希望在移动到下一个值之前连续选择相同的值X次(而不是用模数"包装"值)。在本例中,X是每种颜色被选择相同次数的值(不包括奇数次迭代时的最终颜色)。

如果这是正确的,您应该能够通过将迭代总数除以您正在使用的颜色数量并四舍五入来计算X的值:

var X = Math.Round(NumIterations / 255, 0);

然后可以在输出每个值的另一个循环中使用它,类似于:

int endValue = NumIterations - X;
for (int iteration = 0; iteration < endValue; iteration++) {
    for (int i = 0; i < X; i++) {
        color[iteration + i] = iteration;
    }
}

另一种迭代次数较少的方法,只需将迭代计数除以最大值即可得到在返回下一个数字之前应该返回一个数字的次数。

    int[] GetColor(float iterationCount, float max = 255)
    {
        float div = iterationCount/max;
        int[] color = new int[(int)iterationCount];
        for (int i = 0; i < iterationCount; i++)
            color[i] = (int)Math.Round(i/div);
        return color;
    }