quat_from_matrix Function

public pure function quat_from_matrix(m) result(q)

The unit quaternion of a 3x3 rotation matrix (columns: the rotated axes; the inverse of quat_to_matrix), by Shepperd's method (from the largest of w and the vector components, for accuracy).

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: m(3,3)

rotation matrix (columns: the rotated axes)

Return Value real(kind=wp), (4)


Called by

proc~~quat_from_matrix~~CalledByGraph proc~quat_from_matrix quat_from_matrix proc~camera_orientation camera_orientation proc~camera_orientation->proc~quat_from_matrix proc~followed_pose followed_pose proc~followed_pose->proc~quat_from_matrix proc~world_matrix_at ReferenceFrame%world_matrix_at proc~followed_pose->proc~world_matrix_at proc~make_cone_look_at PolyhedralCone%make_cone_look_at proc~make_cone_look_at->proc~quat_from_matrix proc~camera_between camera_between proc~camera_between->proc~camera_orientation proc~local_matrix_at ReferenceFrame%local_matrix_at proc~local_matrix_at->proc~followed_pose proc~update ReferenceFrame%update proc~update->proc~followed_pose proc~drawable_update DrawableTrajectory%drawable_update proc~drawable_update->proc~update proc~fly fly proc~fly->proc~camera_between proc~fm_update FrameManager%fm_update proc~fm_update->proc~update proc~sphere_update Sphere%sphere_update proc~sphere_update->proc~update proc~terrain_update TerrainBody%terrain_update proc~terrain_update->proc~update proc~world_matrix_at->proc~local_matrix_at proc~world_matrix_at->proc~world_matrix_at proc~data_to_shown data_to_shown proc~data_to_shown->proc~world_matrix_at proc~place_camera place_camera proc~place_camera->proc~fly proc~frame WindowProxy%frame proc~frame->proc~place_camera proc~to_shown to_shown proc~to_shown->proc~data_to_shown proc~art_point_between art_point_between proc~art_point_between->proc~to_shown proc~resize WindowProxy%resize proc~resize->proc~frame proc~run WindowProxy%run proc~run->proc~frame proc~to_shown_at to_shown_at proc~to_shown_at->proc~to_shown proc~art_point art_point proc~art_point->proc~to_shown_at proc~art_points art_points proc~art_points->proc~to_shown_at proc~intermediates_by_time intermediates_by_time proc~intermediates_by_time->proc~art_point_between proc~marker_point marker_point proc~marker_point->proc~to_shown_at proc~marker_point->proc~art_point proc~update_ribbon_tail RibbonArtist%update_ribbon_tail proc~update_ribbon_tail->proc~art_point_between proc~update_ribbon_tail->proc~art_point proc~update_tail CurveArtist%update_tail proc~update_tail->proc~art_point_between proc~update_tail->proc~art_point proc~write_segments write_segments proc~write_segments->proc~to_shown_at proc~add_intermediates add_intermediates proc~add_intermediates->proc~intermediates_by_time proc~intermediates_by_data intermediates_by_data proc~add_intermediates->proc~intermediates_by_data proc~intermediates_by_distance intermediates_by_distance proc~add_intermediates->proc~intermediates_by_distance proc~curve_pick curve_pick proc~curve_pick->proc~art_point proc~intermediates_by_data->proc~art_point proc~intermediates_by_distance->proc~art_point proc~marker_update MarkerArtist%marker_update proc~marker_update->proc~marker_point proc~marker_update->proc~add_intermediates proc~update_bounds update_bounds proc~marker_update->proc~update_bounds proc~segment_update SegmentArtist%segment_update proc~segment_update->proc~write_segments proc~update_bounds->proc~art_points proc~write_curve CurveArtist%write_curve proc~write_curve->proc~art_points proc~write_ribbon RibbonArtist%write_ribbon proc~write_ribbon->proc~art_points proc~drawable_pick DrawableTrajectory%drawable_pick proc~drawable_pick->proc~curve_pick

Source Code

    pure function quat_from_matrix(m) result(q)
        real(wp), intent(in) :: m(3,3)                  !! rotation matrix (columns: the rotated axes)
        real(wp) :: q(4)
        real(wp) :: t, s
        t = m(1,1) + m(2,2) + m(3,3)
        if (t >= max(m(1,1), m(2,2), m(3,3))) then
            s = 2.0_wp * sqrt(1.0_wp + t)
            q = [(m(3,2) - m(2,3)) / s, (m(1,3) - m(3,1)) / s, (m(2,1) - m(1,2)) / s, 0.25_wp * s]
        else if (m(1,1) >= m(2,2) .and. m(1,1) >= m(3,3)) then
            s = 2.0_wp * sqrt(1.0_wp + m(1,1) - m(2,2) - m(3,3))
            q = [0.25_wp * s, (m(1,2) + m(2,1)) / s, (m(1,3) + m(3,1)) / s, (m(3,2) - m(2,3)) / s]
        else if (m(2,2) >= m(3,3)) then
            s = 2.0_wp * sqrt(1.0_wp - m(1,1) + m(2,2) - m(3,3))
            q = [(m(1,2) + m(2,1)) / s, 0.25_wp * s, (m(2,3) + m(3,2)) / s, (m(1,3) - m(3,1)) / s]
        else
            s = 2.0_wp * sqrt(1.0_wp - m(1,1) - m(2,2) + m(3,3))
            q = [(m(1,3) + m(3,1)) / s, (m(2,3) + m(3,2)) / s, 0.25_wp * s, (m(2,1) - m(1,2)) / s]
        end if
        q = q / norm2(q)
    end function quat_from_matrix