html5 图片随机出现,HTML5 随机生成灰色斑点分布(泊松分布)

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

var Poisson = function(exports) {

var width, height, grid;

function distribute(count, radius, w, h) {

width = w;

height = h;

var cellSize = exports.cellSize = radius / Math.sqrt(2);

exports.grid = grid = buildGrid(Math.ceil(w / cellSize), Math.ceil(h / cellSize));

count = Math.min(count, Math.floor(w / cellSize) * Math.floor(h / cellSize))

var processList = [];

var firstPoint = new Point(w * .5, h * .5);

processList.push(firstPoint);

setGridPoint(imageToGrid(firstPoint, cellSize), firstPoint);

var result = [];

var total = count;

while (result.length < count) {

var added = false;

var attempt = 10;

while (!added) {

var rid = ~~(Math.random() * processList.length);

var point = processList[rid];

var newPoint = generateRandomPointAround(point, radius);

//check that the point is in the image region

//and no points exists in the point's neighbourhood

if (inRectangle(newPoint) && !inNeighbourhood(grid, newPoint, radius, cellSize)) {

processList.push(newPoint);

result.push(newPoint);

setGridPoint(imageToGrid(newPoint, cellSize), newPoint);

added = true;

}

if (attempt-- <= 0) break;

}

if (total-- <= 0) break;

}

return result;

}

function buildGrid(w, h) {

var g = [];

for (var i = 0; i < w; i++) {

var tmp = [];

for (var j = 0; j < h; j++) {

tmp.push(null);

}

g.push(tmp);

}

return g;

}

function setGridPoint(gridPoint, value) {

if (grid[gridPoint.x][gridPoint.y] != null) return;

grid[gridPoint.x][gridPoint.y] = value;

}

function inRectangle(point) {

return point.x > 0 && point.x < width && point.y > 0 && point.y < height;

}

function imageToGrid(point, cellSize) {

var gridX = ~~(point.x / cellSize);

var gridY = ~~(point.y / cellSize);

return new Point(gridX, gridY);

}

function generateRandomPointAround(point, mindist) {

var r1 = Math.random();

var r2 = Math.random();

var radius = mindist * (r1 + 1);

var angle = 2 * Math.PI * r2;

var newX = point.x + radius * Math.cos(angle);

var newY = point.y + radius * Math.sin(angle);

return new Point(newX, newY);

}

function inNeighbourhood(grid, point, mindist, cellSize) {

var gridPoint = imageToGrid(point, cellSize);

var cellsAroundPoint = squareAroundPoint(grid, gridPoint.x, gridPoint.y, 4);

var valid = false;

cellsAroundPoint.forEach(function(cell) {

if (cell == null) return;

var min_dist = mindist;

//using a noise (or any non-uniform) function

//var min_dist = mindist + simplex.simplex2( point.x * .01, point.y * .01 ) * mindist;

if (distance(cell, point) < min_dist) {

valid = true;

}

});

return valid;

}

function squareAroundPoint(grid, x, y, offset) {

var off = Math.round(offset / 2);

var minX = Math.max(0, Math.min(grid.length, x - off));

var maxX = Math.max(0, Math.min(grid.length, x + off));

var minY = Math.max(0, Math.min(grid[0].length, y - off));

var maxY = Math.max(0, Math.min(grid[0].length, y + off));

var tmp = [];

for (var i = minX; i < maxX; i++) {

for (var j = minY; j < maxY; j++) {

if (grid[i][j] != null) tmp.push(grid[i][j]);

}

}

return tmp;

}

exports.distribute = distribute;

return exports;

}({});

var Point = function() {

function Point(x, y, z) {

this.x = x || 0;

this.y = y || 0;

this.z = z || 0;

}

var _p = Point.prototype;

_p.constructor = Point;

return Point;

}();

function distance(a, b) {

var dx = a.x - b.x;

var dy = a.y - b.y;

var dz = a.z - b.z;

return Math.sqrt(dx * dx + dy * dy + dz * dz);

}

///

var canvas = document.createElement('canvas');

document.body.appendChild(canvas);

var w = canvas.width = window.innerWidth;

var h = canvas.height = window.innerHeight;

var ctx = canvas.getContext("2d");

//raf: https://github.com/cagosta/requestAnimationFrame/blob/master/app/requestAnimationFrame.js

(function(global) {

(function() {

if (global.requestAnimationFrame) {

return;

}

if (global.webkitRequestAnimationFrame) {

global.requestAnimationFrame = global['webkitRequestAnimationFrame'];

global.cancelAnimationFrame = global['webkitCancelAnimationFrame'] || global['webkitCancelRequestAnimationFrame'];

}

var lastTime = 0;

global.requestAnimationFrame = function(callback) {

var currTime = new Date().getTime();

var timeToCall = Math.max(0, 16 - (currTime - lastTime));

var id = global.setTimeout(function() {

callback(currTime + timeToCall);

}, timeToCall);

lastTime = currTime + timeToCall;

return id;

};

global.cancelAnimationFrame = function(id) {

clearTimeout(id);

};

})();

if (typeof define === 'function') {

define(function() {

return global.requestAnimationFrame;

});

}

})(window);

///

var radius = 15;

var distribution;

var length;

function init() {

w = canvas.width = window.innerWidth;

h = canvas.height = window.innerHeight;

distribution = Poisson.distribute(1000, radius, w, h);

length = distribution.length;

}

function update() {

requestAnimationFrame(update);

if (distribution == null) return;

for (var i = 0; i < 10; i++) {

if (distribution.length == 0) return;

var id = distribution.length;

p = distribution.shift();

ctx.globalAlpha = 1.25 - (id / length);

ctx.beginPath();

ctx.arc(p.x, p.y, (id / length) * radius / 2, 0, Math.PI * 2);

ctx.fill();

}

}

window.onload = init;

window.onresize = init;

window.onmousedown = init;

window.ontouchstart = init;

update();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用MATLAB随机生成纤维,可以使用MATLAB中的随机数生成函数和绘图函数来实现。以下是一种可行的方法: 首先,定义纤维的长度、宽度、位置和方向等参数。可以根据实际需求随机生成这些参数,例如利用rand函数生成在指定范围内的随机数来确定长度和宽度,利用randi函数生成位置和方向的随机整数。 然后,创建一个绘图窗口,并使用rectangle函数绘制纤维的形状。可以根据生成的参数,使用rectangle函数设置纤维的位置、大小和方向。 接着,可以在绘图窗口中添加附加的纹理或纹理模式来模拟纤维的外观。可以使用MATLAB中的各种绘图函数(如line、fill和patch等)来实现这些效果。可以根据生成的参数,在纤维的形状上绘制纹理模式,例如通过使用循环和条件语句来在纤维的表面添加斑点、条纹或其他纹理。 最后,可以将生成的纤维保存为图像文件或直接在MATLAB中显示。可以使用imwrite函数将纤维保存为图像文件,或使用imshow函数在MATLAB中显示生成的纤维。 需要注意的是,这只是一种基本的实现方法,具体的细节和效果可以根据实际需求进行调整和改进。此外,还可以结合其他MATLAB函数和工具箱来实现更复杂的纤维生成和渲染效果。 ### 回答2: MATLAB是一种功能强大的编程语言和数值计算环境,可以在其中使用随机数生成纤维。 要使用MATLAB生成纤维,我们可以使用rand或randn函数来生成随机数,并根据所需的特征进行调整。例如,我们可以使用rand函数生成一组介于0和1之间的随机数,然后将其转换为所需的范围。 生成纤维时,可以考虑纤维的长度、宽度和方向等属性。对于长度,我们可以使用rand函数生成一个介于最小值和最大值之间的随机数,并将其作为纤维的长度。对于宽度,可以生成一个随机数,再根据所需的范围进行缩放。对于方向,可以使用rand函数生成一个随机数,然后将其映射到所需的角度范围上。 生成纤维后,我们可以使用MATLAB的绘图函数将其可视化。例如,可以使用plot函数在二维坐标系中绘制纤维的形状,或使用surf函数在三维空间中绘制纤维的表面。 除了使用rand函数生成随机数外,MATLAB还提供了其他随机数生成函数,如randn、randperm和randi等。这些函数可以根据不同的需求生成不同类型的随机数,从而生成具有特定性质的纤维。 总而言之,MATLAB提供了丰富的功能来生成纤维。通过使用适当的随机数生成函数和调整参数,我们可以生成具有所需特征的纤维,并利用MATLAB的绘图函数将其可视化。 ### 回答3: 在MATLAB中,可以通过使用随机数生成器函数来生成纤维。下面是一个简单的示例代码,展示了如何使用MATLAB随机生成纤维: ```matlab % 设置纤维参数 fiberCount = 100; % 纤维数量 fiberLength = 10:2:50; % 纤维长度范围 fiberThickness = 0.01:0.01:0.05; % 纤维厚度范围 % 随机生成纤维 fibers = struct('length',[], 'thickness',[]); for i = 1:fiberCount % 随机生成纤维长度和厚度 randomLengthIndex = randi(length(fiberLength)); randomThicknessIndex = randi(length(fiberThickness)); % 将长度和厚度保存到结构体数组中 fibers(i).length = fiberLength(randomLengthIndex); fibers(i).thickness = fiberThickness(randomThicknessIndex); end % 显示生成的纤维信息 fprintf('生成了%d根纤维:\n', fiberCount); for i = 1:fiberCount fprintf('纤维%d:长度 = %.2f, 厚度 = %.2f\n', i, fibers(i).length, fibers(i).thickness); end ``` 上述代码首先设置纤维的参数,包括纤维数量、纤维长度范围和纤维厚度范围。然后,使用一个for循环生成纤维,每次循环随机选择一个纤维长度和纤维厚度,并将其保存在结构体数组中。最后,使用另一个for循环来显示生成的纤维信息。 这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。MATLAB提供了丰富的功能和工具箱,可以用于更复杂的纤维生成和处理任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值