--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ldObjectMath.cpp Sun Aug 31 20:39:30 2014 +0300 @@ -0,0 +1,89 @@ +/* + * LDForge: LDraw parts authoring CAD + * Copyright (C) 2013, 2014 Teemu Piippo + * + * 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. + */ + +#include "ldObjectMath.h" +#include "ldObject.h" +#include "miscallenous.h" + +// ============================================================================= +// +static void RotateVertex (Vertex& v, const Vertex& rotpoint, const Matrix& transformer) +{ + v -= rotpoint; + v.transform (transformer, Origin); + v += rotpoint; +} + +// ============================================================================= +// +void RotateObjects (const int l, const int m, const int n, double angle, LDObjectList const& objects) +{ + QList<Vertex*> queue; + const Vertex rotpoint = GetRotationPoint (objects); + const double cosangle = cos (angle), + sinangle = sin (angle); + + // ref: http://en.wikipedia.org/wiki/Transformation_matrix#Rotation_2 + Matrix transform ( + { + (l* l * (1 - cosangle)) + cosangle, + (m* l * (1 - cosangle)) - (n* sinangle), + (n* l * (1 - cosangle)) + (m* sinangle), + + (l* m * (1 - cosangle)) + (n* sinangle), + (m* m * (1 - cosangle)) + cosangle, + (n* m * (1 - cosangle)) - (l* sinangle), + + (l* n * (1 - cosangle)) - (m* sinangle), + (m* n * (1 - cosangle)) + (l* sinangle), + (n* n * (1 - cosangle)) + cosangle + }); + + // Apply the above matrix to everything + for (LDObjectPtr obj : objects) + { + if (obj->numVertices()) + { + for (int i = 0; i < obj->numVertices(); ++i) + { + Vertex v = obj->vertex (i); + RotateVertex (v, rotpoint, transform); + obj->setVertex (i, v); + } + } + elif (obj->hasMatrix()) + { + LDMatrixObjectPtr mo = obj.dynamicCast<LDMatrixObject>(); + + // Transform the position + Vertex v = mo->position(); + RotateVertex (v, rotpoint, transform); + mo->setPosition (v); + + // Transform the matrix + mo->setTransform (transform * mo->transform()); + } + elif (obj->type() == OBJ_Vertex) + { + LDVertexPtr vert = obj.staticCast<LDVertex>(); + Vertex v = vert->pos; + RotateVertex (v, rotpoint, transform); + vert->pos = v; + } + } +}