public virtual void ApplyFill(OpenGL gl, ET edgeTable) { }
public override void FillColor(OpenGL gl, ET edgeTable) { //Lấy bảng ET Hashtable hashTable = new Hashtable(); hashTable = edgeTable.GetET(); //Lấy max key, min key int minKey = edgeTable.GetMinKey(); int maxKey = edgeTable.GetMaxKey(); //Khởi tạo linked list beg List để lưu các cạnh LinkedList <ALE> begList = new LinkedList <ALE>(); for (int i = minKey; i < maxKey; i++) { //Thêm các cạnh vào begList if (hashTable.ContainsKey(i)) { foreach (ALE edge in (LinkedList <ALE>)hashTable[i]) { begList.AddLast(edge); } } //Lưu cạnh theo x intersect var saveBegList = ((LinkedList <ALE>)begList).OrderBy(edge => edge.GetXIntersect()); //Vẽ các đường thẳng (scanline) var node = begList.First; while (node != null && node.Next != null) { var nextNode = node.Next; var afterNextNode = nextNode.Next; //Lấy điểm và vẽ Point p1 = new Point((int)node.Value.GetXIntersect(), i); Point p2 = new Point((int)nextNode.Value.GetXIntersect(), i); gl.Color(newColor.R / 255.0, newColor.G / 255.0, newColor.B / 255.0); gl.Begin(OpenGL.GL_LINES); gl.Vertex(p1.X, p1.Y); gl.Vertex(p2.X, p2.Y); gl.End(); node = afterNextNode; } //Xóa các cạnh có yUpper = i var node1 = begList.First; while (node1 != null) { var nextNode = node1.Next; if (node1.Value.GetYUpper() == i) { begList.Remove(node1); } node1 = nextNode; } //Cập nhật lại x intersect foreach (ALE e in begList) { e.UpdateXIntersect(); } } gl.Flush(); }
public virtual void FillColor(OpenGL gl, ET edgeTable) { }
public override void ApplyFill(OpenGL gl, ET edgeTable) { FillColor(gl, edgeTable); }