diff -r 67ba0ee049eb -r 4949da3fb4b3 src/ldObjectMath.cpp --- a/src/ldObjectMath.cpp Wed Feb 17 00:43:17 2016 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -/* - * LDForge: LDraw parts authoring CAD - * Copyright (C) 2013 - 2016 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 . - */ - -#include "ldObjectMath.h" -#include "ldObject.h" -#include "miscallenous.h" - - -MathFunctions::MathFunctions(QObject* parent) : - HierarchyElement(parent) {} - - -void MathFunctions::rotateVertex(Vertex& vertex, const Vertex& rotationPoint, const Matrix& transformationMatrix) const -{ - vertex -= rotationPoint; - vertex.transform (transformationMatrix, Origin); - vertex += rotationPoint; -} - - -void MathFunctions::rotateObjects(int l, int m, int n, double angle, const LDObjectList& objects) const -{ - Vertex rotationPoint = getRotationPoint (objects); - double cosAngle = cos(angle); - double sinAngle = sin(angle); - - // ref: http://en.wikipedia.org/wiki/Transformation_matrix#Rotation_2 - Matrix transformationMatrix ( - { - (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 (LDObject* obj : objects) - { - if (obj->numVertices()) - { - for (int i = 0; i < obj->numVertices(); ++i) - { - Vertex v = obj->vertex (i); - rotateVertex(v, rotationPoint, transformationMatrix); - obj->setVertex (i, v); - } - } - else if (obj->hasMatrix()) - { - LDMatrixObject* mo = dynamic_cast (obj); - - // Transform the position - Vertex v = mo->position(); - rotateVertex(v, rotationPoint, transformationMatrix); - mo->setPosition (v); - - // Transform the matrix - mo->setTransform(transformationMatrix * mo->transform()); - } - } -} - - -Vertex MathFunctions::getRotationPoint(const LDObjectList& objs) const -{ - switch (RotationPoint (m_config->rotationPointType())) - { - case RotationPoint::ObjectOrigin: - { - BoundingBox box; - - // Calculate center vertex - for (LDObject* obj : objs) - { - if (obj->hasMatrix()) - box << static_cast (obj)->position(); - else - box << obj; - } - - return box.center(); - } - - case RotationPoint::WorldOrigin: - return Vertex(); - - case RotationPoint::CustomPoint: - return m_config->customRotationPoint(); - - case RotationPoint::NumValues: - break; - } - - return Vertex(); -} \ No newline at end of file