summaryrefslogtreecommitdiff
path: root/cad/src/experimental/CoNTub/C++/pto3D.h
blob: 7e5ae4a49a1f0968ee10448da856ad13dc3182be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// Copyright 2006-2007 Nanorex, Inc.  See LICENSE file for details. 
#ifndef PTO3D_H_INCLUDED
#define PTO3D_H_INCLUDED

#include <iostream>
#include "String.h"

class pto2D;  // do not include pto2D.h here: circular definition

class pto3D
{
 public:
    float x, y, z;

    pto3D (void) {
	x = 0.0f;
	y = 0.0f;
	z = 0.0f;
    }
    pto3D (double X, double Y, double Z) {
	x = (float) X;
	y = (float) Y;
	z = (float) Z;
    }

    void giroxr (double theta);
    void giroxg (double thetag);
    void giroyr (double theta);
    void giroyg (double thetag);
    void girozr (double theta);
    void girozg (double thetag);
    void rgirox (float ct, float st);
    void rgiroy (float ct, float st);
    void rgiroz (float ct, float st);
    /** rotate theta degrees about the x axis */
    pto3D ngiroxr (double theta);
    pto3D ngiroxg (double thetag);
    /** rotate theta degrees about the y axis */
    pto3D ngiroyr (double theta);
    pto3D ngiroyg (double thetag);
    /** rotate theta degrees about the z axis */
    pto3D ngirozr (double theta);
    pto3D ngirozg (double thetag);
    /** rotate theta degrees about the x axis y cierto punto*/
    void giroxr (double theta, pto3D paux);
    void giroxg (double thetag, pto3D pau);
    /** rotate theta degrees about the y axis */
    void giroyr (double theta, pto3D paux);
    void giroyg (double thetag, pto3D pau);
    /** rotate theta degrees about the z axis */
    void girozr (double theta, pto3D paux);
    void girozg (double thetag, pto3D pau);
///////////////////////////////////////////////////

    pto3D ngirar (double theta, pto3D eje);
    pto3D ngirag (double thetag, pto3D pau);

/////////////////////////////////////////////////
    pto3D mas (pto3D pto2);
    pto3D menos (pto3D pto2);
    double prodesc (pto3D pto2);
    pto3D prodvect (pto3D pto2);
    double dista (pto3D pto2);
    pto3D escala (double factor);
    double anguloconr (pto3D pto2);
    double angulocong (pto3D pto2);
    double modulo ();
    pto3D proyeccplano (pto3D pto2);
    //ACLARACION dihedro positivo es cuando, mirando en el sentido marcado
    double dihedror (pto3D ptoc, pto3D pto1);
    double dihedrog (pto3D ptoc, pto3D pto1);
    pto3D aversor (void);
    void versoriza (void);
    pto3D clona (void);
    pto3D ptomediocon (pto3D v1);
    pto3D ptopondcon (pto3D v1, double param);
    pto2D a2D (void);
    /* http://gethelp.devx.com/techtips/cpp_pro/10min/10min0400.asp */
    friend std::ostream& operator<< (std::ostream& s, const pto3D& a) {
	s << "<pto3D " << a.x << " " << a.y << " " << a.z << ">";
	return s;
    }
    int valid(void) {
	return x < 0.5e20 || y < 0.5e20 || z < 0.5e20;
    }
};

static pto3D INVALID_PTO3D = pto3D(1.0e20, 1.0e20, 1.0e20);

#endif