summaryrefslogtreecommitdiff
path: root/public/assets/test/ortho3.html
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/test/ortho3.html')
-rw-r--r--public/assets/test/ortho3.html243
1 files changed, 3 insertions, 240 deletions
diff --git a/public/assets/test/ortho3.html b/public/assets/test/ortho3.html
index f56c73f..ef5732c 100644
--- a/public/assets/test/ortho3.html
+++ b/public/assets/test/ortho3.html
@@ -74,9 +74,12 @@ body {
<script src="/assets/javascripts/rectangles/engine/map/ui/ortho.js"></script>
<script src="/assets/javascripts/rectangles/engine/map/tools/_base.js"></script>
<script src="/assets/javascripts/rectangles/engine/map/tools/arrow.js"></script>
+<script src="/assets/javascripts/rectangles/engine/map/tools/eraser.js"></script>
<script src="/assets/javascripts/rectangles/engine/map/tools/ortho.js"></script>
<script src="/assets/javascripts/rectangles/engine/map/tools/polyline.js"></script>
<script src="/assets/javascripts/rectangles/engine/map/tools/position.js"></script>
+<script src="/assets/javascripts/rectangles/engine/shapes/shapelist.js"></script>
+<script src="/assets/javascripts/rectangles/engine/shapes/polyline.js"></script>
<script>
var app = window.app || {}
@@ -84,246 +87,6 @@ app.tube = new Tube ()
app.on = function(){ app.tube.on.apply(app.tube, arguments) }
app.off = function(){ app.tube.off.apply(app.tube, arguments) }
-var EraserTool = MapTool.extend(function(base){
- var exports = {}
- exports.down = function(e, cursor){
- last_point.a = cursor.x.a
- last_point.b = cursor.y.a
- var segment = shapes.findClosestSegment(last_point)
- if (segment) {
- shapes.removeSegment(segment)
- }
- }
- exports.move = function(e, cursor){
- last_point.a = cursor.x.a
- last_point.b = cursor.y.a
- var segment = shapes.findClosestSegment(last_point)
- if (segment) {
- document.body.style.cursor = "pointer"
- last_point.a = segment.x
- last_point.b = segment.y
- cursor.x.a = cursor.x.b = last_point.a
- cursor.y.a = cursor.y.b = last_point.b
- }
- else {
- document.body.style.cursor = "crosshair"
- }
- }
- return exports
-})
-
-var ShapeList = Fiber.extend(function(base){
- var exports = {}
- exports.init = function(){
- this.shapes = []
- }
- exports.add = function(shape){
- this.shapes.push(shape)
- }
- exports.remove = function(shape){
- var index = this.shapes.indexOf(shape)
- if (index !== -1) {
- this.shapes.splice(index, 1)
- }
- }
- exports.removeSegment = function (segment){
- var shape = segment.shape
- var head = shape.getHeadAtIndex(segment.head)
- var tail = shape.getTailAtIndex(segment.tail)
- this.remove(shape)
- shape.destroy()
- if (head) {
- this.add(head)
- head.build()
- }
- if (tail) {
- this.add(tail)
- tail.build()
- }
- }
- exports.findClosestPoint = function (p){
- var point
- for (var i = 0; i < this.shapes.length; i++) {
- point = this.shapes[i].hasPointNear(p)
- if (point) return { point: point, shape: this.shapes[i] }
- }
- return null
- }
- exports.findClosestEndPoint = function (p){
- var point
- for (var i = 0; i < this.shapes.length; i++) {
- point = this.shapes[i].hasEndPointNear(p)
- if (point) return { point: point, shape: this.shapes[i] }
- }
- return null
- }
- exports.findClosestSegment = function (p){
- var segment = null, closest_segment = null
- for (var i = 0; i < this.shapes.length; i++) {
- segment = this.shapes[i].hasSegmentNear(p, 10)
- if (segment && (! closest_segment || segment.distance < closest_segment.distance)) {
- closest_segment = segment
- closest_segment.shape = this.shapes[i]
- }
- }
- return closest_segment
- }
- exports.forEach = function(fn){
- this.shapes.forEach(fn)
- }
- return exports
-})
-
-var Polyline = Fiber.extend(function(base){
- var exports = {}
- exports.init = function(){
- this.points = []
- this.mx_points = []
- this.closed = false
- }
- exports.add = function(p){
- this.points.push( p )
- this.mx_points.push( new MX.Point(p) )
- }
- exports.firstPoint = function(){
- return this.points[0]
- }
- exports.lastPoint = function(){
- return this.points[this.points.length-1]
- }
- exports.canCloseWith = function(p){
- return (this.points.length > 2 && this.points[0].distanceTo( p ) < 10/map.zoom)
- }
- exports.getHeadAtIndex = function(index){
- if (index == 0) { return null }
- if (index == this.points.length-1) { return this.clone() }
- var head = new Polyline()
- head.points = this.points.slice(0, index+1)
- return head
- }
- exports.getTailAtIndex = function(index){
- if (index == this.points.length-1) { return null }
- if (index == 0) { return this.clone() }
- var tail = new Polyline()
- tail.points = this.points.slice(index, this.points.length)
- return tail
- }
- exports.clone = function(){
- var clone = new Polyline()
- clone.points = this.points.concat()
- }
- exports.hasPointNear = function(p){
- var point
- for (var i = 0; i < this.points.length; i++){
- point = this.points[i]
- if (point.distanceTo( p ) < 10/map.zoom) {
- return point
- }
- }
- return null
- }
- exports.hasEndPointNear = function(p){
- if (this.closed) return null
- if (this.firstPoint().distanceTo( p ) < 10/map.zoom) {
- return this.firstPoint()
- }
- if (this.lastPoint().distanceTo( p ) < 10/map.zoom) {
- return this.lastPoint()
- }
- return null
- }
- exports.hasSegmentNear = function(p, min_dist){
- var p1, p2, d1, d2, sum, rat
- var dx, dy, new_x, new_y, x, y, closest_distance = min_dist || Infinity
- var closest_i = -1
- var points = this.points
- var p1, p2 = points[0]
- for (var i = 1; i < points.length; i++) {
- p1 = p2
- p2 = points[i]
- d1 = p2.a - p1.a
- d2 = p2.b - p1.b
- sum = d1*d1 + d2*d2
- rat = ((p.a - p1.a) * d1 + (p.b - p1.b) * d2) / sum
- rat = rat < 0 ? 0 : rat < 1 ? rat : 1
- new_x = p1.a + rat * d1
- new_y = p1.b + rat * d2
- dx = new_x - p.a
- dy = new_y - p.b
- sum2 = sqrt(dx*dx+dy*dy)
- if (sum2 < closest_distance) {
- x = new_x
- y = new_y
- closest_distance = sum2
- closest_i = i
- }
- }
- if (closest_i == -1) return null
- return {
- x: x,
- y: y,
- distance: closest_distance,
- head: closest_i-1,
- tail: closest_i,
- }
- }
- exports.draw = function(ctx){
- var points = this.points
- if (! points.length) return
- if (points.length == 1) {
- ctx.fillStyle = "#f80"
- map.draw.dot_at(this.points[0].a, points[0].b, 5)
- }
- if (points.length > 1) {
- ctx.fillStyle = "rgba(255,255,0,0.1)"
- ctx.strokeStyle = "#f80"
- ctx.lineWidth = 2 / map.zoom
- ctx.beginPath()
- ctx.moveTo(points[0].a, points[0].b)
- points.forEach(function(point, i){
- i && ctx.lineTo(point.a, point.b)
- })
- ctx.stroke()
- if (! map.ui.placing || this.closed) {
- ctx.fill()
- }
- }
- }
- exports.draw_line = function (ctx, p){
- var last = this.points[this.points.length-1]
- ctx.strokeStyle = "#f80"
- ctx.lineWidth = 2 / map.zoom
- ctx.beginPath()
- ctx.moveTo(last.a, last.b)
- ctx.lineTo(p.a, p.b)
- ctx.stroke()
- }
- exports.close = function(){
- this.points[this.points.length] = this.points[0]
- this.closed = true
- }
- exports.build = function(){
- this.mx_points && this.mx_points.forEach(function(mx){ scene.remove(mx) })
- this.mx = new MX.Polyline(this)
- shapes.add(this)
- }
- exports.rebuild = function(){
- this.mx.rebuild()
- }
- exports.reset = function(){
- this.mx_points.forEach(function(mx){ scene.remove(mx) })
- this.mx_points.length = 0
- this.points.length = 0
- }
- exports.destroy = function(){
- this.reset()
- this.mx && this.mx.destroy()
- }
- return exports
-})
-
-
-
var scene, map, controls
map = new Map ({