summaryrefslogtreecommitdiff
path: root/assets/test/brush/index.html
blob: 68c81e019b5ef0836d9c19bd578b973575875f43 (plain)
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
<style>
body,html{margin:0;padding:0;}
#hud { position: absolute; top: 0; left: 0; pointer-events: none; }
canvas { position: absolute; top: 0; left: 0; }
</style>
<canvas id="canvas"></canvas>
<canvas id="mask"></canvas>
<div id="hud"></div>

<script src="/assets/javascripts/vendor/bower_components/jquery/dist/jquery.min.js"></script>
<script src="/assets/javascripts/vendor/bower_components/lodash/dist/lodash.min.js"></script>
<script src="/assets/javascripts/vendor/canvasutilities.js"></script>
<script src="/assets/javascripts/vendor/tube.js"></script>
<script src="/assets/javascripts/math/util.js"></script>
<script src="/assets/javascripts/math/point.js"></script>
<script src="/assets/javascripts/math/vec2.js"></script>
<script src="/assets/javascripts/util/mouse.js"></script>
<script src="/assets/javascripts/util/uid.js"></script>
<script>

var ctx = canvas.getContext('2d')
var w = mask.width = canvas.width = window.innerWidth
var h = mask.height = canvas.height = window.innerHeight

var drawing = false
var lastPoint = new point (0, 0), newPoint = new point (0, 0)

var mymouse = new mouse({
  el: canvas,
  down: function(e, cursor){
    drawing = true
    lastPoint.a = cursor.x.a
    lastPoint.b = cursor.y.a
    mask.clearRect(0,0,w,h)
    imagedata = ctx.getImageData( 0, 0, canvas.width, canvas.height )
    data = imagedata.data
  },
  drag: function(e, cursor){
    newPoint.a = cursor.x.a
    newPoint.b = cursor.x.b
  },
  up: function(e, cursor, new_cursor){
    drawing = false
  },
})

function drawLine (u, v) {
  var radius = 10

  var xmin = Math.min(u.a, v.a)
  var ymin = Math.min(u.b, v.b)

  var w = abs(u.a - v.a) + radius*2
  var h = abs(u.b - v.b) + radius*2

  var p = new point (0,0)
  var radius2 = radius * radius
  
  var imagedata = ctx.createImageData(w, h)
  var d = imagedata.data
  var i, j, t, dist

  var len = sqrt(dist2(u, v))

  if (len == 0) return

  for (i = 0; i < w; i++) {
    for (j = 0; j < h; j++) {
      t = (j * w + i) * 4
      
      p.a = i - radius + xmin
      p.b = j - radius + ymin
      
      dist = distToSegmentSquared( p, u, v, len )

      if (dist > radius2) {
        d[t+3] = 0
      }
      else {
        d[t+3] = round((1 - sqrt(dist)/radius) * 255)
      }
    }
  }
  ctx.putImageData(imagedata, u.a, u.b)
}

drawLine( new point( 100, 100 ), new point( 100, 400 ) )
// drawLine( new point( 100, 100 ), new point( 400, 100 ) )
// drawLine( new point( 100, 100 ), new point( 400, 400 ) )

function sqr(x) { return x * x }
function dist2(v, w) { return sqr(v.b - w.b) + sqr(v.b - w.b) }
function distToSegmentSquared (p, v, w, len) {
  var t = ((p.a - v.a) * (w.a - v.a) + (p.b - v.b) * (w.b - v.b)) / len;
  if (t < 0) return dist2(p, v);
  if (t > 1) return dist2(p, w);
  return dist2(p, { x: v.a + t * (w.a - v.a),
                    y: v.b + t * (w.b - v.b) });
}


</script>