X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsupport%2Fxform.cpp;fp=libctsupport%2Fxform.cpp;h=8d58f766a4dfdcbbb0e19b48aeffe9fde4de7964;hp=0000000000000000000000000000000000000000;hb=99dd1d6ed10db1f669a5fe6af71225a50fc0ddfb;hpb=2c61ff85796550481227f2fbec53506a6b5bd365 diff --git a/libctsupport/xform.cpp b/libctsupport/xform.cpp new file mode 100644 index 0000000..8d58f76 --- /dev/null +++ b/libctsupport/xform.cpp @@ -0,0 +1,148 @@ +/***************************************************************************** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: xform.cpp,v 1.1 2000/06/19 02:58:08 kevin Exp $ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** 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 +******************************************************************************/ + +#include "kmath.h" + +/* NAME + * rotate2d Rotates an array of 2 dimensional vectors + * + * SYNOPSIS + * rotate2d (x, y, n, angle) + * double x[], y[] Array of points + * int n Number of points in array + * double angle Rotation angle (counter-clockwise) + */ + +void +rotate2d (double x[], double y[], int n, double angle) +{ + double cos_theta = cos (angle); + double sin_theta = sin (angle); + + for (int i = 0; i < n; i++) { + double xrot = x[i] * cos_theta - y[i] * sin_theta; + double yrot = x[i] * sin_theta + y[i] * cos_theta; + x[i] = xrot; + y[i] = yrot; + } +} + + +/* NAME + * xlat2d Translates an array of 2 dimensional vectors + * + * SYNOPSIS + * xlat2d (x, y, n, xoffset, yoffset) + * double x[], y[] Array of points + * int n Number of points in array + * double xoffset, yoffset Offset to translate points by + */ + +void +xlat2d (double x[], double y[], int n, double xoffset, double yoffset) +{ + for (int i = 0; i < n; i++) { + x[i] += xoffset; + y[i] += yoffset; + } +} + + +/* NAME + * scale2d Scale an array of 2 dimensional vectors + * + * SYNOPSIS + * scale2d (x, y, n, xoffset, yoffset) + * double x[], y[] Array of points + * int n Number of points in array + * double xfact, yfact x & y scaling factors + */ + +void +scale2d (double x[], double y[], int n, double xfact, double yfact) +{ + for (int i = 0; i < n; i++) { + x[i] *= xfact; + y[i] *= yfact; + } +} + + +void +indent_mtx2 (GRFMTX_2D m) +{ + m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; + m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; + m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; +} + +void +xlat_mtx2 (GRFMTX_2D m, const double x, const double y) +{ + indent_mtx2 (m); + m[2][0] = x; + m[2][1] = y; +} + +void +scale_mtx2 (GRFMTX_2D m, const double sx, const double sy) +{ + indent_mtx2 (m); + m[0][0] = sx; + m[1][1] = sy; +} + +void +rot_mtx2 (GRFMTX_2D m, const double theta) +{ + double c = cos(theta); + double s = sin(theta); + + indent_mtx2 (m); + m[0][0] = c; m[0][1] = s; + m[1][0] = -s; m[1][1] = c; +} + +void +mult_mtx2 (GRFMTX_2D m1, GRFMTX_2D m2, GRFMTX_2D result) +{ + GRFMTX_2D temp; + + for (int row = 0; row < 3; row++) + for (int col = 0; col < 3; col++) { + temp[row][col] = 0; + for (int calc = 0; calc < 3; calc++) + temp[row][col] += m1[row][calc] * m2[calc][col]; + } + + for (int row = 0; row < 3; row++) + for (int col = 0; col < 3; col++) + result[row][col] = temp[row][col]; +} + +void +xform_mtx2 (GRFMTX_2D m, double& x, double& y) +{ + double xt = x * m[0][0] + y * m[1][0] + m[2][0]; + double yt = x * m[0][1] + y * m[1][1] + m[2][1]; + + x = xt; + y = yt; +}