Proszę o pomoc w zrozumieniu programu (C#)

0

Witam,
mam kod programu na filtr splotowy i nie rozumie niektórych fragmentów prosiłbym o pomoc w zrozumieniu tych niektórych linijek.

Pierwsza linijka której nie rozumie to:

int[,] siatka = {{ -1, -1 }, { 0, 1 }, { 1, -1 }, { -1, 0 }, { 0, 0 }, { 1, 0 }, { -1, 1 }, { 0, -1 },  { 1, 1 } }; 

czy tutaj tablica dwu wymiarowa jest zapełniana wartościami?
Nie rozumie też tych linijek:

x = i + siatka[k, 0];   
y = j + siatka[k, 0];
 

Jakie wartości kryją się pod:

siatka[k, 0] 

CAŁY KOD PROGRAMU:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Bitmap bmp;
        Bitmap bmp_pom;
        int[,] siatka = { { -1, -1 }, { 0, 1 }, { 1, -1 }, { -1, 0 },
                    { 0, 0 }, { 1, 0 }, { -1, 1 }, { 0, -1 },  { 1, 1 } };     //nie rozumie tej linijki

        private void otworzToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog open = new OpenFileDialog();
                open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";
                if (open.ShowDialog() == DialogResult.OK)
                {
                    this.bmp = new Bitmap(open.FileName);
                    this.bmp_pom = new Bitmap(open.FileName);

                    pictureBox1.Image = bmp_pom;

                }
            }
            catch (Exception)
            {
                throw new ApplicationException("Failed loading image");
            }
        }

        private void maska(int[] filtr, int dzielnik)
        {
            int czerwony = 0;
            int zielony = 0;
            int niebieski = 0;
            int x = 0;
            int y = 0;

            for (int i = 0; i < bmp_pom.Width; i++)
                for (int j = 0; j < bmp_pom.Height; j++)
                {
                    czerwony = 0;
                    zielony = 0;
                    niebieski = 0;

                    for (int k = 0; k < dzielnik; k++)
                    {
                        x = i + siatka[k, 0];   // tutaj nie wiem jakie 
                        y = j + siatka[k, 0];   // wartości znajdują się pod siatka[k,0]
                        if (x < 0) x = 0;
                        if (x >= bmp_pom.Width) x = bmp_pom.Width - 1;
                        if (y < 0) y = 0;
                        if (y >= bmp_pom.Height) y = bmp_pom.Height - 1;

                        Color c = bmp_pom.GetPixel(x, y);
                        czerwony += (c.R * filtr[k]);
                        zielony += (c.G * filtr[k]);
                        niebieski += (c.B * filtr[k]);
                    }
                    czerwony = (int)(czerwony / 9);
                    zielony = (int)(zielony / 9);
                    niebieski = (int)(niebieski / 9);

                    if (czerwony > 255) czerwony = 255; else if (czerwony < 0) czerwony = 0;
                    if (zielony > 255) zielony = 255; else if (zielony < 0) zielony = 0;
                    if (niebieski > 255) niebieski = 255; else if (niebieski < 0) niebieski = 0;

                    Color newColor = Color.FromArgb(czerwony, zielony, niebieski);
                    bmp_pom.SetPixel(i, j, newColor);
                }
        }
        private void usredniajacyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int[] filtr = {1,1,1,1,1,1,1,1,1};
            maska(filtr, 9);
            pictureBox1.Image = bmp_pom;
        }

        private void dollnoprrzepusttowyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int[] filtr = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
            maska(filtr, 2);
            pictureBox1.Image = bmp_pom;
        }

        private void górnoprzepustowyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int[] filtr = { 0, -1, 0, -1, 4, -1, 0, -1, 0 };
            maska(filtr, 1);
            pictureBox1.Image = bmp_pom;
        }
    }
} 
0
int[,] siatka = {{ -1, -1 }, { 0, 1 }, { 1, -1 }, { -1, 0 }, { 0, 0 }, { 1, 0 }, { -1, 1 }, { 0, -1 },  { 1, 1 } };

czy tutaj tablica dwu wymiarowa jest zapełniana wartościami?
tak.

Jakie wartości kryją się pod:

siatka[k, 0]

to oczywiście zależy od wartości k ;-)
pod siatka[2,0] kryje się 1.
pod siatka[2,1] kryje się -1.

tablicę dwuwymiarową należy rozumieć tak:

//                  a   b
int[,] siatka = {{ -1, -1 },   // A
                 {  0,  1 },   // B
                 {  1, -1 },   // C
                 { -1,  0 },   // D
                 {  0,  0 },   // E
                 {  1,  0 },   // F
                 { -1,  1 },   // G
                 {  0, -1 },   // H
                 {  1,  1 }};  // I

do elementu odwołujemy się podając dwa indeksy, np. siatka[D,b] gdzie pierwszy indeks oznacza wiersz, a drugi kolumnę.
język C# ponadto rozróżnia pojęcie tablicy wielowymiarowej (int[,] albo int[,,]) od zagnieżdzonej (int[][] albo int[][][]) — w przypadku tej drugiej odwoływalibyśmy się np. siatka[k][0].

1 użytkowników online, w tym zalogowanych: 0, gości: 1