JSFiddle - React, Tailwind, and code Playground
by lamarant
HTML
<canvas id='s'>This application requires a (fast) HTML5 compliant browser.</canvas>
CSS
body { background-color: #000000; margin: 0px; overflow: hidden; }
h1{background: transparent; color: #fff; position: fixed; text-align:center;width:100%;}
JavaScript
/**
* Original version http://labs.hyperandroid.com/js1k
*/
(function() {
Grass = function() {
return this;
};
Grass.prototype= {
alto_hierba: 50, // grass height
maxAngle: 50, // maximum grass rotation angle (wind movement)
angle: 0, // construction angle. thus, every grass is different to others
coords: null, // quadric bezier curves coordinates
color: null, // grass color. modified by ambient component.
offset_control_point: 3, // grass base width. greater values, wider at the basement.
initialize : function(canvasWidth, canvasHeight, minHeight, maxHeight, angleMax, initialMaxAngle) {
// grass start position
var sx= Math.floor( Math.random()*canvasWidth );
var sy= canvasHeight;
// quadric curve middle control point. higher values means wider grass from base to peak.
// try offset_control_x=10 for thicker grass.
var offset_control_x=1.5;
//this.alto_hierba= minHeight+Math.random()*maxHeight;
//this.maxAngle= 10+Math.random()*angleMax;
this.angle= Math.random()*initialMaxAngle*(Math.random()<0.5?1:-1)*Math.PI/180;
// hand crafted value. modify offset_control_x to play with grass curvature slope.
var csx= sx-offset_control_x ;
// grass curvature. greater values make grass bender.
// try with:
// var csy= sy-this.alto_hierba; -> much more bended grass.
// var csy= sy-1; -> totally unbended grass.
// var csy= sy-this.alto_hierba/2;-> original. good looking grass.
var csy= 0;
if ( Math.random()<0.1 ) {
csy= sy-this.alto_hierba;
} else {
csy= sy-this.alto_hierba/2;
}
/**
I determined that both bezier curves that conform each grass should have
the same middle control point to be parallel.
You can play with psx/psy adding or removing values to...