Пример #1
0
        private void DrawObjects(Graphics g)
        {
            ColorMap cm = new ColorMap();

            int[,] cmap = cm.Jet();
            int x0     = 10;
            int y0     = 10;
            int width  = 85;
            int height = 85;

            PointC[,] pts = new PointC[3, 3];
            pts[0, 0]     = new PointC(new PointF(x0, y0), 3);
            pts[0, 1]     = new PointC(new PointF(x0 + width, y0), 0);
            pts[0, 2]     = new PointC(new PointF(x0 + 2 * width, y0), 4);
            pts[1, 0]     = new PointC(new PointF(x0, y0 + height), -2);
            pts[1, 1]     = new PointC(new PointF(x0 + width, y0 + height), 3);
            pts[1, 2]     = new PointC(new PointF(x0 + 2 * width, y0 + height), 1);
            pts[2, 0]     = new PointC(new PointF(x0, y0 + 2 * height), -1);
            pts[2, 1]     = new PointC(new PointF(x0 + width, y0 + 2 * height), 2);
            pts[2, 2]     = new PointC(new PointF(x0 + 2 * width, y0 + 2 * height), -3);
            float cmin        = -3;
            float cmax        = 4;
            int   colorLength = cmap.GetLength(0);

            // Original color map:
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    int cindex = (int)Math.Round((colorLength * (pts[i, j].C - cmin) +
                                                  (cmax - pts[i, j].C)) / (cmax - cmin));
                    if (cindex < 1)
                    {
                        cindex = 1;
                    }
                    if (cindex > colorLength)
                    {
                        cindex = colorLength;
                    }
                    for (int k = 0; k < 4; k++)
                    {
                        pts[i, j].ARGBArray[k] = cmap[cindex - 1, k];
                    }
                }
            }

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    SolidBrush aBrush = new SolidBrush(Color.FromArgb(pts[i, j].ARGBArray[0],
                                                                      pts[i, j].ARGBArray[1], pts[i, j].ARGBArray[2], pts[i, j].ARGBArray[3]));
                    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
                    };
                    g.FillPolygon(aBrush, pta);
                    aBrush.Dispose();
                }
            }
            g.DrawString("Direct Color Map", this.Font, Brushes.Black, 50, 190);

            // Bilinear interpolation:
            x0        = x0 + 200;
            pts[0, 0] = new PointC(new PointF(x0, y0), 3);
            pts[0, 1] = new PointC(new PointF(x0 + width, y0), 0);
            pts[0, 2] = new PointC(new PointF(x0 + 2 * width, y0), 4);
            pts[1, 0] = new PointC(new PointF(x0, y0 + height), -2);
            pts[1, 1] = new PointC(new PointF(x0 + width, y0 + height), 3);
            pts[1, 2] = new PointC(new PointF(x0 + 2 * width, y0 + height), 1);
            pts[2, 0] = new PointC(new PointF(x0, y0 + 2 * height), -1);
            pts[2, 1] = new PointC(new PointF(x0 + width, y0 + 2 * height), 2);
            pts[2, 2] = new PointC(new PointF(x0 + 2 * width, y0 + 2 * height), -3);

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; 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);
                }
            }
            g.DrawString("Interpolated Color Map", this.Font, Brushes.Black, 240, 190);
        }
        private void DrawObjects(Graphics g)
        {
            ColorMap cm = new ColorMap();
            int[,] cmap = cm.Jet();
            int x0 = 10;
            int y0 = 10;
            int width = 85;
            int height = 85;
            PointC[,] pts = new PointC[3, 3];
            pts[0, 0] = new PointC(new PointF(x0, y0), 3);
            pts[0, 1] = new PointC(new PointF(x0 + width, y0), 0);
            pts[0, 2] = new PointC(new PointF(x0 + 2 * width, y0), 4);
            pts[1, 0] = new PointC(new PointF(x0, y0 + height), -2);
            pts[1, 1] = new PointC(new PointF(x0 + width, y0 + height), 3);
            pts[1, 2] = new PointC(new PointF(x0 + 2 * width, y0 + height), 1);
            pts[2, 0] = new PointC(new PointF(x0, y0 + 2* height), -1);
            pts[2, 1] = new PointC(new PointF(x0 + width, y0 + 2* height), 2);
            pts[2, 2] = new PointC(new PointF(x0 + 2 * width, y0 + 2 * height), -3);
            float cmin = -3;
            float cmax = 4;
            int colorLength = cmap.GetLength(0);

            // Original color map:
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    int cindex = (int)Math.Round((colorLength * (pts[i, j].C - cmin) +
                                                  (cmax - pts[i, j].C)) / (cmax - cmin));
                    if (cindex < 1)
                        cindex = 1;
                    if (cindex >  colorLength)
                        cindex = colorLength;
                    for (int k = 0; k < 4; k++)
                    {
                        pts[i, j].ARGBArray[k] = cmap[cindex - 1, k];
                    }
                }
            }

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    SolidBrush aBrush = new SolidBrush(Color.FromArgb(pts[i, j].ARGBArray[0],
                                                                      pts[i, j].ARGBArray[1], pts[i, j].ARGBArray[2],pts[i, j].ARGBArray[3]));
                    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};
                    g.FillPolygon(aBrush, pta);
                    aBrush.Dispose();
                }
            }
            g.DrawString("Direct Color Map", this.Font, Brushes.Black, 50, 190);

            // Bilinear interpolation:
            x0 = x0 + 200;
            pts[0, 0] = new PointC(new PointF(x0, y0), 3);
            pts[0, 1] = new PointC(new PointF(x0 + width, y0), 0);
            pts[0, 2] = new PointC(new PointF(x0 + 2 * width, y0), 4);
            pts[1, 0] = new PointC(new PointF(x0, y0 + height), -2);
            pts[1, 1] = new PointC(new PointF(x0 + width, y0 + height), 3);
            pts[1, 2] = new PointC(new PointF(x0 + 2 * width, y0 + height), 1);
            pts[2, 0] = new PointC(new PointF(x0, y0 + 2 * height), -1);
            pts[2, 1] = new PointC(new PointF(x0 + width, y0 + 2 * height), 2);
            pts[2, 2] = new PointC(new PointF(x0 + 2 * width, y0 + 2 * height), -3);

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; 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);
                }
            }
            g.DrawString("Interpolated Color Map", this.Font, Brushes.Black, 240, 190);
        }
Пример #3
0
        private void Interp(Graphics g, PointF[] pta, float[] cData, int npoints)
        {
            PointC[,] pts = new PointC[npoints + 1, npoints + 1];
            float x0  = pta[0].X;
            float x1  = pta[3].X;
            float y0  = pta[0].Y;
            float y1  = pta[1].Y;
            float dx  = (x1 - x0) / npoints;
            float dy  = (y1 - y0) / npoints;
            float C00 = cData[0];
            float C10 = cData[1];
            float C11 = cData[2];
            float C01 = cData[3];

            for (int i = 0; i <= npoints; i++)
            {
                float x = x0 + i * dx;
                for (int j = 0; j <= npoints; j++)
                {
                    float y = y0 + j * dy;
                    float C = (y1 - y) * ((x1 - x) * C00 +
                                          (x - x0) * C10) / (x1 - x0) / (y1 - y0) +
                              (y - y0) * ((x1 - x) * C01 +
                                          (x - x0) * C11) / (x1 - x0) / (y1 - y0);
                    pts[j, i] = new PointC(new PointF(x, y), C);
                }
            }

            ColorMap cm = new ColorMap();

            int[,] cmap = cm.Jet();
            float cmin        = -3;
            float cmax        = 4;
            int   colorLength = cmap.GetLength(0);

            for (int i = 0; i <= npoints; i++)
            {
                for (int j = 0; j <= npoints; j++)
                {
                    int cindex = (int)Math.Round((colorLength * (pts[i, j].C - cmin) +
                                                  (cmax - pts[i, j].C)) / (cmax - cmin));
                    if (cindex < 1)
                    {
                        cindex = 1;
                    }
                    if (cindex > colorLength)
                    {
                        cindex = colorLength;
                    }
                    for (int k = 0; k < 4; k++)
                    {
                        pts[j, i].ARGBArray[k] = cmap[cindex - 1, k];
                    }
                }
            }

            for (int i = 0; i < npoints; i++)
            {
                for (int j = 0; j < npoints; j++)
                {
                    SolidBrush aBrush = new SolidBrush(Color.FromArgb(pts[i, j].ARGBArray[0],
                                                                      pts[i, j].ARGBArray[1], pts[i, j].ARGBArray[2], pts[i, j].ARGBArray[3]));
                    PointF[] points = new PointF[4] {
                        pts[i, j].pointf, pts[i + 1, j].pointf,
                        pts[i + 1, j + 1].pointf, pts[i, j + 1].pointf
                    };
                    g.FillPolygon(aBrush, points);
                    aBrush.Dispose();
                }
            }
        }
        private void Interp(Graphics g, PointF[] pta, float[] cData, int npoints)
        {
            PointC[,] pts = new PointC[npoints + 1, npoints + 1];
            float x0 = pta[0].X;
            float x1 = pta[3].X;
            float y0 = pta[0].Y;
            float y1 = pta[1].Y;
            float dx = (x1 - x0) / npoints;
            float dy = (y1 - y0) / npoints;
            float C00 = cData[0];
            float C10 = cData[1];
            float C11 = cData[2];
            float C01 = cData[3];

            for (int i = 0; i <= npoints; i++)
            {
                float x = x0 + i * dx;
                for (int j = 0; j <= npoints; j++)
                {
                    float y = y0 + j * dy;
                    float C = (y1 - y) * ((x1 - x) * C00 +
                                          (x - x0) * C10) / (x1 - x0) / (y1 - y0) +
                        (y - y0) * ((x1 - x) * C01 +
                                    (x - x0) * C11) / (x1 - x0) / (y1 - y0);
                    pts[j, i] = new PointC(new PointF(x, y),C);
                }
            }

            ColorMap cm = new ColorMap();
            int[,] cmap = cm.Jet();
            float cmin = -3;
            float cmax = 4;
            int colorLength = cmap.GetLength(0);
            for (int i = 0; i <= npoints; i++)
            {
                for (int j = 0; j <= npoints; j++)
                {
                    int cindex = (int)Math.Round((colorLength * (pts[i, j].C - cmin) +
                                                  (cmax - pts[i, j].C)) / (cmax - cmin));
                    if (cindex < 1)
                        cindex = 1;
                    if (cindex > colorLength)
                        cindex = colorLength;
                    for (int k = 0; k < 4; k++)
                    {
                        pts[j, i].ARGBArray[k] = cmap[cindex - 1, k];
                    }
                }
            }

            for (int i = 0; i < npoints; i++)
            {
                for (int j = 0; j < npoints; j++)
                {
                    SolidBrush aBrush = new SolidBrush(Color.FromArgb(pts[i, j].ARGBArray[0],
                                                                      pts[i, j].ARGBArray[1], pts[i, j].ARGBArray[2], pts[i, j].ARGBArray[3]));
                    PointF[] points = new PointF[4]{pts[i,j].pointf, pts[i+1,j].pointf,
                        pts[i+1,j+1].pointf, pts[i,j+1].pointf};
                    g.FillPolygon(aBrush, points);
                    aBrush.Dispose();
                }
            }
        }