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;
}