public int intersectWithY(int y, out int x) { int dyStart = m_start.Y - y; int dyEnd = m_end.Y - y; if (dyStart == 0 && dyEnd == 0) { x = 0; return(2); // 无穷个交点 } else if (dyStart * dyEnd <= 0) { if (m_start.Y <= m_end.Y) { float f = HelpFuncs.SmoothStep(m_start.Y, m_end.Y, y); x = (int)HelpFuncs.Lerp(m_start.X, m_end.X, f); } else { float f = HelpFuncs.SmoothStep(m_end.Y, m_start.Y, y); x = (int)HelpFuncs.Lerp(m_end.X, m_start.X, f); } return(1); // 1个焦点 } else { x = 0; Debug.Assert(dyStart * dyEnd > 0); return(0); } }
public void Draw(Bitmap bm, BitmapData bmData, Color c) { LineSegment[] lineSegs = { new LineSegment((Point)m_pts[0], (Point)m_pts[1]), new LineSegment((Point)m_pts[1], (Point)m_pts[2]), new LineSegment((Point)m_pts[2], (Point)m_pts[0]), }; int minY = Math.Max(Math.Min(Math.Min((int)m_pts[0].Y, (int)m_pts[1].Y), (int)m_pts[2].Y), 0); int maxY = Math.Min(Math.Max(Math.Max((int)m_pts[0].Y, (int)m_pts[1].Y), (int)m_pts[2].Y), bm.Height - 1); for (int y = minY; y <= maxY; ++y) { int xCnt = 0; int x1 = 0, x2 = 0; for (int i = 0; i < lineSegs.Length; ++i) { int tx = 0, tIntersectCnt = 0; tIntersectCnt = lineSegs[i].intersectWithY(y, out tx); if (tIntersectCnt == 0) { continue; } else if (tIntersectCnt == 2) { x1 = lineSegs[i].Start.X; x2 = lineSegs[i].End.X; xCnt = 2; break; } else { if (xCnt == 0) { x1 = tx; xCnt = 1; } else if (xCnt == 1) { x2 = tx; xCnt = 2; } else { if (x1 == x2) { x2 = tx; } break; } } } if (xCnt == 0) { continue; } Debug.Assert(xCnt == 2); if (x1 > x2) { HelpFuncs.Swap(ref x1, ref x2); } x1 = Math.Max(x1, 0); x2 = Math.Min(x2, bm.Width - 1); unsafe { int *p = (int *)bmData.Scan0 + y * bmData.Stride / 4; int argb = c.ToArgb(); for (int x = x1; x <= x2; ++x) { p[x] = argb; } } } }