news 2026/4/15 22:40:37

基于自制类弦理论的物理模拟

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于自制类弦理论的物理模拟

基本实体:宇宙的基本实体是旋转的线段。线段属性:线段突然出现 → 逐渐缩短 → 消失。线段有颜色,颜色在拼接时色散,分配到相邻线段。线段会旋转,旋转速度与平移速度成反比,线段是局部时间的具象化:线段的存在与消失对应局部时间的产生与流逝。2. 结构假设,拼接结构:线段通过离散拼接构成网络。拼接处有节点,节点约束旋转幅度。拼接必定扭曲。引力本质:线段网络的结构体现为引力,节点处的约束与色散传递对应引力相互作用,空间生成:线段碰到空间边界会使边界向外扩散,空间由此膨胀。3. 宇宙初始条件,初始宇宙是一个球体,球内每个整数坐标点产生一条线段。 线段消失后,同一位置会有新线段补充(守恒或循环)。<!DOCTYPE html>

<html lang="zh-CN">

<head>

<meta charset="UTF-8">

<title>自定义引力线段模拟器</title>

<style>

body { margin: 0; display: flex; flex-direction: column; align-items: center; background: #000; color: #fff; font-family: Arial; }

#canvas { border: 2px solid #444; background: #111; }

.controls { margin: 10px 0; display: flex; gap: 10px; align-items: center; }

button { padding: 5px 15px; cursor: pointer; background: #333; color: #fff; border: 1px solid #666; }

input { width: 100px; padding: 5px; background: #222; color: #fff; border: 1px solid #666; }

</style>

</head>

<body>

<div class="controls">

<label>时间倍数:</label>

<input type="number" id="timeScale" value="1" min="0.1" step="0.1">

<button onclick="resetSim()">重置模拟</button>

</div>

<canvas id="canvas" width="800" height="600"></canvas>

<script>

const canvas = document.getElementById('canvas');

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

let timeScale = 1;

let segments = [];

let polygons = [];

const MAX_SEGMENTS = 200;

const NODE_DIST = 15;

const MAX_LIFE = 100; // 线段最大生命周期

class Segment {

constructor(x, y) {

this.x = x; this.y = y;

this.len = Math.random() * 30 + 20;

this.angle = Math.random() * Math.PI * 2;

this.angleSpeed = (Math.random() - 0.5) * 0.02;

this.lenDecay = 0.01;

this.color = `hsl(${Math.random() * 360}, 80%, 50%)`;

this.nodes = [{x: this.x, y: this.y}, this.getEndPoint()];

this.life = MAX_LIFE; // 新增:生命周期

}

getEndPoint() {

return {

x: this.x + Math.cos(this.angle) * this.len,

y: this.y + Math.sin(this.angle) * this.len

};

}

update() {

this.angle += this.angleSpeed * timeScale;

this.len -= this.lenDecay * timeScale;

this.life -= 1 * timeScale; // 生命周期随时间减少

// 生命周期耗尽或长度过短则重置

if (this.life <= 0 || this.len < 5) {

this.len = Math.random() * 20 + 10;

this.life = MAX_LIFE;

this.color = `hsl(${Math.random() * 360}, 80%, 50%)`;

}

this.nodes[1] = this.getEndPoint();

// 颜色亮度随生命周期调整

const hue = parseInt(this.color.match(/hsl\((\d+)/)[1]);

const alpha = this.life / MAX_LIFE; // 透明度与生命周期正相关

this.displayColor = `hsla(${hue}, 80%, 50%, ${alpha})`;

}

draw() {

// 线段颜色使用带透明度的displayColor,不再是黑色

ctx.beginPath();

ctx.moveTo(this.nodes[0].x, this.nodes[0].y);

ctx.lineTo(this.nodes[1].x, this.nodes[1].y);

ctx.strokeStyle = this.displayColor;

ctx.lineWidth = 2;

ctx.stroke();

// 节点绘制

this.nodes.forEach(node => {

ctx.beginPath();

ctx.arc(node.x, node.y, 3, 0, Math.PI * 2);

ctx.fillStyle = `rgba(255,255,255,${this.life/MAX_LIFE})`;

ctx.fill();

});

}

}

function checkCollisionAndMerge() {

const nodeMap = new Map();

segments.forEach((seg, segIdx) => {

seg.nodes.forEach((node, nodeIdx) => {

const key = `${Math.round(node.x / NODE_DIST)}_${Math.round(node.y / NODE_DIST)}`;

if (!nodeMap.has(key)) nodeMap.set(key, []);

nodeMap.get(key).push({seg, node, segIdx, nodeIdx});

});

});

for (const [key, nodes] of nodeMap) {

if (nodes.length < 2) continue;

const vertices = nodes.map(item => item.node);

const uniqueVerts = vertices.filter((v, i) =>

vertices.findIndex(u => u.x === v.x && u.y === v.y) === i

);

if (uniqueVerts.length >= 3) {

// 多边形透明度随线段平均生命周期调整

const avgLife = nodes.reduce((sum, item) => sum + item.seg.life, 0) / nodes.length;

const polyColor = nodes[0].seg.displayColor.replace(/[^,]+(?=\))/, avgLife/MAX_LIFE);

polygons.push({ vertices: [...uniqueVerts], color: polyColor });

nodes.forEach(item => item.seg.angleSpeed *= 0.5);

}

}

}

function drawPolygons() {

polygons.forEach(poly => {

ctx.beginPath();

ctx.moveTo(poly.vertices[0].x, poly.vertices[0].y);

poly.vertices.forEach(v => ctx.lineTo(v.x, v.y));

ctx.closePath();

ctx.fillStyle = poly.color.replace('50%,', '20%,');

ctx.strokeStyle = poly.color;

ctx.lineWidth = 1;

ctx.fill();

ctx.stroke();

});

if (polygons.length > 50) polygons.shift();

}

function initSim() {

segments = [];

polygons = [];

for (let i = 0; i < MAX_SEGMENTS; i++) {

const x = Math.floor(Math.random() * (canvas.width - 40)) + 20;

const y = Math.floor(Math.random() * (canvas.height - 40)) + 20;

segments.push(new Segment(x, y));

}

}

function resetSim() {

initSim();

}

function animate() {

ctx.clearRect(0, 0, canvas.width, canvas.height);

timeScale = parseFloat(document.getElementById('timeScale').value) || 1;

segments.forEach(seg => seg.update());

segments.forEach(seg => seg.draw());

checkCollisionAndMerge();

drawPolygons();

requestAnimationFrame(animate);

}

window.addEventListener('resize', () => {

canvas.width = Math.min(window.innerWidth - 40, 800);

canvas.height = Math.min(window.innerHeight - 100, 600);

});

initSim();

animate();

</script>

</body>

</html>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 20:00:30

js.207.课程表

链接&#xff1a;207. 课程表 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequis…

作者头像 李华
网站建设 2026/4/12 18:21:06

Memobase:构建AI长期记忆系统的完整实践指南

Memobase&#xff1a;构建AI长期记忆系统的完整实践指南 【免费下载链接】memobase Profile-Based Long-Term Memory for AI Applications 项目地址: https://gitcode.com/gh_mirrors/me/memobase 在AI应用日益普及的今天&#xff0c;让机器真正理解并记住用户信息已成为…

作者头像 李华
网站建设 2026/4/12 3:36:52

毕业季必看:6款AI写论文神器,让AI率从65%降到9%!

如果你是正在熬夜赶论文的毕业生——这篇文章为你而来 如果你是被导师第N次打回修改意见的研究生&#xff0c;抑或是拿着知网查重报告心疼钱包的大学生&#xff0c;甚至是卡在公式/代码/图表里的理工科科研人——请停下你手里的咖啡&#xff0c;这篇文章就是你的论文救星。 我…

作者头像 李华
网站建设 2026/4/15 4:47:06

MinIO开源与商业版功能深度解析及部署实践指南

MinIO开源与商业版功能深度解析及部署实践指南 【免费下载链接】minio minio/minio: 是 MinIO 的官方仓库&#xff0c;包括 MinIO 的源代码、文档和示例程序。MinIO 是一个分布式对象存储服务&#xff0c;提供高可用性、高性能和高扩展性。适合对分布式存储、对象存储和想要使用…

作者头像 李华
网站建设 2026/4/15 16:02:05

4种国际化架构实现方案解析:BewlyBewly的Vue3多语言实践

4种国际化架构实现方案解析&#xff1a;BewlyBewly的Vue3多语言实践 【免费下载链接】BewlyBewly Improve your Bilibili homepage by redesigning it, adding more features, and personalizing it to match your preferences. 项目地址: https://gitcode.com/gh_mirrors/be…

作者头像 李华
网站建设 2026/4/15 17:28:26

CVAT智能标注工具:从数据困境到高效解决方案的完整指南

在计算机视觉项目开发过程中&#xff0c;数据标注往往是耗时最长、成本最高的环节。面对海量的图像、视频和点云数据&#xff0c;传统的手动标注方式不仅效率低下&#xff0c;还容易因标注人员的主观差异导致数据质量参差不齐。CVAT作为业界领先的开源标注工具&#xff0c;通过…

作者头像 李华