【问题标题】:3D mesh surface3D网格表面
【发布时间】:2016-04-07 19:34:55
【问题描述】:

我有以下代码在 2D 插值颜色图中显示我的传感器数据。但是,我想将其转换为 3D 网格表面。我只能找到一些复杂的方法来做到这一点。但我在想的是一种更简单的方法,可以根据每个数据数组上的不同颜色将 2D 颜色图拉到更高的级别,使 2D 位图像 3D

2D and 3D bitmap

Bitmap bmp3 = new Bitmap(PicBoxChi.Width, PicBoxChi.Height);
using (Graphics g = Graphics.FromImage(bmp3))
{
    // this loop create a 6X4 map to show my sensor data
    for (int a = 0; a < 6; a++)
    {
        for (int b = 0; b < 4; b++)
        {
            pts[a, b] = new PointC(new PointF(x0 + b*width, y0 + a*height), data[a*4+b+48] ); 
        }
    }


    int colorLength = cmap.GetLength(0);
    // Bilinear interpolation:

    // this loop transfer my 6x4 sensor data map to a color map
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            PointF[] pta = new PointF[4]{pts[i,j].pointf, pts[i+1,j].pointf,
            pts[i+1,j+1].pointf, pts[i,j+1].pointf};
            float[] cdata = new float[4]{pts[i,j].C,pts[i+1,j].C,
            pts[i+1,j+1].C,pts[i,j+1].C};
            Interp(g, pta, cdata, 50);
        }
    }

}

我现在可以通过上面的代码创建 2D 彩色位图。但我不知道要制作如图所示的 3D。

【问题讨论】:

  • 从知道高度的矩形图像中编译由三角形组成的 3D 网格的行为本身并不难。据我了解,找到每个像素的高度是个问题,对吧?
  • 请说明您是否在使用 color->height 函数时遇到问题和/或是否需要 3D 网格生成方面的帮助。
  • @user2464424 是的,我找不到每个像素的高度。
  • @Mr_Pouet 我需要 3D 网格生成方面的帮助。如图所示的图片是我要构建的 3D 网格表面。我只能找到一种矩阵变换方法来生成 3D 表面,但是我想到了 color->height 函数来生成这个 3D 网格。非常感谢您在生成 3D 网格方面提供帮助

标签: c# bitmap 3d


【解决方案1】:

如果像素颜色是RGB格式,从提供的图片我可以推断你感兴趣的是颜色的纯色相。

要从 RGB 中获取标准的 [0, 360] 范围色调值,您可以像 this 一样执行:

System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue);
float hue = color.GetHue();

或者更可定制的方法(here in Java,也在此处报告):

public int getHue(int red, int green, int blue) {

    float min = Math.min(Math.min(red, green), blue);
    float max = Math.max(Math.max(red, green), blue);

    float hue = 0f;
    if (max == red) {
        hue = (green - blue) / (max - min);

    } else if (max == green) {
        hue = 2f + (blue - red) / (max - min);

    } else {
        hue = 4f + (red - green) / (max - min);
    }

    hue = hue * 60;
    if (hue < 0) hue = hue + 360;

    return Math.round(hue);
}

然后,您可以简单地将结果值用作相应顶点的高度,还可以选择通过将其除以/乘以某个常数来对其进行微调。

生成 3D 网格相对简单,我想你已经有了代码,这里有一个伪代码:

float getHeight(img img, int x, int y) {
    float scalefactor = 1.0/360; //any value you like
    return getHue(getRgbColorFromImage(img, x, y)) * scalefactor;
}


int x=0, y=0;
for (y=0; y<imageHeight-1; y++) {
    for (x=0; x<imageWidth-1; x++) {
        new quad = [x, y, getHeight(img, x, y),
                    x+1, y, getHeight(img, x+1, y),
                    x, y+1, getHeight(img, x, y+1),
                    x+1, y+1, getHeight(img, x+1, y+1)];
    }
}

如果你想要三角形:

new triangle = [x, y, getHeight(img, x, y),
                x+1, y, getHeight(img, x+1, y),
                x, y+1, getHeight(img, x, y+1)];
new triangle = [x+1, y, getHeight(img, x+1, y),
                x, y+1, getHeight(img, x, y+1),
                x+1, y+1, getHeight(img, x+1, y+1)];

【讨论】:

  • 您好,我尝试使用您的代码。但是存在很多错误,我无法真正修复它。你能提供一些帮助吗?错误 CS0103 当前上下文中不存在名称“img”;错误 CS0103 当前上下文中不存在名称“getRgbColorFromImage”
  • @WaiKa mh,最后一个代码是伪代码,你应该用你喜欢的语言翻译它。当然它会给出错误!但你在评论中说只有获得高度才是问题,所以我首先发布了一些计算高度函数的方法,最后一个 sn-p 只是用于“包装包”。
  • 非常感谢您的回复。不仅身高是问题。我不知道生成 3D 网格,如附图所示。我的想法是为其 2D 彩色位图添加高度
  • 由于我不知道如何应用你的getHue函数来生成相应的3D网格表面
猜你喜欢
  • 1970-01-01
  • 2013-11-01
  • 2014-05-25
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 2015-07-09
相关资源
最近更新 更多