summaryrefslogtreecommitdiff
path: root/Build/source/texk/lcdf-typetools/lcdf-typetools-2.103/include/lcdf/point.hh
blob: aad59b53ccf4d8bc08c925f1990beb7022bbc0d8 (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
// -*- related-file-name: "../../liblcdf/point.cc" -*-
#ifndef LCDF_POINT_HH
#define LCDF_POINT_HH
#include <math.h>

struct Point {

    double x;
    double y;

    Point()				{ }
    Point(double xx, double yy)		: x(xx), y(yy) { }
    // Point(const Point &)		use compiler default
    Point(const Point &p, double dx, double dy) : x(p.x + dx), y(p.y + dy) { }
    // ~Point()				use compiler default

    inline double squared_length() const throw ();
    inline double length() const throw ();
    inline double magnitude() const throw ();
    static inline double distance(const Point &, const Point &) throw ();
    static inline double dot(const Point &, const Point &) throw ();
    static Point midpoint(const Point &, const Point &) throw ();

    inline double angle() const throw ();

    void shift(double dx, double dy)	{ x += dx; y += dy; }

    inline Point shifted(double dx, double dy) const throw ();
    Point rotated(double) const throw ();
    inline Point normal() const throw ();

    bool on_line(const Point &, const Point &, double) const throw ();
    bool on_segment(const Point &, const Point &, double) const throw ();

    inline Point &operator+=(const Point &) throw ();
    inline Point &operator-=(const Point &) throw ();
    inline Point &operator*=(double) throw ();
    inline Point &operator/=(double) throw ();

    // Point operator+(Point, const Point &);
    // Point operator-(Point, const Point &);
    // Point operator*(Point, double);
    // Point operator/(Point, double);
    // Point operator-(const Point &);

    // bool operator==(const Point &, const Point &);
    // bool operator!=(const Point &, const Point &);

};

inline double
Point::squared_length() const throw ()
{
    return x*x + y*y;
}

inline double
Point::length() const throw ()
{
    return sqrt(x*x + y*y);
}

inline double
Point::magnitude() const throw ()
{
    return length();
}

inline double
Point::angle() const throw ()
{
    return atan2(y, x);
}

inline Point
Point::shifted(double dx, double dy) const throw ()
{
    return Point(x + dx, y + dy);
}

inline Point
Point::normal() const throw ()
{
    double l = length();
    return (l ? Point(x/l, y/l) : *this);
}

inline Point &
Point::operator+=(const Point &p) throw ()
{
    x += p.x;
    y += p.y;
    return *this;
}

inline Point &
Point::operator-=(const Point &p) throw ()
{
    x -= p.x;
    y -= p.y;
    return *this;
}

inline Point &
Point::operator*=(double d) throw ()
{
    x *= d;
    y *= d;
    return *this;
}

inline Point &
Point::operator/=(double d) throw ()
{
    x /= d;
    y /= d;
    return *this;
}

inline bool
operator==(const Point &a, const Point &b) throw ()
{
    return a.x == b.x && a.y == b.y;
}

inline bool
operator!=(const Point &a, const Point &b) throw ()
{
    return a.x != b.x || a.y != b.y;
}

inline Point
operator+(Point a, const Point &b) throw ()
{
    a += b;
    return a;
}

inline Point
operator-(Point a, const Point &b) throw ()
{
    a -= b;
    return a;
}

inline Point
operator-(const Point &a) throw ()
{
    return Point(-a.x, -a.y);
}

inline Point
operator*(Point a, double scale) throw ()
{
    a *= scale;
    return a;
}

inline Point
operator*(double scale, Point a) throw ()
{
    a *= scale;
    return a;
}

inline Point
operator/(Point a, double scale) throw ()
{
    a /= scale;
    return a;
}

inline double
Point::distance(const Point &a, const Point &b) throw ()
{
    return (a - b).length();
}

inline double
Point::dot(const Point &a, const Point &b) throw ()
{
    return a.x*b.x + a.y*b.y;
}

#endif