Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
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;
                    }
                }
            }
        }