aboutsummaryrefslogtreecommitdiffstats
path: root/z34.c
diff options
context:
space:
mode:
authorJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 19:21:41 +0000
committerJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 19:21:41 +0000
commit71bdb35d52747e6d7d9f55df4524d57c2966be94 (patch)
tree480ee5eefccc40d5f3331cc52d66f722fd19bfb9 /z34.c
parentb41263ea7578fa9742486135c762803b52794105 (diff)
downloadlout-71bdb35d52747e6d7d9f55df4524d57c2966be94.tar.gz
Lout 3.17.
git-svn-id: http://svn.savannah.nongnu.org/svn/lout/trunk@2 9365b830-b601-4143-9ba8-b4a8e2c3339c
Diffstat (limited to 'z34.c')
-rw-r--r--z34.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/z34.c b/z34.c
new file mode 100644
index 0000000..1e21324
--- /dev/null
+++ b/z34.c
@@ -0,0 +1,112 @@
+/*@z34.c:Rotation Service:Declarations@***************************************/
+/* */
+/* THE LOUT DOCUMENT FORMATTING SYSTEM (VERSION 3.17) */
+/* COPYRIGHT (C) 1991, 1999 Jeffrey H. Kingston */
+/* */
+/* Jeffrey H. Kingston (jeff@cs.usyd.edu.au) */
+/* Basser Department of Computer Science */
+/* The University of Sydney 2006 */
+/* AUSTRALIA */
+/* */
+/* This program is free software; you can redistribute it and/or modify */
+/* it under the terms of the GNU General Public License as published by */
+/* the Free Software Foundation; either Version 2, or (at your option) */
+/* any later version. */
+/* */
+/* This program is distributed in the hope that it will be useful, */
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
+/* GNU General Public License for more details. */
+/* */
+/* You should have received a copy of the GNU General Public License */
+/* along with this program; if not, write to the Free Software */
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA */
+/* */
+/* FILE: z34.c */
+/* MODULE: Rotation Service */
+/* EXTERNS: RotateSize() */
+/* */
+/*****************************************************************************/
+#include <math.h>
+#ifndef M_PI
+#define M_PI 3.1415926535897931160E0
+#endif
+#include "externs.h"
+
+typedef struct { double x, y; } rect_coord;
+typedef struct { double angle, radius; } polar_coord;
+
+#define rect_to_polar(rect, polar) \
+polar.angle = atan2(rect.y, rect.x), \
+polar.radius = sqrt(rect.x*rect.x + rect.y*rect.y)
+
+#define polar_to_rect(polar, rect) \
+rect.x = polar.radius * cos(polar.angle), \
+rect.y = polar.radius * sin(polar.angle)
+
+
+/*@::RotateSize()@************************************************************/
+/* */
+/* RotateSize(xcb, xcf, xrb, xrf, y, theta) */
+/* */
+/* Calculate the size of x, assuming that it is y rotated by theta degrees. */
+/* */
+/*****************************************************************************/
+
+void RotateSize(FULL_LENGTH *xcb, FULL_LENGTH *xcf, FULL_LENGTH *xrb,
+ FULL_LENGTH *xrf, OBJECT y, FULL_LENGTH theta)
+{ rect_coord ycorners[4], xcorner; polar_coord pol;
+ double maxx, maxy, minx, miny, ang; int i;
+#if DEBUG_ON
+ char buff1[20], buff2[20];
+#endif
+
+ /* calculate theta in radians */
+ ang = (double) theta * 2 * M_PI / (double) (DG * 360);
+ ifdebug(DRS, D, sprintf(buff2, "%.1f", ang));
+ debug2(DRS, D, "RotateSize( %s, %s )", EchoObject(y), buff2);
+ debug4(DRS, DD, " ycb %s, ycf %s, yrb %s, yrf %s",
+ EchoLength(back(y, COLM)), EchoLength(fwd(y, COLM)),
+ EchoLength(back(y, ROWM)), EchoLength(fwd(y, ROWM)));
+
+ /* set up coordinates of the four corners of y */
+ ycorners[0].x = (float) fwd(y, COLM);
+ ycorners[0].y = (float) back(y, ROWM);
+ ycorners[1].x = - (float) back(y, COLM);
+ ycorners[1].y = (float) back(y, ROWM);
+ ycorners[2].x = - (float) back(y, COLM);
+ ycorners[2].y = - (float) fwd(y, ROWM);
+ ycorners[3].x = (float) fwd(y, COLM);
+ ycorners[3].y = - (float) fwd(y, ROWM);
+
+ /* rotate these four corners by theta and store their extremes */
+ maxx = maxy = (float) - MAX_FULL_LENGTH;
+ minx = miny = (float) MAX_FULL_LENGTH;
+ for( i = 0; i < 4; i++ )
+ {
+ if( ycorners[i].x == 0 && ycorners[i].y == 0 )
+ { pol.radius = 0; pol.angle = 0; }
+ else rect_to_polar(ycorners[i], pol);
+ ifdebug(DRS, DD, sprintf(buff1, "%.1f", pol.angle));
+ ifdebug(DRS, DD, sprintf(buff2, "%.1f", ang));
+ debug5(DRS, DD, " transforming (%s, %s) -> (%s, %s) + %s",
+ EchoLength( (int) ycorners[i].x), EchoLength( (int) ycorners[i].y),
+ EchoLength( (int) pol.radius), buff1, buff2);
+ pol.angle += ang;
+ polar_to_rect(pol, xcorner);
+ ifdebug(DRS, DD, sprintf(buff1, "%.1f", pol.angle));
+ debug4(DRS, DD, " transforming (%s, %s) -> (%s, %s)",
+ EchoLength( (int) pol.radius), buff1,
+ EchoLength( (int) xcorner.x), EchoLength( (int) xcorner.y) );
+ maxx = find_max(maxx, xcorner.x); minx = find_min(minx, xcorner.x);
+ maxy = find_max(maxy, xcorner.y); miny = find_min(miny, xcorner.y);
+ }
+
+ /* store sizes back into x and return */
+ *xcb = - (int) minx; *xcf = (int) maxx;
+ *xrb = (int) maxy; *xrf = - (int) miny;
+ debug0(DRS, D, "RotateSize returning.");
+ debug4(DRS, DD, " xcb %s, xcf %s, xrb %s, xrf %s",
+ EchoLength(*xcb), EchoLength(*xcf),
+ EchoLength(*xrb), EchoLength(*xrf));
+} /* end RotateSize */