public List <ETentry> getEgdeTable(List <Point4D> polygon) { List <ETentry> edgeTable = new List <ETentry>(); Point4D temp = polygon.Last(); foreach (var v in polygon) { ETentry et = new ETentry(); et.ymin = (int)Math.Min(v.Y, temp.Y); et.ymax = (int)Math.Max(v.Y, temp.Y); if (v.Y < temp.Y) { et.xmin = (float)v.X; } else { et.xmin = (float)temp.X; } if (v.Y < temp.Y) { et.zmin = (float)v.Z; } else { et.zmin = (float)temp.Z; } float dy = (float)(v.Y - temp.Y); float dx = (float)(v.X - temp.X); float dz = (float)(v.Z - temp.Z); //if (dy == 0) et.oneoverm = 0; if (dy == 0) { continue; } et.oneoverm = (float)dx / (float)dy; et.dzOVERdy = (float)dz / (float)dy; edgeTable.Add(et); temp = v; } edgeTable.Sort((p, q) => p.ymin.CompareTo(q.ymin)); return(edgeTable); }
public List <ETentry> getEgdeTable(List <Point> polygon) { List <ETentry> edgeTable = new List <ETentry>(); Point temp = polygon.Last(); foreach (var v in polygon) { ETentry et = new ETentry(); et.ymin = Math.Min(v.Y, temp.Y); et.ymax = Math.Max(v.Y, temp.Y); //et.xmin = Math.Min(v.X, temp.X); //wspolrzedna x od ymin if (v.Y < temp.Y) { et.xmin = v.X; } else { et.xmin = temp.X; } int dy = (v.Y - temp.Y); int dx = (v.X - temp.X); //if (dy == 0) et.oneoverm = 1; //if (dx == 0) et.oneoverm = 0; if (dy == 0) { et.oneoverm = 0; } //if( dx != 0 && dy != 0) et.oneoverm = (float) dy / (float) dx; if (dy != 0) { et.oneoverm = (float)dx / (float)dy; } //et.b = v.Y - et.oneoverm * v.X; //et.next = null; edgeTable.Add(et); temp = v; } edgeTable.Sort((p, q) => p.ymin.CompareTo(q.ymin)); return(edgeTable); }
public void fillPolygon(List <Point> polygon, Color color) { List <ETentry> edgeTable = getEgdeTable(polygon); ETentry ETmin = edgeTable[0]; int y = ETmin.ymin; List <ETentry> activeEdgeTable = new List <ETentry>(); SolidBrush br = new SolidBrush(color); while (edgeTable.Count != 0 || activeEdgeTable.Count != 0) { List <ETentry> toRemove = new List <ETentry>(); foreach (var et in edgeTable) { if (et.ymin == y) { activeEdgeTable.Add(et); toRemove.Add(et); } else { break; } } foreach (var et in toRemove) { edgeTable.Remove(et); } toRemove.Clear(); activeEdgeTable.Sort((p, q) => p.xmin.CompareTo(q.xmin)); for (int n = 0; n < activeEdgeTable.Count; n += 2) { //int border1 = (int)((y - activeEdgeTable[n].b) / (activeEdgeTable[n].oneoverm / 1)); //int border2 = (int)((y - activeEdgeTable[n + 1].b) / (activeEdgeTable[n + 1].oneoverm / 1)); //if(border1 > border2) //{ // int temp = border1; // border1 = border2; // border2 = temp; //} //for (int a = border1; a <= border2; a++) for (int a = (int)activeEdgeTable[n].xmin; (int)a <= activeEdgeTable[n + 1].xmin; a++) { graphics.FillRectangle(br, a, y, 1, 1); } } ++y; foreach (var e in activeEdgeTable.ToList()) { if (e.ymax == y) { activeEdgeTable.Remove(e); } } foreach (var e in activeEdgeTable.ToList()) { e.xmin += e.oneoverm; } } }
public Bitmap fillPolygon(List <Point4D> polygon, Color color, Bitmap bmp) { Bitmap bmpt = bmp; List <ETentry> edgeTable = getEgdeTable(polygon); ETentry ETmin = edgeTable[0]; int y = ETmin.ymin; List <ETentry> activeEdgeTable = new List <ETentry>(); SolidBrush br = new SolidBrush(color); while (edgeTable.Count != 0 || activeEdgeTable.Count != 0) { List <ETentry> toRemove = new List <ETentry>(); foreach (var et in edgeTable) { if (et.ymin == y) { activeEdgeTable.Add(et); toRemove.Add(et); } else { break; } } foreach (var et in toRemove) { edgeTable.Remove(et); } toRemove.Clear(); activeEdgeTable.Sort((p, q) => p.xmin.CompareTo(q.xmin)); for (int n = 0; n < activeEdgeTable.Count; n += 2) { if (n + 1 < activeEdgeTable.Count) { float tempZ = activeEdgeTable[n].zmin; float diff = (activeEdgeTable[n + 1].zmin - activeEdgeTable[n].zmin) / (activeEdgeTable[n + 1].xmin - activeEdgeTable[n].xmin); for (int a = (int)activeEdgeTable[n].xmin; a <= activeEdgeTable[n + 1].xmin; a++) { if (a < pictureBox1.Width && y < pictureBox1.Height && a >= 0 && y >= 0) { if (tempZ >= zBuffer[a, y]) { bmpt.SetPixel(a, y, color); zBuffer[a, y] = tempZ; } } tempZ += diff; } } } ++y; foreach (var e in activeEdgeTable.ToList()) { if (e.ymax == y) { activeEdgeTable.Remove(e); } } foreach (var e in activeEdgeTable.ToList()) { e.xmin += e.oneoverm; //dx/dy e.zmin += e.dzOVERdy; } } return(bmpt); }