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; } } }
public void dodaj_koniec(int x, int y) { punkty[1] = new Punkt(x, y); }
public void dodaj(int x, int y) { punkty[rozmiar++] = new Punkt(x, y); }
public void dodaj_poczatek(int x, int y) { punkty[0] = new Punkt(x, y); }
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"; }