C# 三维网格曲面

C# 三维网格曲面,c#,bitmap,3d,C#,Bitmap,3d,我有以下代码在2D插值颜色贴图中显示传感器数据。但是,我想将其转换为3D网格曲面。我只能找到一些复杂的方法来做到这一点。但我想的是一种更简单的方法,它可以根据每个数据数组上的不同颜色将2D颜色贴图拉到更高的级别,从而使2D位图像3D一样 Bitmap bmp3=新位图(PicBoxChi.Width,PicBoxChi.Height); 使用(Graphics g=Graphics.FromImage(bmp3)) { //此循环创建一个6X4贴图以显示我的传感器数据 对于(int a=0;a

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

Bitmap bmp3=新位图(PicBoxChi.Width,PicBoxChi.Height);
使用(Graphics g=Graphics.FromImage(bmp3))
{
//此循环创建一个6X4贴图以显示我的传感器数据
对于(int a=0;a<6;a++)
{
对于(int b=0;b<4;b++)
{
pts[a,b]=新点c(新点f(x0+b*宽度,y0+a*高度),数据[a*4+b+48]);
}
}
int colorLength=cmap.GetLength(0);
//双线性插值:
//此循环将我的6x4传感器数据映射转换为彩色映射
对于(int i=0;i<5;i++)
{
对于(int j=0;j<3;j++)
{
PointF[]pta=新的PointF[4]{pts[i,j]。PointF,pts[i+1,j]。PointF,
pts[i+1,j+1].pointf,pts[i,j+1].pointf};
float[]cdata=新的浮点[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图像。

如果像素颜色为RGB格式,从提供的图片中,我可以推断您感兴趣的是颜色的纯色调

要从RGB获得标准[0,360]范围的色调值,您可以执行以下操作:

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


从矩形图像中编译由三角形组成的三维网格,知道高度本身并不困难。据我所知,查找每个像素的高度是个问题,对吗?请澄清您是否在使用“颜色->高度”功能和/或是否需要3D网格生成方面的帮助。@user2464424是的,我找不到每个像素的高度。@U Pouet先生,我需要3D网格生成方面的帮助。如图所示的图片是我想要构建的3D网格曲面。我只能找到一种矩阵变换方法来生成3D曲面,但我认为颜色->高度函数可以生成3D网格。非常感谢您,如果您能在生成3D网格方面提供帮助您好,我试着使用您的代码。但是存在这么多错误,我真的无法修复它。你能帮点忙吗?错误CS0103当前上下文中不存在名称“img”;错误CS0103当前数据库中不存在名称“getRgbColorFromImage”context@WaiKa嗯,最后一个代码是伪代码,你应该用你喜欢的语言来翻译它。当然会有错误!但是你在一篇评论中说,只有获得高度才是问题所在,所以我首先发布了一些计算高度函数的方法,最后一个片段只是为了“包装包”。真的谢谢你的回复。问题不仅在于身高。我不知道如何生成如所附图像所示的三维网格。我的想法是给它的2D颜色位图增加一个高度,因为我不知道如何应用getHue函数来生成相应的3D网格曲面
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);
        }
    }

}
System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue);
float hue = color.GetHue();
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);
}
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)];