RVector RVector::rotate3D(const RLine& axis, double rotation) { RVector off = -axis.getStartPoint(); RVector ret = *this; ret.move(off); RVector ax = axis.getStartPoint() - axis.getEndPoint(); QQuaternion quat = QQuaternion::fromAxisAndAngle(ax.x, ax.y, ax.z, RMath::rad2deg(rotation)); QVector3D qv = quat.rotatedVector(QVector3D(ret.x, ret.y, ret.z)); ret = RVector(qv.x(), qv.y(), qv.z()); ret.move(-off); *this = ret; return *this; }
bool REllipse::contains(const RVector& p) const { RVector pt = p; pt.move(-center); pt.rotate(-getAngle()); double rx = getMajorRadius(); double ry = getMinorRadius(); return (pt.x*pt.x) / (rx*rx) + (pt.y*pt.y) / (ry*ry) <= 1.0; }