public override void ScanLine(OpenGL gl) { ET = new List <List <AEL> >(); /*Tạo Edge Table*/ for (int y = ymin; y <= ymax; y++) { List <AEL> subList = new List <AEL>(); ET.Add(subList); } for (int i = 0; i < Vertex.Count; i++) { int y = Vertex[i].Y; int x = Vertex[i].X; if (ET[y - ymin].Count == 0) { AEL t = new AEL(); t.x = x; ET[y - ymin].Add(t); ET[y - ymin].Add(t); } else { AEL t = new AEL(); t.x = Math.Min(ET[y - ymin][0].x, x); ET[y - ymin][0] = t; t.x = Math.Max(ET[y - ymin][1].x, x); ET[y - ymin][1] = t; } } gl.Color(colorFilling.R / 255.0, colorFilling.G / 255.0, colorFilling.B / 255.0); gl.Begin(OpenGL.GL_LINES); for (int y = ymin; y <= ymax; y++) { if (ET[y - ymin].Count != 0) { gl.Vertex(ET[y - ymin][0].x, y); gl.Vertex(ET[y - ymin][1].x, y); } } gl.End(); gl.Flush(); }
virtual public void AddEdge(OpenGL gl) { /*Them cac canh*/ Edge = new List <AEL>(); AEL t; ymin = Vertex[0].Y; ymax = Vertex[0].Y; for (int i = 0; i < Vertex.Count - 1; i++) { t = new AEL(); t.y_upper = Math.Max(Vertex[i].Y, Vertex[i + 1].Y); t.y_lower = Math.Min(Vertex[i].Y, Vertex[i + 1].Y); t.x = Vertex[i].Y > Vertex[i + 1].Y ? Vertex[i + 1].X : Vertex[i].X; if (t.y_lower == t.y_upper) { t.slope = 0; } else { t.slope = (Vertex[i].X - Vertex[i + 1].X) * 1.0 / (Vertex[i].Y - Vertex[i + 1].Y) * 1.0; } // Tinh chỉnh lại dữ liệu //TH1: Giảm: //TH2: Tăng if (i == 0) { // Giảm if (Vertex[i + 1].Y < Vertex[i].Y && Vertex[i].Y < Vertex[Vertex.Count - 1].Y) { t.y_upper--; } else //Tăng if (Vertex[i + 2].Y > Vertex[i + 1].Y && Vertex[i + 1].Y > Vertex[i].Y) { t.y_upper--; } } else { //Giảm if (Vertex[i + 1].Y < Vertex[i].Y && Vertex[i].Y < Vertex[i - 1].Y) { t.y_upper--; } else if (i == Vertex.Count - 2) { if (Vertex[0].Y > Vertex[i + 1].Y && Vertex[i + 1].Y > Vertex[i].Y) { t.y_upper--; } } else if (Vertex[i + 2].Y > Vertex[i + 1].Y && Vertex[i + 1].Y > Vertex[i].Y) { t.y_upper--; } } Edge.Add(t); ymin = Math.Min(ymin, Vertex[i + 1].Y); ymax = Math.Max(ymax, Vertex[i + 1].Y); } t = new AEL(); t.y_upper = Math.Max(Vertex[Vertex.Count - 1].Y, Vertex[0].Y); t.y_lower = Math.Min(Vertex[Vertex.Count - 1].Y, Vertex[0].Y); t.x = Vertex[Vertex.Count - 1].Y > Vertex[0].Y ? Vertex[0].X : Vertex[Vertex.Count - 1].X; if (t.y_lower == t.y_upper) { t.slope = 0; } else { t.slope = (Vertex[Vertex.Count - 1].X - Vertex[0].X) * 1.0 / (Vertex[Vertex.Count - 1].Y - Vertex[0].Y) * 1.0; } //Giảm if (Vertex[0].Y < Vertex[Vertex.Count - 1].Y && Vertex[Vertex.Count - 1].Y < Vertex[Vertex.Count - 2].Y) { t.y_upper--; } else if (Vertex[Vertex.Count - 1].Y < Vertex[0].Y && Vertex[0].Y < Vertex[1].Y) { t.y_upper--; } Edge.Add(t); }
virtual public void ScanLine(OpenGL gl) { boundaryFill = false; scanLine = true; ET = new List <List <AEL> >(); BegList = new List <AEL>(); /*Tạo Edge Table*/ for (int y = ymin; y <= ymax; y++) { List <AEL> subList = new List <AEL>(); ET.Add(subList); } for (int i = 0; i < Edge.Count; i++) { if (Edge[i].y_lower != Edge[i].y_upper) { int y = Edge[i].y_lower; ET[y - ymin].Add(Edge[i]); } } /**/ for (int y = ymin; y <= ymax; y++) { for (int i = 0; i < ET[y - ymin].Count; i++) { BegList.Add(ET[y - ymin][i]); } /*Sort*/ BegList = BegList.OrderBy(o => o.x).ToList(); /*Lấp*/ gl.Color(colorFilling.R / 255.0, colorFilling.G / 255.0, colorFilling.B / 255.0); gl.Begin(OpenGL.GL_LINES); for (int i = 0; i < BegList.Count; i += 2) { if (i + 1 < BegList.Count) { gl.Vertex(BegList[i].x, y); gl.Vertex(BegList[i + 1].x, y); } } gl.End(); gl.Flush(); /*Xóa*/ int j = 0; while (j < BegList.Count) { if (BegList[j].y_upper == y) { BegList.RemoveAt(j); } else { j++; } } /*Update*/ for (int i = 0; i < BegList.Count; i++) { AEL t = new AEL(); t.slope = BegList[i].slope; t.y_lower = BegList[i].y_lower; t.y_upper = BegList[i].y_upper; t.x = BegList[i].x + BegList[i].slope; BegList[i] = t; } }