python实现点线拓扑图_Canvas 点和连线/网络拓扑图

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

var links = [];

var links_count = 32;

var connects_time = 240;

var connects_count = 2;

var theme_start = {

X: 150,

Y: 150,

W: 300,

H: 300

};

function limit_number(min, cur, max) {

if (cur < min) return min;

if (cur > max) return max;

return cur;

}

function print_rgba(r, g, b, a) {

return "rgba(" + r + "," + g + "," + b + "," + a + ")";

}

function Linker() {

var connects = [];

for (var i = 0; i < connects_count; i++) connects.push(Connector());

var start_x = Math.random() * theme_start.W;

var start_y = Math.random() * theme_start.H;

return {

X: start_x,

Y: start_y,

TX: start_x,

TY: start_y,

NewJob: function() {

var tx = this.X + Math.random() * 200 - 100;

var ty = this.Y + Math.random() * 200 - 100;

this.TX = limit_number(Math.random() * 50, tx, theme_start.W - Math.random() * 50);

this.TY = limit_number(Math.random() * 50, ty, theme_start.H - Math.random() * 50);

},

Moving: function() {

return Math.sqrt(Math.pow(this.TX - this.X, 2) + Math.pow(this.TY - this.Y, 2)) > 1;

},

Connectors: connects

};

}

function Connector() {

return {

Time: -1,

Target: null,

NewJob: function() {

this.Target = Math.floor(Math.random() * links_count);

this.Time = Math.random() * connects_time;

}

};

}

function init() {

for (var i = 0; i < links_count; i++) links.push(Linker());

window.requestAnimationFrame(draw);

}

function draw() {

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

if (!links[i].Moving()) links[i].NewJob();

links[i].X += (links[i].TX - links[i].X) / 24;

links[i].Y += (links[i].TY - links[i].Y) / 24;

for (var j = 0; j < links[i].Connectors.length; j++) {

if (links[i].Connectors[j].Time < 0) links[i].Connectors[j].NewJob();

links[i].Connectors[j].Time -= 1;

}

}

var canvas = document.getElementById('frame');

if (canvas.getContext) {

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

canvas.width = window.innerWidth;

canvas.height = window.innerHeight;

ctx.globalCompositeOperation = 'destination-over';

ctx.clearRect(0, 0, theme_start.W, theme_start.H);

ctx.strokeStyle = "#5577A2";

ctx.fillStyle = "#5577A2";

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

for (var j = 0; j < links[i].Connectors.length; j++) {

var connect = links[links[i].Connectors[j].Target];

var linesPath = new Path2D();

linesPath.moveTo(links[i].X, links[i].Y);

linesPath.lineTo(connect.X, connect.Y);

ctx.strokeStyle = print_rgba(85, 119, 162, limit_number(.3, links[i].Connectors[j].Time / 100, 1));

ctx.stroke(linesPath);

}

}

var arcPath = new Path2D();

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

arcPath.moveTo(links[i].X, links[i].Y);

arcPath.arc(links[i].X, links[i].Y, 4, 0, Math.PI * 2, true);

}

ctx.fill(arcPath);

ctx.stroke(arcPath);

}

window.requestAnimationFrame(draw);

}

init();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值