View Raw SPL
/* rotate a line/shape object */
ITERATE hrotate(h, d, xc, yc, norm)
{
        local t, x, y, xr, yr, meanx, meany;
        local xmin, xmax, ymin, ymax;

        meanx = meany = 0;

        h = casthandle(h);

        if (argc < 5)
        {
                if (argc < 4)
                {
                        if (argc < 3)
                        {
                                if (argc < 2)
                                {
                                        if (argc < 1) error(sprintf("%s - handle required", __FUNC__));

                                        d = 90;
                                }

                                meanx = 1;
                        }

                        meany = 1;
                }

                norm = 0;
        }

        x = h.x;
        y = h.y;

        if (meanx) xc = mean(x);
        if (meany) yc = mean(y);

        /* radians */        
        t = pi * d / 180;

        if (norm)
        {
                xmin = getxl(castwindow(h.winnum));
                xmax = getxr(castwindow(h.winnum));
                ymin = getyb(castwindow(h.winnum));
                ymax = getyt(castwindow(h.winnum));

                x = rescale(x, -1, 1, xmin, xmax);
                y = rescale(y, -1, 1, ymin, ymax);

                xc = rescale(xc, -1, 1, xmin, xmax);
                yc = rescale(yc, -1, 1, ymin, ymax);
        }

        /* rotation about xc, yc */
        xr = (x - xc) * cos(t) - (y - yc) * sin(t) + xc;
        yr = (x - xc) * sin(t) + (y - yc) * cos(t) + yc;

        if (norm)
        {
                xr = rescale(xr, xmin, xmax, -1, 1);
                yr = rescale(yr, ymin, ymax, -1, 1);
        }

        h.x = xr;
        h.y = yr;
}