Пример #1
0
        void Rasterization_DrawLine_Horizontal(point_t _pS, point_t _pE, triangle_2D _triangle)
        {
            int _start = Math.Min(_pS.x, _pE.x);
            int _end   = Math.Max(_pS.x, _pE.x);

            for (int x = _start; x <= _end; x++)
            {
                point_t _cur = new point_t(x, _pS.y);
                Color   _col = Triangle_Interpolation_Color(_cur, _triangle);
                DrawPoint(_cur.x, _cur.y, _col);
            }
        }
Пример #2
0
        void DrawTriangle(vertex_t v1, vertex_t v2, vertex_t v3)
        {
            vector_t p1, p2, p3, c1, c2, c3;

            // 按照 Transform 变化
            c1 = Tools.matrix_apply(v1.pos, mTransformer.transform);
            c2 = Tools.matrix_apply(v2.pos, mTransformer.transform);
            c3 = Tools.matrix_apply(v3.pos, mTransformer.transform);

            p1 = Tools.Homogenize(c1);
            p2 = Tools.Homogenize(c2);
            p3 = Tools.Homogenize(c3);

            point_t _point1 = new point_t((int)p1.x, (int)p1.y);
            point_t _point2 = new point_t((int)p2.x, (int)p2.y);
            point_t _point3 = new point_t((int)p3.x, (int)p3.y);


            //画线框
            //DrawLine(_point1, _point2, Color.Black);
            //DrawLine(_point2, _point3, Color.Black);
            //DrawLine(_point1, _point3, Color.Black);

            //DrawPoint_S(_point1, Color.Red, 3);
            //DrawPoint_S(_point2, Color.Yellow, 3);
            //DrawPoint_S(_point3, Color.Blue, 3);

            if (TriangleCullingJudge_A(c1, c2, c3))
            {
            }
            else
            {
                //光栅化填充
                triangle_2D _triangle = new triangle_2D();
                _triangle.mPoints[0] = _point1; _triangle.mPoints[1] = _point2; _triangle.mPoints[2] = _point3;
                _triangle.mColors[0] = v1.color; _triangle.mColors[1] = v2.color; _triangle.mColors[2] = v3.color;

                Rasterization_Triangle(_triangle);
            }
        }
Пример #3
0
        Color Triangle_Interpolation_Color(point_t _c, triangle_2D _triangle)
        {
            Color _tmp = _triangle.mColors[0];

            float[] acreageList = new float[3];
            acreageList[0] = Tools.Triangle_Acreage_2D(_c, _triangle.mPoints[1], _triangle.mPoints[2]);
            acreageList[1] = Tools.Triangle_Acreage_2D(_c, _triangle.mPoints[0], _triangle.mPoints[2]);
            acreageList[2] = Tools.Triangle_Acreage_2D(_c, _triangle.mPoints[0], _triangle.mPoints[1]);
            float _sum = 0f, _r = 0f, _g = 0f, _b = 0f;

            for (int i = 0; i < 3; ++i)
            {
                _sum += acreageList[i];
                _r   += _triangle.mColors[i].R * acreageList[i];
                _g   += _triangle.mColors[i].G * acreageList[i];
                _b   += _triangle.mColors[i].B * acreageList[i];
            }
            _tmp = Color.FromArgb(Tools.CMID((int)(_r / _sum), 0, 255),
                                  Tools.CMID((int)(_g / _sum), 0, 255),
                                  Tools.CMID((int)(_b / _sum), 0, 255));
            return(_tmp);
        }
Пример #4
0
 void Rasterization_Triangle_V(int x1, int y1, int x2, int y2, int x3, int y3, triangle_2D _triangle)
 {
     for (int y = y1; y <= y3; ++y)
     {
         int xs, xe;
         xs = (int)((y - y1) * (x3 - x1) / (y3 - y1) + x1 + 0.5f);
         xe = (int)((y - y2) * (x3 - x2) / (y3 - y2) + x2 + 0.5f);
         Rasterization_DrawLine_Horizontal(new point_t(xs, y), new point_t(xe, y), _triangle);
     }
 }
Пример #5
0
        //平底 A
        //平顶 V

        void Rasterization_Triangle(triangle_2D _triangle)
        {
            point_t p1 = _triangle.mPoints[0], p2 = _triangle.mPoints[1], p3 = _triangle.mPoints[2];
            int     x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y, x3 = p3.x, y3 = p3.y;

            if (y1 == y2)
            {
                if (y3 <= y1) // A
                {
                    Rasterization_Triangle_A(x3, y3, x1, y1, x2, y2, _triangle);
                }
                else // V
                {
                    Rasterization_Triangle_V(x1, y1, x2, y2, x3, y3, _triangle);
                }
            }
            else if (y1 == y3)
            {
                if (y2 <= y1) // A
                {
                    Rasterization_Triangle_A(x2, y2, x1, y1, x3, y3, _triangle);
                }
                else // V
                {
                    Rasterization_Triangle_V(x1, y1, x3, y3, x2, y2, _triangle);
                }
            }
            else if (y2 == y3)
            {
                if (y1 <= y2) // A
                {
                    Rasterization_Triangle_A(x1, y1, x2, y2, x3, y3, _triangle);
                }
                else // V
                {
                    Rasterization_Triangle_V(x2, y2, x3, y3, x1, y1, _triangle);
                }
            }
            else
            {
                int xtop = 0, ytop = 0, xmiddle = 0, ymiddle = 0, xbottom = 0, ybottom = 0;
                if (y1 < y2 && y2 < y3) // y1 y2 y3
                {
                    xtop    = x1;
                    ytop    = y1;
                    xmiddle = x2;
                    ymiddle = y2;
                    xbottom = x3;
                    ybottom = y3;
                }
                else if (y1 < y3 && y3 < y2) // y1 y3 y2
                {
                    xtop    = x1;
                    ytop    = y1;
                    xmiddle = x3;
                    ymiddle = y3;
                    xbottom = x2;
                    ybottom = y2;
                }
                else if (y2 < y1 && y1 < y3) // y2 y1 y3
                {
                    xtop    = x2;
                    ytop    = y2;
                    xmiddle = x1;
                    ymiddle = y1;
                    xbottom = x3;
                    ybottom = y3;
                }
                else if (y2 < y3 && y3 < y1) // y2 y3 y1
                {
                    xtop    = x2;
                    ytop    = y2;
                    xmiddle = x3;
                    ymiddle = y3;
                    xbottom = x1;
                    ybottom = y1;
                }
                else if (y3 < y1 && y1 < y2) // y3 y1 y2
                {
                    xtop    = x3;
                    ytop    = y3;
                    xmiddle = x1;
                    ymiddle = y1;
                    xbottom = x2;
                    ybottom = y2;
                }
                else if (y3 < y2 && y2 < y1) // y3 y2 y1
                {
                    xtop    = x3;
                    ytop    = y3;
                    xmiddle = x2;
                    ymiddle = y2;
                    xbottom = x1;
                    ybottom = y1;
                }
                int xl; // 长边在ymiddle时的x,来决定长边是在左边还是右边
                xl = (int)((ymiddle - ytop) * (xbottom - xtop) / (ybottom - ytop) + xtop + 0.5f);

                if (xl <= xmiddle) // 左三角形
                {
                    Rasterization_Triangle_A(xtop, ytop, xl, ymiddle, xmiddle, ymiddle, _triangle);
                    Rasterization_Triangle_V(xl, ymiddle, xmiddle, ymiddle, xbottom, ybottom, _triangle);
                }
                else // 右三角形
                {
                    Rasterization_Triangle_A(xtop, ytop, xmiddle, ymiddle, xl, ymiddle, _triangle);
                    Rasterization_Triangle_V(xmiddle, ymiddle, xl, ymiddle, xbottom, ybottom, _triangle);
                }
            }
        }