C++ (Qt) QVector3D p0(0, 0, 0);QVector3D p1(0.4, 0,5, 0.7);QVector3D dir(0.707, 0,707, 0.707);alpha = M_Pi / 6;// (30 degrees)QMatrix4x4 M;M.rotate( alpha, dir.normalized() ); p1 = p0 + (p1 - p0) * M; // так или p1 = p0 + M.map(p1 - p0);
C++ (Qt)QVector3D MyRotate( const QVector3D & vec. // поворачиваемый вектор (длина любая) const QVector3D & dir, // ось пворота, длина должна быть = 1 qreal alpha ) // угол поворота {// проекция vec на ось вращения QVector3D vec_z = dir * QVector3D::dotProduct(vec, dir); // проекция vec на плоскость вращения QVector3D vec_x = vec - vec_z; // вторая ось в плоскости (длина ее = первой) QVector3D vec_y = QVector3D::crossProduct(dir, vec_x); // школьная формула поворота QVector3D rot = vec_x * cos(alpha) - vec_y * sin(alpha); // возвращаем проекцию в плоскости (повернутую) + проекцию на ось (она не изменилась) return rot + vec_z;}