FireFox1.0.2安装Flash7的解决方法 >>
<< 任务派发系统
Line and fillPolygon

Author Zhou Renjian Create@ 2005-04-05 17:59
whizz Note icon
function Line(x1,y1,x2,y2) {
    if (x1 > x2)
    {
        var _x2 = x2;
        var _y2 = y2;
        x2 = x1;
        y2 = y1;
        x1 = _x2;
        y1 = _y2;
    }
    var dx = x2-x1, dy = Math.abs(y2-y1),
    x = x1, y = y1,
    yIncr = (y1 > y2)? -1 : 1;

    if (dx >= dy)
    {
        var pr = dy<<1,
        pru = pr - (dx<<1),
        p = pr-dx,
        ox = x;
        while ((dx--) > 0)
        {
            ++x;
            if (p > 0)
            {
                this.mkDiv(ox, y, x-ox, 1);
                y += yIncr;
                p += pru;
                ox = x;
            }
            else p += pr;
        }
        this.mkDiv(ox, y, x2-ox+1, 1);
    }

    else
    {
        var pr = dx<<1,
        pru = pr - (dy<<1),
        p = pr-dy,
        oy = y;
        if (y2 <= y1)
        {
            while ((dy--) > 0)
            {
                if (p > 0)
                {
                    this.mkDiv(x++, y, 1, oy-y+1);
                    y += yIncr;
                    p += pru;
                    oy = y;
                }
                else
                {
                    y += yIncr;
                    p += pr;
                }
            }
            this.mkDiv(x2, y2, 1, oy-y2+1);
        }
        else
        {
            while ((dy--) > 0)
            {
                y += yIncr;
                if (p > 0)
                {
                    this.mkDiv(x++, oy, 1, y-oy);
                    p += pru;
                    oy = y;
                }
                else p += pr;
            }
            this.mkDiv(x2, oy, 1, y2-oy+1);
        }
    }
}

function fillPolygon(array_x, array_y)
    {
        var i;
        var y;
        var miny, maxy;
        var x1, y1;
        var x2, y2;
        var ind1, ind2;
        var ints;

        var n = array_x.length;

        if (!n) return;
        miny = array_y[0];
        maxy = array_y[0];
        for (i = 1; i < n; i++)
        {
            if (array_y[i] < miny)
                miny = array_y[i];

            if (array_y[i] > maxy)
                maxy = array_y[i];
        }
        for (y = miny; y <= maxy; y++)
        {
            var polyInts = new Array();
            ints = 0;
            for (i = 0; i < n; i++)
            {
                if (!i)
                {
                    ind1 = n-1;
                    ind2 = 0;
                }
                else
                {
                    ind1 = i-1;
                    ind2 = i;
                }
                y1 = array_y[ind1];
                y2 = array_y[ind2];
                if (y1 < y2)
                {
                    x1 = array_x[ind1];
                    x2 = array_x[ind2];
                }
                else if (y1 > y2)
                {
                    y2 = array_y[ind1];
                    y1 = array_y[ind2];
                    x2 = array_x[ind1];
                    x1 = array_x[ind2];
                }
                else continue;

                if ((y >= y1) && (y < y2))
                    polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);

                else if ((y == maxy) && (y > y1) && (y <= y2))
                    polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);
            }
            polyInts.sort(integer_compare);

            for (i = 0; i < ints; i+=2)
            {
                w = polyInts[i+1]-polyInts[i]
                this.mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);
            }
        }
    }


本记录所在类别:
本记录相关记录: