Text particle

by vovkasolovev

HTML

<canvas id="canvas"></canvas>
<div id="interface">
Message:
<input id="message" type="text" value="podhod" onchange="change()">
Gravity:
<input onchange="changeV()" type="range" id="2" value="0" max="1" min="-1" step="0.1">

Duration:
<input onchange="changeV()" type="range" id="3" value=".4" max="0.99" min="0.1" step="0.01">
  
  Speed:
<input onchange="changeV()" type="range" id="5" value=".1" max="5" min="0" step="0.01">
    Radius:
<input onchange="changeV()" type="range" id="6" value="2" max="20" min="1.8" step="0.1">
Resolution:
<input type="range" id="4" value="5" max="20" min="3" step="1" onchange="change()">
  
</div>

CSS

canvas{
  position:absolute;
left:0;
top:0;
}

body {
  overflow: hidden;
  background: #EDEDED;
  margin: 0;
  padding: 0;
  font-family: arial;
}
p{margin:15px 0px;}
#interface{
width:250px;
position:absolute;
border:0px solid black;
padding:40px; 
box-sizing: border-box;
color:#222;
  height:100%;
  overflow-y:scroll;
    background-color: rgba(255, 255, 255, 0.8);
      box-shadow: 1px 0px 10px #999;

}


input[type="range"] {

	width:100%;

}

input[type=range] {
    -webkit-appearance: none;
    background-color: silver;
    height:10px;

}

input[type="range"]::-webkit-slider-thumb {
     -webkit-appearance: none;
    background-color: #666;
    width: 10px;
    height: 26px;
}

input[type="button"] {
padding:5px;
  margin-bottom:5px;
  margin-top:5px;
      background-color:#FF2948;
border:0px;
  width:100%;
  color:white;
  font-weight:bold;
  font-size:14px;
}

input{
border:0px;
 background-color:transparent;
  margin-top:20px;
  margin-bottom:20px;
  
}
h1{padding:0px;

margin-top:0px;
}

select {
padding:5px;
  margin-bottom:5px;
  margin-top:5px;
    
  width:100%;
  
}a{
  color:#FF2948;
  font-weight:700;
  
}
 
input[type="text"] {

  width: 100%;
  font-family: sans-serif;
  font-size: 30px;
  appearance: none;
  box-shadow: none;
  border-radius: none;
  border:0px;
  border-bottom:2px solid #FF2948;
  text-align:center;
}
::-webkit-scrollbar {
  width: 14px;
  height: 14px;
}

::-webkit-scrollbar-thumb {
  height: 6px;
  border: 4px solid rgba(0, 0, 0, 0);
  background-clip: padding-box;
  -webkit-border-radius: 7px;
  background-color: rgba(0, 0, 0, .5);
  -webkit-box-shadow: inset -1px -1px 0px rgba(0, 0, 0, 0.05), inset 1px 1px 0px rgba(0, 0, 0, 0.05);
}

::-webkit-scrollbar-button {
  width: 0;
  height: 0;
  display: none;
}

::-webkit-scrollbar-corner {
  background-color: transparent;
}

JavaScript

var utils = {
  norm: function(value, min, max) {
    return (value - min) / (max - min);
  },

  lerp: function(norm, min, max) {
    return (max - min) * norm + min;
  },

  map: function(value, sourceMin, sourceMax, destMin, destMax) {
    return utils.lerp(utils.norm(value, sourceMin, sourceMax), destMin, destMax);
  },

  clamp: function(value, min, max) {
    return Math.min(Math.max(value, Math.min(min, max)), Math.max(min, max));
  },

  distance: function(p0, p1) {
    var dx = p1.x - p0.x,
      dy = p1.y - p0.y;
    return Math.sqrt(dx * dx + dy * dy);
  },

  distanceXY: function(x0, y0, x1, y1) {
    var dx = x1 - x0,
      dy = y1 - y0;
    return Math.sqrt(dx * dx + dy * dy);
  },

  circleCollision: function(c0, c1) {
    return utils.distance(c0, c1) <= c0.radius + c1.radius;
  },

  circlePointCollision: function(x, y, circle) {
    return utils.distanceXY(x, y, circle.x, circle.y) < circle.radius;
  },

  pointInRect: function(x, y, rect) {
    return utils.inRange(x, rect.x, rect.x + rect.radius) &&
      utils.inRange(y, rect.y, rect.y + rect.radius);
  },

  inRange: function(value, min, max) {
    return value >= Math.min(min, max) && value <= Math.max(min, max);
  },

  rangeIntersect: function(min0, max0, min1, max1) {
    return Math.max(min0, max0) >= Math.min(min1, max1) &&
      Math.min(min0, max0) <= Math.max(min1, max1);
  },

  rectIntersect: function(r0, r1) {
    return utils.rangeIntersect(r0.x, r0.x + r0.width, r1.x, r1.x + r1.width) &&
      utils.rangeIntersect(r0.y, r0.y + r0.height, r1.y, r1.y + r1.height);
  },

  degreesToRads: function(degrees) {
    return degrees / 180 * Math.PI;
  },

  radsToDegrees: function(radians) {
    return radians * 180 / Math.PI;
  },

  randomRange: function(min, max) {
    return min + Math.random() * (max - min);
  },

  randomInt: function(min, max) {
    return min + Math.random() * (max - min + 1);
  },

  getmiddle: function(p0, p1) {
    var x = p0.x,
      x2 = p1.x;
    middlex =...