예제 #1
0
        public void line(Punkt a, Punkt b)
        {
            int w = b.x - a.x;
            int h = b.y - a.y;
            int dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0;

            if (w < 0)
            {
                dx1 = -1;
            }
            else if (w > 0)
            {
                dx1 = 1;
            }
            if (h < 0)
            {
                dy1 = -1;
            }
            else if (h > 0)
            {
                dy1 = 1;
            }
            if (w < 0)
            {
                dx2 = -1;
            }
            else if (w > 0)
            {
                dx2 = 1;
            }
            int longest  = Math.Abs(w);
            int shortest = Math.Abs(h);

            if (!(longest > shortest))
            {
                longest  = Math.Abs(h);
                shortest = Math.Abs(w);
                if (h < 0)
                {
                    dy2 = -1;
                }
                else if (h > 0)
                {
                    dy2 = 1;
                }
                dx2 = 0;
            }
            int numerator = longest >> 1;

            for (int i = 0; i <= longest; i++)
            {
                //putpixel(x, y, color);
                if (image1.GetPixel(a.x, a.y).B == 0)
                {
                    jest_droga = false;
                    break;
                }
                numerator += shortest;
                if (!(numerator < longest))
                {
                    numerator -= longest;
                    a.x       += dx1;
                    a.y       += dy1;
                }
                else
                {
                    a.x += dx2;
                    a.y += dy2;
                }
            }
        }
예제 #2
0
 public void dodaj_koniec(int x, int y)
 {
     punkty[1] = new Punkt(x, y);
 }
예제 #3
0
 public void dodaj(int x, int y)
 {
     punkty[rozmiar++] = new Punkt(x, y);
 }
예제 #4
0
 public void dodaj_poczatek(int x, int y)
 {
     punkty[0] = new Punkt(x, y);
 }
예제 #5
0
        private void button1_Click(object sender, EventArgs e) //Znalezienie losowych puntków na wodzie, rysowanie
        {
            int x, y;

            Graphics g = Graphics.FromImage(image1);

            int MAX           = 1000; //ile punktów losujemy
            int ilosc_punktow = 0;

            this.punkty = new Punkty(MAX + 1);

            Random rnd = new Random();

            for (int i = 0; i < MAX; ++i)
            {
                x = rnd.Next(1, 3592);
                y = rnd.Next(1, 2416);

                if (image1.GetPixel(x, y).R != 0) //Wybieranie tych, które znajdują się na wodzie (nie są w kolorze czarnym)
                {
                    this.punkty.dodaj(x, y);
                    SolidBrush myBrush;
                    myBrush = new SolidBrush(Color.FromArgb(0, 0, 255));           //rysowanie czarnych punktów dookoła wybranych pikseli
                    g.FillEllipse(myBrush, new Rectangle(x - 10, y - 10, 20, 20)); //rysowanie linii
                }
            }
            this.punkty.dodaj_poczatek(3060, 775); //Tokyo
            this.punkty.dodaj_koniec(1795, 541);   //London

            //Narysowanie punktu startowego i końcowego (Tokio-Londyn)
            SolidBrush myBrush1 = new SolidBrush(Color.FromArgb(255, 0, 0));

            g.FillEllipse(myBrush1, new Rectangle(3060 - 10, 765 - 10, 20, 20));

            SolidBrush myBrush2 = new SolidBrush(Color.FromArgb(0, 255, 0));

            g.FillEllipse(myBrush2, new Rectangle(1795, 541, 20, 20));

            //Algorytm PRM
            int odl_max = 190; //max. odległość od wierzchołka sąsiedniego

            for (int i = 0; i < this.punkty.rozmiar - 1; ++i)
            {
                for (int j = i + 1; j < this.punkty.rozmiar; ++j)
                {
                    Punkt a = this.punkty.punkty[i];
                    Punkt b = this.punkty.punkty[j];
                    jest_droga = false;
                    int odl = odleglosc(a, b);
                    if (odl != 0 && odl < odl_max)
                    {
                        jest_droga = true;
                        line(a, b);
                        if (jest_droga)
                        {
                            dobrePunkty.Add(i);
                            a.sasiedzi.Add(j);
                            b.sasiedzi.Add(i);
                            a.odleglosci.Add(odl);
                            b.odleglosci.Add(odl);
                            a = this.punkty.punkty[i];
                            using (var graphics = Graphics.FromImage(image1))
                            {
                                graphics.DrawLine(bluePen, a.x, a.y, b.x, b.y);
                                pictureBox1.Image    = image1;
                                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                            }
                        }
                    }
                }
            }
            label1.Text = "Zakończono rysowanie";
        }