- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 javascript 和 html canvas 使用胡克斯定律和哥伦布定律原理开发了一个强制有向图。我面临的问题是,如果节点超过 10-20 个,它就会崩溃!否则工作正常..有人可以帮忙吗?
var myCanvas = document.getElementById('myCanvas');
var ctx = myCanvas.getContext('2d');
myCanvas.width = window.innerWidth;
myCanvas.height = window.innerHeight;
ctx.fillStyle = '#006FB9';
ctx.strokeStyle = '#006FB9';
var time = 0; //track total consumed time
function Graph(){
this.width = window.innerWidth;
this.height = window.innerHeight;
this.vertices = {};
this.forcex = {};
this.forcey = {};
this.stepSize = 0.0005;
this.iteration = 0;
this.task = null;
this.repulsion = 200000;
this.spring_length = 20;
}
Graph.prototype.createVertex = function(name){
var vertex = {};
vertex.posx = Math.random() * (this.width * 0.8) + (this.width * 0.1);
vertex.posy = Math.random() * (this.height * 0.8) + (this.height * 0.1);
vertex.edges = new Array();
this.vertices[name] = vertex;
};
Graph.prototype.createEdge = function(a,b){
this.vertices[a].edges[b] = {'dest' : b};
this.vertices[b].edges[a] = {'dest' : a};
};
Graph.prototype.updateLayout = function(){
for(i in g.vertices){
g.forcex[i] = 0;
g.forcey[i] = 0;
for(j in g.vertices){
if(i !== j){
var deltax = g.vertices[j].posx - g.vertices[i].posx;
var deltay = g.vertices[j].posy - g.vertices[i].posy;
var d2 = deltax * deltax + deltay * deltay;
//add jitter if d^2 is very small
if(d2 < 0.01){
deltax = 0.1 * Math.random() + 0.1;
deltay = 0.1 * Math.random() + 0.1;
d2 = deltax * deltax + deltay * deltay;
}
//columb's
g.forcex[i] -= (g.repulsion / d2) * deltax;
g.forcey[i] -= (g.repulsion / d2) * deltay;
//hooke's
if(g.vertices[i].edges[j]){
var distance = Math.sqrt(d2);
this.forcex[i] += (distance - g.spring_length) * deltax;
this.forcey[i] += (distance - g.spring_length) * deltay;
}
}
}
}
for(i in g.vertices){
//vertices
g.vertices[i].posx += g.forcex[i] * g.stepSize;
g.vertices[i].posy += g.forcey[i] * g.stepSize;
}
Graph.iteration++;
if(Graph.iteration > 300){
g.quit();
}
};
Graph.prototype.quit = function(){
//draw vertices
for(i in g.vertices){
ctx.beginPath();
ctx.arc(g.vertices[i].posx, g.vertices[i].posy, 5, 0, Math.PI * 2);
ctx.fill();
//draw edges
for (j in g.vertices[i].edges){
ctx.moveTo(g.vertices[i].posx, g.vertices[i].posy);
ctx.lineTo(g.vertices[g.vertices[i].edges[j].dest].posx, g.vertices[g.vertices[i].edges[j].dest].posy);
ctx.stroke();
}
}
window.clearInterval(Graph.task);
Graph.task = null;
console.log('Start Time : ' + time + ' / End Time : ' + Date.now());
};
Graph.prototype.go = function(){
if(this.task){
return;
}
time = Date.now();
Graph.iteration = 0;
Graph.task = window.setInterval(function(){g.updateLayout();},1);
}
var g = new Graph();
//invoke
(function(){
for (var i = 0; i < 10; i++){
g.createVertex(i);
if (i > 0){
g.createEdge('0',i);
}
}
g.go();
})();
最佳答案
您已经构建了具有二次运行时间的算法。当您需要 x
微秒来处理一个节点时,则需要 x * n²
微秒来处理 n
个节点。这意味着处理时间随着要添加的节点数量而迅速增加。
但是,您可以使用 window.setInterval
强制模拟每 1ms 模拟一帧。使用 setInterval
来安排可能的处理密集型任务是一个坏主意,特别是当您的间隔长度非常短时。当您在一毫秒内处理的节点太多时,这根本无法工作,因为您请求浏览器处理模拟的速度比其物理能力更快。
要允许您的应用程序以每秒更少的帧数为代价处理更多数量的节点,您可以使用 window.requestAnimationFrame(function)
.
将 setInterval 调用替换为
window.requestAnimationFrame(g.updateLayout);
并在g.updateLayout
末尾放置同一行,以便在浏览器完成绘制最后一帧后立即请求下一帧。
关于如果有超过 10-20 个节点,Javascript HTML canvas 标签会强制定向图崩溃,否则会起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29238898/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!