当前位置:首页 > JavaScript

js实现黑洞

2026-02-01 19:02:34JavaScript

实现黑洞效果的 JavaScript 方法

使用 Canvas 绘制动态黑洞效果,结合引力模拟和粒子系统。

js实现黑洞

const canvas = document.getElementById('blackHoleCanvas');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

const particles = [];
const blackHole = {
  x: canvas.width / 2,
  y: canvas.height / 2,
  mass: 10000
};

class Particle {
  constructor() {
    this.x = Math.random() * canvas.width;
    this.y = Math.random() * canvas.height;
    this.size = Math.random() * 3 + 1;
    this.speedX = Math.random() * 2 - 1;
    this.speedY = Math.random() * 2 - 1;
  }

  update() {
    const dx = blackHole.x - this.x;
    const dy = blackHole.y - this.y;
    const distance = Math.sqrt(dx * dx + dy * dy);
    const force = blackHole.mass / (distance * distance);

    this.speedX += dx / distance * force;
    this.speedY += dy / distance * force;

    this.x += this.speedX;
    this.y += this.speedY;
  }

  draw() {
    ctx.fillStyle = 'white';
    ctx.beginPath();
    ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
    ctx.fill();
  }
}

function init() {
  for (let i = 0; i < 500; i++) {
    particles.push(new Particle());
  }
}

function animate() {
  ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  particles.forEach(particle => {
    particle.update();
    particle.draw();
  });

  // 绘制黑洞
  ctx.fillStyle = 'black';
  ctx.beginPath();
  ctx.arc(blackHole.x, blackHole.y, 30, 0, Math.PI * 2);
  ctx.fill();

  // 绘制吸积盘
  const gradient = ctx.createRadialGradient(
    blackHole.x, blackHole.y, 30,
    blackHole.x, blackHole.y, 100
  );
  gradient.addColorStop(0, 'rgba(255, 255, 255, 0)');
  gradient.addColorStop(0.5, 'rgba(200, 100, 255, 0.5)');
  gradient.addColorStop(1, 'rgba(100, 0, 200, 0.2)');

  ctx.fillStyle = gradient;
  ctx.beginPath();
  ctx.arc(blackHole.x, blackHole.y, 100, 0, Math.PI * 2);
  ctx.fill();

  requestAnimationFrame(animate);
}

init();
animate();

HTML 基础结构

<!DOCTYPE html>
<html>
<head>
  <title>JavaScript 黑洞模拟</title>
  <style>
    body { margin: 0; overflow: hidden; background: #000; }
    canvas { display: block; }
  </style>
</head>
<body>
  <canvas id="blackHoleCanvas"></canvas>
  <script src="blackhole.js"></script>
</body>
</html>

效果增强技巧

增加引力透镜效果模拟光线弯曲:

js实现黑洞

function drawGravitationalLensing() {
  const lensingRadius = 150;
  const steps = 36;

  for (let i = 0; i < steps; i++) {
    const angle = (i / steps) * Math.PI * 2;
    const x = blackHole.x + Math.cos(angle) * lensingRadius;
    const y = blackHole.y + Math.sin(angle) * lensingRadius;

    const gradient = ctx.createRadialGradient(
      x, y, 0,
      x, y, 20
    );
    gradient.addColorStop(0, 'rgba(255, 255, 255, 0.8)');
    gradient.addColorStop(1, 'rgba(255, 255, 255, 0)');

    ctx.fillStyle = gradient;
    ctx.beginPath();
    ctx.arc(x, y, 20, 0, Math.PI * 2);
    ctx.fill();
  }
}

性能优化建议

使用对象池管理粒子对象避免频繁创建销毁:

const particlePool = [];
const activeParticles = [];

function getParticle() {
  if (particlePool.length > 0) {
    return particlePool.pop();
  }
  return new Particle();
}

function recycleParticle(particle) {
  particlePool.push(particle);
}

交互功能实现

添加鼠标交互控制黑洞位置:

canvas.addEventListener('mousemove', (e) => {
  blackHole.x = e.clientX;
  blackHole.y = e.clientY;
});

标签: 黑洞js
分享给朋友:

相关文章

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…