Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 part of dart.math; | |
| 5 | |
| 6 /** | |
| 7 * A base class for representing two-dimensional axis-aligned rectangles. | |
| 8 */ | |
| 9 abstract class _RectangleBase<T extends num> { | |
| 10 const _RectangleBase(); | |
| 11 | |
| 12 /** The x-coordinate of the left edge. */ | |
| 13 T get left; | |
| 14 /** The y-coordinate of the top edge. */ | |
| 15 T get top; | |
| 16 /** The `width` of the rectangle. */ | |
| 17 T get width; | |
| 18 /** The `height` of the rectangle. */ | |
| 19 T get height; | |
| 20 | |
| 21 /** The x-coordinate of the right edge. */ | |
| 22 T get right => left + width; | |
| 23 /** The y-coordinate of the bottom edge. */ | |
| 24 T get bottom => top + height; | |
| 25 | |
| 26 String toString() { | |
| 27 return 'Rectangle ($left, $top) $width x $height'; | |
| 28 } | |
| 29 | |
| 30 bool operator ==(other) { | |
| 31 if (other is !Rectangle) return false; | |
| 32 return left == other.left && top == other.top && width == other.width && | |
| 33 height == other.height; | |
| 34 } | |
| 35 | |
| 36 int get hashCode => _JenkinsSmiHash.hash4(left.hashCode, top.hashCode, | |
| 37 width.hashCode, height.hashCode); | |
| 38 | |
| 39 /** | |
| 40 * Computes the intersection of `this` and [other]. | |
| 41 * | |
| 42 * The intersection of two axis-aligned rectangles, if any, is always another | |
| 43 * axis-aligned rectangle. | |
| 44 * | |
| 45 * Returns the intersection of this and `other`, or `null` if they don't | |
| 46 * intersect. | |
| 47 */ | |
| 48 Rectangle<T> intersection(Rectangle<T> other) { | |
| 49 var x0 = max(left, other.left); | |
| 50 var x1 = min(left + width, other.left + other.width); | |
| 51 | |
| 52 if (x0 <= x1) { | |
| 53 var y0 = max(top, other.top); | |
| 54 var y1 = min(top + height, other.top + other.height); | |
| 55 | |
| 56 if (y0 <= y1) { | |
| 57 return new Rectangle<T>(x0, y0, x1 - x0, y1 - y0); | |
| 58 } | |
| 59 } | |
| 60 return null; | |
| 61 } | |
| 62 | |
| 63 | |
| 64 /** | |
| 65 * Returns true if `this` intersects [other]. | |
| 66 */ | |
| 67 bool intersects(Rectangle<num> other) { | |
| 68 return (left <= other.left + other.width && | |
| 69 other.left <= left + width && | |
| 70 top <= other.top + other.height && | |
| 71 other.top <= top + height); | |
| 72 } | |
| 73 | |
| 74 /** | |
| 75 * Returns a new rectangle which completely contains `this` and [other]. | |
| 76 */ | |
| 77 Rectangle<T> boundingBox(Rectangle<T> other) { | |
| 78 var right = max(this.left + this.width, other.left + other.width); | |
| 79 var bottom = max(this.top + this.height, other.top + other.height); | |
| 80 | |
| 81 var left = min(this.left, other.left); | |
| 82 var top = min(this.top, other.top); | |
| 83 | |
| 84 return new Rectangle<T>(left, top, right - left, bottom - top); | |
| 85 } | |
| 86 | |
| 87 /** | |
| 88 * Tests whether `this` entirely contains [another]. | |
| 89 */ | |
| 90 bool contains(Rectangle<num> another) { | |
| 91 return left <= another.left && | |
| 92 left + width >= another.left + another.width && | |
| 93 top <= another.top && | |
| 94 top + height >= another.top + another.height; | |
| 95 } | |
| 96 | |
| 97 /** | |
| 98 * Tests whether [another] is inside or along the edges of `this`. | |
| 99 */ | |
| 100 bool containsPoint(Point<num> another) { | |
| 101 return another.x >= left && | |
| 102 another.x <= left + width && | |
| 103 another.y >= top && | |
| 104 another.y <= top + height; | |
| 105 } | |
| 106 | |
| 107 Point<T> get topLeft => new Point<T>(this.left, this.top); | |
| 108 Point<T> get topRight => new Point<T>(this.left + this.width, this.top); | |
| 109 Point<T> get bottomRight => new Point<T>(this.left + this.width, | |
| 110 this.top + this.height); | |
| 111 Point<T> get bottomLeft => new Point<T>(this.left, | |
| 112 this.top + this.height); | |
| 113 } | |
| 114 | |
| 115 | |
| 116 /** | |
| 117 * A class for representing two-dimensional rectangles whose properties are | |
| 118 * immutable. | |
| 119 */ | |
| 120 class Rectangle<T extends num> extends _RectangleBase<T> { | |
| 121 final T left; | |
| 122 final T top; | |
| 123 final T width; | |
| 124 final T height; | |
| 125 | |
| 126 const Rectangle(this.left, this.top, this.width, this.height); | |
| 127 | |
| 128 factory Rectangle.fromPoints(Point<T> a, Point<T> b) { | |
| 129 T left = min(a.x, b.x); | |
| 130 T width = max(a.x, b.x) - left; | |
| 131 T top = min(a.y, b.y); | |
| 132 T height = max(a.y, b.y) - top; | |
| 133 return new Rectangle<T>(left, top, width, height); | |
| 134 } | |
| 135 } | |
| 136 | |
| 137 /** | |
| 138 * A class for representing two-dimensional axis-aligned rectangles with mutable | |
| 139 * properties. | |
| 140 */ | |
| 141 class MutableRectangle<T extends num> extends _RectangleBase<T> | |
| 142 implements Rectangle<T> { | |
| 143 T left; | |
| 144 T top; | |
| 145 T width; | |
| 146 T height; | |
| 147 | |
| 148 MutableRectangle(this.left, this.top, this.width, this.height); | |
| 149 | |
| 150 factory MutableRectangle.fromPoints(Point<T> a, Point<T> b) { | |
| 151 T left = min(a.x, b.x); | |
| 152 T width = max(a.x, b.x) - left; | |
| 153 T top = min(a.y, b.y); | |
| 154 T height = max(a.y, b.y) - top; | |
| 155 return new MutableRectangle<T>(left, top, width, height); | |
| 156 } | |
| 157 } | |
|
siva
2013/10/08 22:05:30
Wouldn't it make more sense to call the classes :
Emily Fortuna
2013/10/08 22:20:27
We convey immutability that in the documentation.
| |
| OLD | NEW |