private void FloodFill(Point p, Color c) { Stack <Point> stack = new Stack <Point>(); stack.Push(p); while (stack.Count > 0) { p = stack.Pop(); image.SetPixel(p.X, p.Y, c); if (p.X - 1 > 0 && image.GetPixel(p.X - 1, p.Y).Equals(white)) { stack.Push(new Point(p.X - 1, p.Y)); } if (p.Y - 1 > 0 && image.GetPixel(p.X, p.Y - 1).Equals(white)) { stack.Push(new Point(p.X, p.Y - 1)); } if (p.X + 1 < image.Width && image.GetPixel(p.X + 1, p.Y).Equals(white)) { stack.Push(new Point(p.X + 1, p.Y)); } if (p.Y + 1 < image.Height && image.GetPixel(p.X, p.Y + 1).Equals(white)) { stack.Push(new Point(p.X, p.Y + 1)); } } }
private void pictureBoxSearch_MouseClick(object sender, MouseEventArgs e) { if (!pintar) { if (pa == null) { pa = new Poligono(); } if (x == -1) { x = e.X; y = e.Y; } Aplicacoes.BresenhamReta(x, y, e.X, e.Y, bm); pictureBoxSearch.Image = bm; pa.MOXY[pa.linha, 0] = pa.MAXY[pa.linha, 0] = e.X; pa.MOXY[pa.linha, 1] = pa.MAXY[pa.linha, 1] = e.Y; pa.linha++; x = e.X; y = e.Y; } else { Aplicacoes.FloodFill(e.X, e.Y, r, g, b, bm); pictureBoxSearch.Image = bm; pintar = false; } }
private static void criaET(Poligono p) { ET caixa; et = new ET[buscaMaxY(p)]; for (int i = 0; i < p.linha - 2; i++) { caixa = new ET(); caixa.xmin = p.MAXY[i, 0]; caixa.ymax = p.MAXY[i + 1, 1]; try { caixa.incx = (p.MAXY[i + 1, 0] - p.MAXY[i, 0]) / (p.MAXY[i + 1, 1] - p.MAXY[i, 1]); } catch (Exception ex) { caixa.incx = 0; } caixa.prox = et[p.MAXY[i, 1]]; et[p.MAXY[i, 1]] = caixa; } caixa = new ET(); caixa.xmin = p.MAXY[p.linha - 1, 0]; caixa.ymax = p.MAXY[0, 1]; caixa.incx = (p.MAXY[0, 0] - p.MAXY[p.linha - 1, 0]) / (p.MAXY[0, 1] - p.MAXY[p.linha - 1, 1]); caixa.prox = et[p.MAXY[p.linha - 1, 1] - 1]; et[p.MAXY[p.linha - 1, 1]] = caixa; }
public Form1() { InitializeComponent(); x = -1; pa = ps = null; pintar = false; r = g = b = 255; }
private void pictureBoxSearch_MouseDoubleClick(object sender, MouseEventArgs e) { LBPoligono.Items.Add(pa); LBPoligono.ValueMember = pa.linha.ToString(); Aplicacoes.BresenhamReta(e.X, e.Y, pa.MAXY[0, 0], pa.MAXY[0, 1], bm); pictureBoxSearch.Image = bm; pa = null; x = -1; }
public Poligono(Poligono p) { foreach (Point po in p.PontosAtuais) { pontosAtuais.Add(new Point(po.X, po.Y)); pontosOriginais.Add(new Point(po.X, po.Y)); } Identidade(); }
private void BtQuad_Click(object sender, EventArgs e) { lbDescricao.Visible = false; p = new Poligono(); flag = ((Button)sender).Name.Replace("bt", ""); if (flag.Equals("Bal")) { cdCor.ShowDialog(); } }
private static int buscaMaxY(Poligono p) { int max = 0; for (int i = 0; i < p.linha; i++) { if (p.MAXY[i, 1] > max) { max = p.MAXY[i, 1]; } } return(max); }
private void PictureBox1_MouseMove(object sender, MouseEventArgs e) { List <Point> l = new List <Point>(); if (down.X != -1) { if (flag.Equals("Ret")) { p.Draw(white, image); l.Add(new Point(Math.Min(e.X, down.X), Math.Min(e.Y, down.Y))); l.Add(new Point(Math.Abs(down.X - e.X) + Math.Min(e.X, down.X), Math.Min(e.Y, down.Y))); l.Add(new Point(Math.Max(e.X, down.X), Math.Max(e.Y, down.Y))); l.Add(new Point(Math.Min(e.X, down.X), Math.Abs(down.Y - e.Y) + Math.Min(e.Y, down.Y))); p = new Poligono(l, 'R'); p.Draw(color, image); } else if (flag.Equals("Circ")) { Primitivas.ponto_medio_circunf(down.X, down.Y, old.X, old.Y, white, image); Primitivas.ponto_medio_circunf(down.X, down.Y, e.X, e.Y, color, image); } else if (flag.Equals("Elip")) { Primitivas.ponto_medio_elipse(down.X, down.Y, old.X, old.Y, white, image); Primitivas.ponto_medio_elipse(down.X, down.Y, e.X, e.Y, color, image); } else if (flag.Equals("Reta")) { Primitivas.bresenham(down.X, down.Y, old.X, old.Y, white, image); Primitivas.bresenham(down.X, down.Y, e.X, e.Y, color, image); } else if (flag.Equals("Livre")) { Primitivas.bresenham(liv.X, liv.Y, e.X, e.Y, color, image); liv = e.Location; } else if (flag.Equals("Pol")) { Primitivas.bresenham(down.X, down.Y, old.X, old.Y, white, image); Primitivas.bresenham(down.X, down.Y, e.X, e.Y, color, image); } old = e.Location; pbMain.Image = image; } lbX.Text = e.X + ""; lbY.Text = e.Y + ""; }
public void SetPoligono(Object o) { this.p = (Poligono)o; pictureBox1.Width = Width - 15; pictureBox1.Height = Height - 45; pictureBox1.Location = new Point(Location.X, Location.Y); image = new Bitmap(pictureBox1.Width, pictureBox1.Height); Point centro = p.Centro(); Point min = p.MinPoint(), max = p.MaxPoint(); p.Escala(((double)Width - 15) / (max.X - min.X), ((double)Height - 45) / (max.Y - min.Y)); p.Translacao(-min.X, -min.Y); p.Draw(Color.Black, image); pictureBox1.Image = image; }
public static void cisalhamento(int x, int y, Poligono p) { double[,] maT = new double[3, 3]; maT[0, 0] = 1; maT[0, 1] = 0; maT[0, 2] = 0; maT[1, 0] = x; maT[1, 1] = 1; maT[1, 2] = 0; maT[2, 0] = 0; maT[2, 1] = 0; maT[2, 2] = 1; p.MA = multiplicaMatriz(maT, p.MA); for (int i = 0; i < p.linha; i++) { p.MAXY[i, 0] = (int)Math.Round(p.MA[0, 0] * p.MOXY[i, 0] + p.MA[0, 1] * p.MOXY[i, 1] + p.MA[0, 2]); p.MAXY[i, 1] = (int)Math.Round(p.MA[1, 0] * p.MOXY[i, 0] + p.MA[1, 1] * p.MOXY[i, 1] + p.MA[1, 2]); } maT[0, 0] = 1; maT[0, 1] = y; maT[0, 2] = 0; maT[1, 0] = 0; maT[1, 1] = 1; maT[1, 2] = 0; maT[2, 0] = 0; maT[2, 1] = 0; maT[2, 2] = 1; p.MA = multiplicaMatriz(maT, p.MA); for (int i = 0; i < p.linha; i++) { p.MAXY[i, 0] = (int)Math.Round(p.MA[0, 0] * p.MOXY[i, 0] + p.MA[0, 1] * p.MOXY[i, 1] + p.MA[0, 2]); p.MAXY[i, 1] = (int)Math.Round(p.MA[1, 0] * p.MOXY[i, 0] + p.MA[1, 1] * p.MOXY[i, 1] + p.MA[1, 2]); } }
public static void Scanline(Poligono p, int cx, int cy, int r, int g, int b, Bitmap imageBitmapSrc) { int y; criaET(p); aet = null; for (y = 0; et[y] != null; y++) { } //aet = et[y]; do { insereAET(y); excluiAET(y); ordenaAET(); desenhaLinha(cx, cy, y, r, g, b, imageBitmapSrc); atualizaXmin(); y++; }while (aet != null); }
public static void rotacionar(int ang, Poligono p) { double[,] maT = new double[3, 3]; maT[0, 0] = Math.Cos(ang); maT[0, 1] = -Math.Sin(ang); maT[0, 2] = 0; maT[1, 0] = Math.Sin(ang); maT[1, 1] = Math.Cos(ang); maT[1, 2] = 0; maT[2, 0] = 0; maT[2, 1] = 0; maT[2, 2] = 1; p.MA = multiplicaMatriz(maT, p.MA); for (int i = 0; i < p.linha; i++) { p.MAXY[i, 0] = (int)Math.Round(p.MA[0, 0] * p.MOXY[i, 0] + p.MA[0, 1] * p.MOXY[i, 1] + p.MA[0, 2]); p.MAXY[i, 1] = (int)Math.Round(p.MA[1, 0] * p.MOXY[i, 0] + p.MA[1, 1] * p.MOXY[i, 1] + p.MA[1, 2]); } }
private void PictureBox1_MouseUp(object sender, MouseEventArgs e) { if (down.X != -1 && !flag.Equals("")) { if (flag.Equals("Livre") || flag.Equals("Reta") || flag.Equals("Circ") || flag.Equals("Elip")) { old.X = 0; down.X = -1; } else if (!flag.Equals("Pol")) { p.Pol1 = "Poligono " + (lvPolig.Items.Count + 1); lvPolig.Items.Add(p); p = new Poligono(); old.X = 0; down.X = -1; } else if (p.PontosAtuais.Count > 2 && e.Button == MouseButtons.Right) { Primitivas.bresenham(down.X, down.Y, p.PontosOriginais[0].X, p.PontosOriginais[0].Y, Color.Black, image); p.Pol1 = "Poligono " + (lvPolig.Items.Count + 1); lvPolig.Items.Add(p); p = new Poligono(); old.X = 0; down.X = -1; } else { down = e.Location; } } pbMain.Image = image; }
private void ListBox1_SelectedIndexChanged(object sender, EventArgs e) { if (lvPolig.SelectedIndex > -1) { p = (Poligono)lvPolig.Items[lvPolig.SelectedIndex]; p.Draw(Color.Red, image); DataTable dt = new DataTable(); dt.Columns.Add("X"); dt.Columns.Add("Y"); foreach (Point pts in p.PontosAtuais) { DataRow dr = dt.NewRow(); dr["X"] = pts.X; dr["Y"] = pts.Y; dt.Rows.Add(dr); } gbTrans.Enabled = true; dataGridView1.DataSource = dt; pbMain.Image = image; } }
private void PictureBox1_MouseDown(object sender, MouseEventArgs e) { if (!flag.Equals("")) { if (flag.Equals("Bal")) { FloodFill(e.Location, cdCor.Color); pbMain.Image = image; } else { if (down.X == -1) { p = new Poligono(); } down = liv = e.Location; if (flag.Equals("Pol") && down.X != -1) { p.AddPonto(down); } } } }
public void SetPoligono(Object p) { this.p = new Poligono((Poligono)p); }
public static void flipVH(Poligono p) { flipV(p); flipH(p); }