File: Point.cpp

package info (click to toggle)
storm-lang 0.7.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 52,004 kB
  • sloc: ansic: 261,462; cpp: 140,405; sh: 14,891; perl: 9,846; python: 2,525; lisp: 2,504; asm: 860; makefile: 678; pascal: 70; java: 52; xml: 37; awk: 12
file content (127 lines) | stat: -rw-r--r-- 2,326 bytes parent folder | download | duplicates (2)
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
#include "stdafx.h"
#include "Point.h"
#include "Core/Str.h"
#include "Core/StrBuf.h"

namespace storm {
	namespace geometry {

		Point::Point() : x(0), y(0) {}

		Point::Point(Float x, Float y) : x(x), y(y) {}

		Point::Point(Size s) : x(s.w), y(s.h) {}

		Point Point::tangent() const {
			return Point(-y, x);
		}

		Float Point::lengthSq() const {
			return *this * *this;
		}

		Float Point::length() const {
			return sqrt(lengthSq());
		}

		Point Point::normalized() const {
			Float len = length();
			if (len == 0) {
				return (*this);
			} else {
				return (*this) / len;
			}
		}

		Float Point::taxiLength() const {
			return ::fabs(x) + ::fabs(y);
		}

		wostream &operator <<(wostream &to, const Point &p) {
			return to << L"(" << p.x << L", " << p.y << L")";
		}

		void Point::toS(StrBuf *to) const {
			*to << S("(") << x << S(", ") << y << S(")");
		}

		Point operator +(Point a, Size b) {
			return Point(a.x + b.w, a.y + b.h);
		}

		Point operator +(Point a, Point b) {
			return Point(a.x + b.x, a.y + b.y);
		}

		Point operator -(Point a, Point b) {
			return Point(a.x - b.x, a.y - b.y);
		}

		Point operator -(Point a, Size b) {
			return Point(a.x - b.w, a.y - b.h);
		}

		Point operator -(Point a) {
			return Point(-a.x, -a.y);
		}

		Point &STORM_FN operator +=(Point &a, Point b) {
			a.x += b.x;
			a.y += b.y;
			return a;
		}

		Point &STORM_FN operator -=(Point &a, Point b) {
			a.x -= b.x;
			a.y -= b.y;
			return a;
		}

		Point operator *(Point a, Float b) {
			return Point(a.x * b, a.y * b);
		}

		Point operator *(Float a, Point b) {
			return Point(a * b.x, a * b.y);
		}

		Point operator /(Point a, Float b) {
			return Point(a.x / b, a.y / b);
		}

		Point &STORM_FN operator *=(Point &a, Float b) {
			a.x *= b;
			a.y *= b;
			return a;
		}

		Point &STORM_FN operator /=(Point &a, Float b) {
			a.x /= b;
			a.y /= b;
			return a;
		}

		Float operator *(Point a, Point b) {
			return a.x*b.x + a.y*b.y;
		}

		Point abs(Point a) {
			return Point(::fabs(a.x), ::fabs(a.y));
		}

		Point angle(Angle a) {
			return Point(sin(a.rad()), -cos(a.rad()));
		}

		Point center(Size s) {
			return Point(s.w / 2, s.h / 2);
		}

		Point project(Point pt, Point origin, Point dir) {
			pt -= origin;
			float t = (pt * dir) / (dir * dir);
			return origin + dir * t;
		}

	}
}