annotate tk/geometry2.d @ 1:c18e3f93d114

Implemented Rectangle2
author David Bryant <daveb@acres.com.au>
date Wed, 13 May 2009 17:50:25 +0930
parents e907d2c54ec3
children d6f44347373d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
1 module tk.geometry2;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
2
1
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
3 private import std.stdio;
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
4 private import std.math;
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
5
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
6 struct Point2 {
1
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
7 this(in double x, in double y) {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
8 _x = x;
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
9 _y = y;
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
10 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
11
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
12 Point2 opAdd(in Vector2 v) const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
13 return Point2(_x + v._x, _y + v._y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
14 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
15
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
16 Point2 opSub(in Vector2 v) const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
17 return Point2(_x - v._x, _y - v._y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
18 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
19
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
20 Vector2 opSub(in Point2 p) const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
21 return Vector2(_x - p._x, _y - p._y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
22 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
23
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
24 string toString() /* const */ {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
25 return std.string.format("(%f, %f)", _x, _y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
26 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
27
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
28 double x() const { return _x; }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
29 double y() const { return _y; }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
30
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
31 private {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
32 double _x, _y;
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
33 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
34 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
35
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
36 struct Vector2 {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
37 this(in double x, in double y) {
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
38 _x = x;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
39 _y = y;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
40 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
41
1
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
42 Vector2 opAdd(in Vector2 v) const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
43 return Vector2(_x + v._x, _y + v._y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
44 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
45
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
46 Vector2 opSub(in Vector2 v) const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
47 return Vector2(_x - v._x, _y - v._y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
48 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
49
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
50 Vector2 opNeg() const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
51 return Vector2(-_x, -_y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
52 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
53
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
54 Vector2 opMul_r(double d) const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
55 return Vector2(d * _x, d * _y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
56 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
57
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
58 Vector2 opDiv(double d) const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
59 return Vector2(_x / d, _y / d);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
60 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
61
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
62 double length() const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
63 return sqrt(_x * _x + _y * _y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
64 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
65
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
66 string toString() /* const */ {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
67 return std.string.format("[%f, %f]", _x, _y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
68 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
69
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
70 double x() const { return _x; }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
71 double y() const { return _y; }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
72
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
73 private {
1
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
74 double _x, _y;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
75 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
76 }
1
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
77
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
78 struct Rectangle2 {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
79 this(in Point2 position, Vector2 size) {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
80 this(position.x, position.y, size.x, size.y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
81 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
82
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
83 this(Point2 corner1, Point2 corner2) {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
84 this(corner1.x, corner1.y, corner2.x - corner1.x, corner2.y - corner1.y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
85 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
86
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
87 // Intersection
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
88 Rectangle2 opAnd(in Rectangle2 r) const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
89 // FIXME
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
90 return Rectangle2(3.2, 5.3, 3.2, 2.3);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
91 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
92
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
93 // Union
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
94 Rectangle2 opOr(in Rectangle2 r) const {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
95 // FIXME
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
96 return Rectangle2(3.2, 5.3, 5.8, 2.1);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
97 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
98
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
99 string toString() {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
100 return std.string.format("{%s, %s}", mPosition, mSize);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
101 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
102
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
103 private {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
104 this(double x, double y, double w, double h) {
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
105 if (w < 0.0) { x += w; w = -w; }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
106 if (h < 0.0) { y += h; h = -h; }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
107 mPosition = Point2(x, y);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
108 mSize = Vector2(w, h);
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
109 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
110
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
111 Point2 mPosition;
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
112 Vector2 mSize;
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
113 }
c18e3f93d114 Implemented Rectangle2
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
114 }