/*! * \brief Ellipse::setUnknownParameters * \param parameters */ void Ellipse::setUnknownParameters(const QMap<GeometryParameters, double> ¶meters){ //get current parameters OiVec position = this->center.getVector(); OiVec directionA = this->normal.getVector(); OiVec directionB = this->semiMajorAxis.getVector(); double a = this->a; double b = this->b; //update parameters QList<GeometryParameters> keys = parameters.keys(); foreach(const GeometryParameters &key, keys){ switch(key){ case eUnknownX: position.setAt(0, parameters.value(eUnknownX)); break; case eUnknownY: position.setAt(1, parameters.value(eUnknownY)); break; case eUnknownZ: position.setAt(2, parameters.value(eUnknownZ)); break; case eUnknownPrimaryI: directionA.setAt(0, parameters.value(eUnknownPrimaryI)); break; case eUnknownPrimaryJ: directionA.setAt(1, parameters.value(eUnknownPrimaryJ)); break; case eUnknownPrimaryK: directionA.setAt(2, parameters.value(eUnknownPrimaryK)); break; case eUnknownA: a = parameters.value(eUnknownA); break; case eUnknownB: b = parameters.value(eUnknownB); break; case eUnknownSecondaryI: directionB.setAt(0, parameters.value(eUnknownSecondaryI)); break; case eUnknownSecondaryJ: directionB.setAt(1, parameters.value(eUnknownSecondaryJ)); break; case eUnknownSecondaryK: directionB.setAt(2, parameters.value(eUnknownSecondaryK)); break; } } //update ellipse definition directionA.normalize(); directionB.normalize(); Position ellipsePosition(position); Direction ellipseDirectionA(directionA); Direction ellipseDirectionB(directionB); this->setEllipse(ellipsePosition, ellipseDirectionA, a, b, ellipseDirectionB); }
/*! * \brief OiMat::getRotationMatrix * Get the rotation matrix corresponding to a rotation around an arbitrary rotation axis by the given amount * \param angle * \param axis * \return */ OiMat OiMat::getRotationMatrix(double angle, OiVec axis){ if(axis.getSize() == 3){ OiMat result(3, 3); axis = axis.normalize(); double w = qCos(angle / 2.0); OiVec x = qSin(angle / 2.0) * axis; result.setAt(0, 0, 1.0 - 2.0 * (x.getAt(1)*x.getAt(1) + x.getAt(2)*x.getAt(2))); result.setAt(0, 1, 2.0 * (x.getAt(0)*x.getAt(1) - w * x.getAt(2))); result.setAt(0, 2, 2.0 * (x.getAt(0)*x.getAt(2) + w * x.getAt(1))); result.setAt(1, 0, 2.0 * (x.getAt(0)*x.getAt(1) + w * x.getAt(2))); result.setAt(1, 1, 1.0 - 2.0 * (x.getAt(0)*x.getAt(0) + x.getAt(2)*x.getAt(2))); result.setAt(1, 2, 2.0 * (x.getAt(1)*x.getAt(2) - w * x.getAt(0))); result.setAt(2, 0, 2.0 * (x.getAt(0)*x.getAt(2) - w * x.getAt(1))); result.setAt(2, 1, 2.0 * (x.getAt(1)*x.getAt(2) + w * x.getAt(0))); result.setAt(2, 2, 1.0 - 2.0 * (x.getAt(0)*x.getAt(0) + x.getAt(1)*x.getAt(1))); return result; }else{ throw logic_error("To set up the rotation matrix the given axis has to be of size 3"); return OiMat(); } }
/*! * \brief Torus::setUnknownParameters * \param parameters */ void Torus::setUnknownParameters(const QMap<GeometryParameters, double> ¶meters){ //get current parameters OiVec position = this->center.getVector(); OiVec direction = this->normal.getVector(); double radiusA = this->radiusA.getRadius(); double radiusB = this->radiusB.getRadius(); //update parameters QList<GeometryParameters> keys = parameters.keys(); foreach(const GeometryParameters &key, keys){ switch(key){ case eUnknownX: position.setAt(0, parameters.value(eUnknownX)); break; case eUnknownY: position.setAt(1, parameters.value(eUnknownY)); break; case eUnknownZ: position.setAt(2, parameters.value(eUnknownZ)); break; case eUnknownPrimaryI: direction.setAt(0, parameters.value(eUnknownPrimaryI)); break; case eUnknownPrimaryJ: direction.setAt(1, parameters.value(eUnknownPrimaryJ)); break; case eUnknownPrimaryK: direction.setAt(2, parameters.value(eUnknownPrimaryK)); break; case eUnknownRadiusA: radiusA = parameters.value(eUnknownRadiusA); break; case eUnknownRadiusB: radiusB = parameters.value(eUnknownRadiusA); break; } } //update torus definition direction.normalize(); Position torusPosition(position); Direction torusDirection(direction); Radius torusRadiusA(radiusA); Radius torusRadiusB(radiusB); this->setTorus(torusPosition, torusDirection, torusRadiusA, torusRadiusB); }
/*! * \brief Line::setUnknownParameters * \param parameters */ void Line::setUnknownParameters(const QMap<GeometryParameters, double> ¶meters){ //get current parameters OiVec position = this->xyz.getVector(); OiVec direction = this->axis.getVector(); //update parameters QList<GeometryParameters> keys = parameters.keys(); foreach(const GeometryParameters &key, keys){ switch(key){ case eUnknownX: position.setAt(0, parameters.value(eUnknownX)); break; case eUnknownY: position.setAt(1, parameters.value(eUnknownY)); break; case eUnknownZ: position.setAt(2, parameters.value(eUnknownZ)); break; case eUnknownPrimaryI: direction.setAt(0, parameters.value(eUnknownPrimaryI)); break; case eUnknownPrimaryJ: direction.setAt(1, parameters.value(eUnknownPrimaryJ)); break; case eUnknownPrimaryK: direction.setAt(2, parameters.value(eUnknownPrimaryK)); break; } } //update line definition direction.normalize(); Position linePosition(position); Direction lineDirection(direction); this->setLine(linePosition, lineDirection); }