Code

Merge and cleanup of GSoC C++-ification project.
[inkscape.git] / src / transf_mat_3x4.h
1 #ifndef SEEN_TRANSF_MAT_3x4_H
2 #define SEEN_TRANSF_MAT_3x4_H
4 /*
5  * 3x4 transformation matrix to map points from projective 3-space into the projective plane
6  *
7  * Authors:
8  *   Maximilian Albert <Anhalter42@gmx.de>
9  *
10  * Copyright (C) 2007  Authors
11  *
12  * Released under GNU GPL, read the file 'COPYING' for more information
13  */
15 #include "proj_pt.h"
16 #include "axis-manip.h"
18 namespace Proj {
20 class TransfMat3x4 {
21 public:
22     TransfMat3x4();
23     TransfMat3x4(Pt2 vp_x, Pt2 vp_y, Pt2 vp_z, Pt2 origin);
24     TransfMat3x4(TransfMat3x4 const &rhs);
25     Pt2 column (Proj::Axis axis) const;
26     Pt2 image (Pt3 const &point);
27     Pt3 preimage (Geom::Point const &pt, double coord = 0, Axis = Z);
28     void set_image_pt (Proj::Axis axis, Proj::Pt2 const &pt);
29     void toggle_finite (Proj::Axis axis);
30     double get_infinite_angle (Proj::Axis axis) {
31         if (has_finite_image(axis)) {
32             return 1e18; //this used to be NR_HUGE before 2geom conversion
33         }
34         Pt2 vp(column(axis));
35         return Geom::atan2(Geom::Point(vp[0], vp[1])) * 180.0/M_PI;
36     }
37     void set_infinite_direction (Proj::Axis axis, double angle) { // angle is in degrees
38         g_return_if_fail(tmat[2][axis] == 0); // don't set directions for finite VPs
40         double a = angle * M_PI/180;
41         Geom::Point pt(tmat[0][axis], tmat[1][axis]);
42         double rad = Geom::L2(pt);
43         set_image_pt(axis, Proj::Pt2(cos (a) * rad, sin (a) * rad, 0.0));
44     }
45     inline bool has_finite_image (Proj::Axis axis) { return (tmat[2][axis] != 0.0); }
47     gchar * pt_to_str (Proj::Axis axis);
49     bool operator==(const TransfMat3x4 &rhs) const;
50     TransfMat3x4 operator*(Geom::Matrix const &A) const;
51     TransfMat3x4 &operator*=(Geom::Matrix const &A);
53     void print() const;
55     void copy_tmat(double rhs[3][4]);
57 private:
58     // FIXME: Is changing a single column allowed when a projective coordinate system is specified!?!?!
59     void normalize_column (Proj::Axis axis);
60     inline void set_column (Proj::Axis axis, Proj::Pt2 pt) {
61         tmat[0][axis] = pt[0];
62         tmat[1][axis] = pt[1];
63         tmat[2][axis] = pt[2];
64     }
65     double tmat[3][4];
66 };
68 } // namespace Proj
70 #endif /* __TRANSF_MAT_3x4_H__ */
72 /*
73   Local Variables:
74   mode:c++
75   c-file-style:"stroustrup"
76   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
77   indent-tabs-mode:nil
78   fill-column:99
79   End:
80 */
81 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :