summaryrefslogtreecommitdiff
path: root/public/assets/javascripts/rectangles/models/surface.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/javascripts/rectangles/models/surface.js')
-rw-r--r--public/assets/javascripts/rectangles/models/surface.js111
1 files changed, 111 insertions, 0 deletions
diff --git a/public/assets/javascripts/rectangles/models/surface.js b/public/assets/javascripts/rectangles/models/surface.js
new file mode 100644
index 0000000..448722b
--- /dev/null
+++ b/public/assets/javascripts/rectangles/models/surface.js
@@ -0,0 +1,111 @@
+(function(){
+
+ var vec2, Rect
+ if ('window' in this) {
+ vec2 = window.vec2
+ Rect = window.Rect
+ }
+ else {
+ vec2 = require('./vec2')
+ Rect = require('./rect')
+ }
+
+ var Surface = function (face){
+ this.width = 0
+ this.height = 0
+ this.faces = []
+ if (face) {
+ this.add(face)
+ }
+ }
+ Surface.prototype.add = function(rect){
+ this.faces.push(rect)
+ this.width += rect.width()
+ this.height = Math.max(this.height, rect.height())
+ }
+ Surface.prototype.fits_scale = function(v, scale){
+ v = v.clone().mul(scale)
+ return this.fits(v)
+ }
+ Surface.prototype.fits = function(v){
+ var faces = this.faces
+ var scratch
+ if (this.width < v.a || this.height < v.b) {
+ return null
+ }
+ for (var i = 0; i < faces.length; i++) {
+ if (faces[i].fits(v)) {
+ return faces[i]
+ }
+ }
+ scratch = new Rect (0,0,0,0)
+ for (var i = 0; i < faces.length; i++) {
+ if (faces[i].y.length() < v.b) {
+ continue
+ }
+ scratch.x.a = faces[i].x.a
+ scratch.x.b = faces[i].x.b
+ scratch.y.a = faces[i].y.a
+ scratch.y.b = faces[i].y.b
+ SEARCH: for (var j = i+1; j < faces.length; j++) {
+ if (faces[j].y.a > scratch.y.a) {
+ scratch.y.a = faces[j].y.a
+ }
+ if (faces[j].y.b < scratch.y.b) {
+ scratch.y.b = faces[j].y.b
+ }
+ if (scratch.y.b <= scratch.y.a || scratch.y.length() < v.b) {
+ break SEARCH
+ }
+ scratch.x.b = faces[j].x.b
+ if (scratch.fits(v)) {
+ return scratch
+ }
+ }
+ }
+ return null
+ }
+ Surface.prototype.place = function(v, index){
+ var face, faces = this.faces
+ }
+ Surface.prototype.bounds = function(index){
+ var bounds = faces[index].clone()
+ var height = faces[index].height()
+
+ for (var i = index-1; i > 0; i--) {
+ var face = faces[i]
+ if (face.y.length() < height) {
+ continue
+ }
+ if (face.y.a > bounds.y.a) {
+ continue
+ }
+ if (face.y.b < bounds.y.b) {
+ continue
+ }
+ bounds.x.a = bounds.x.a
+ }
+
+ for (var i = index+1; i < faces.length; i++) {
+ var face = faces[i]
+ if (face.y.length() < height) {
+ continue
+ }
+ if (face.y.a > bounds.y.a) {
+ continue
+ }
+ if (face.y.b < bounds.y.b) {
+ continue
+ }
+ bounds.x.b = bounds.x.b
+ }
+ return bounds
+ }
+
+ if ('window' in this) {
+ window.Surface = Surface
+ }
+ else {
+ module.exports = Surface
+ }
+})()