如何获得单维数组的“边缘”

时间:2018-01-13 04:43:54

标签: c# monogame

说明

我正在为纹理边缘上具有单个像素轮廓的UI元素生成纹理。

在纹理中设置颜色数据的方法仅限于传递一维颜色值数组。

这些纹理是2D的,所以它们基本上是矩形。我需要能够识别当前像素何时处于边缘。这就是我目前的做法:

Color[] colorData = new Color[width * height];
        for (int p = 0; p < colorData.Length; p++) {

            //Top
            if (p < width - 1) {

                colorData[p] = DefaultOutlineColor;
            }    
            //Left
            else if(p % width == 0) {
                colorData[p] = DefaultOutlineColor;
            }
            //Right
            else if(p % height == height - outlineWidth) {
                colorData[p] = DefaultOutlineColor;
            }
            //Bottom
            else if(p >= width * (height - outlineWidth)) {
                colorData[p] = DefaultOutlineColor;
            }
            //Fill
            else {
                colorData[p] = DefaultBaseColor;
            }
        }

问题

一些Modulo数学,什么不是。我遇到的问题是纹理的右侧。更具体地说,计算右侧边缘。一张图片胜过千言万语:

UI Texture

我知道这只是右边缘部分的未命中计算。但我不知道如何让它发挥作用。任何帮助将受到高度赞赏。

编辑: 弄清楚了。这是工作代码:

        //Fill
        for (int p = 0; p < colorData.Length; p++) {

            colorData[p] = DefaultBaseColor;
        }

        //Top
        for (int p = 0; width * outlineWidth > p; p++) {

            colorData[p] = DefaultOutlineColor;
        }

        //Left and Right
        for (int p = 1; height > p; p++) {

            for (int i = 0; i < outlineWidth; i++) {

                colorData[(p * width) + i] = DefaultOutlineColor; //Left
                colorData[((p * width) - i) - 1] = DefaultOutlineColor; //Right
            }

        }

        //Bottom
        for (int p = width * height - (width * outlineWidth); colorData.Length > p; p++) {

           colorData[p] = DefaultOutlineColor;
        }

3 个答案:

答案 0 :(得分:2)

为什么不在三个循环中进行?一个用于顶部,一个用于左侧和右侧,然后一个用于底部?这样你就可以跳过所有不需要触摸的项目。

for(int ndx = 0; Width > ndx; ++ndx)
{
  colorData[ndx] = DefaultOutlineColor;
}

for(int ndx = 1; Height > ndx; ++ndx)
{
  colorDatandx * Widthp] = DefaultOutlineColor;
  colorData[ndx*Width + Width] = DefaultOutlineColor;}
}

for(int ndx = Width * Height - Width; Length > ndx; ++ndx)
{
  colorDatandxp] = DefaultOutlineColor;
}

答案 1 :(得分:1)

使用SoronelHaetir的方法我弄明白了。不得不稍微编辑一下数学。如果有人有兴趣,这是工作代码:

        for (int ndx = 0; width > ndx; ndx++) {
            colorData[ndx] = DefaultOutlineColor;
        }
        for (int ndx = 1; height > ndx ; ndx++) {
            colorData[ndx * width] = DefaultOutlineColor;
            colorData[(ndx * width) - 1] = DefaultOutlineColor;
        }
        for (int ndx = width * height - width; colorData.Length > ndx; ndx++) {
            colorData[ndx] = DefaultOutlineColor;
        }

答案 2 :(得分:0)

实际上你正在做一个像素的边框 - 但是你在原始代码中使用了outlineWidth,所以这里有一个替代方法,适用于任意边框大小。

for (int p = 0; p < colorData.length; p++) {
    // retrieving the x/y coords isn't expensive if you do this only once
    int x = p % height;
    int y = p / height;

    if (x < outlineSize || y < outlineSize || x >= width - outlineSize || y >= height - outlineSize) {
        colorData[p] = DefaultOutlineColor;
    }
}