news 2026/4/3 7:39:44

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

作者头像

张小明

前端开发工程师

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/3/31 23:20:58

打造你的专属无线手柄:ESP32蓝牙控制器完全实战指南

为什么选择ESP32来构建游戏手柄&#xff1f;当你想要将物理按钮、摇杆和传感器转换为电脑可识别的游戏控制信号时&#xff0c;ESP32凭借其强大的蓝牙功能和灵活的编程接口成为了理想选择。让我们从实际需求出发&#xff0c;探索如何用这个微控制器打造一个功能完整的无线游戏控…

作者头像 李华
网站建设 2026/3/25 9:24:27

DeepPavlov对话AI性能调优实战:从问题诊断到精准修复的完整指南

DeepPavlov作为开源的端到端对话系统库&#xff0c;为开发者提供了强大的对话AI构建能力。然而在实际部署中&#xff0c;许多用户常常面临对话质量不稳定、响应速度慢、意图识别不准等挑战。本文将通过问题诊断、工具使用、实战案例三个维度&#xff0c;为你提供一套完整的Deep…

作者头像 李华
网站建设 2026/4/2 21:40:19

AnuPpuccin主题:重塑Obsidian笔记界面的视觉体验

AnuPpuccin主题&#xff1a;重塑Obsidian笔记界面的视觉体验 【免费下载链接】AnuPpuccin Personal theme for Obsidian 项目地址: https://gitcode.com/gh_mirrors/an/AnuPpuccin AnuPpuccin是一款专为Obsidian设计的个性化主题&#xff0c;荣获2022年度最佳主题奖项。…

作者头像 李华
网站建设 2026/3/31 5:55:01

文旅营销新纪元:软文营销3大破局点,告别无效投放

当下的文旅营销领域&#xff0c;内容竞争已进入深水区。许多耗费心力撰写的宣传软文&#xff0c;却难以在信息洪流中脱颖而出&#xff0c;更无法有效触动目标客群。问题的核心在于&#xff0c;将软文视为孤立的文案创作&#xff0c;而非一个贯穿洞察、创作与分发的系统过程。一…

作者头像 李华
网站建设 2026/3/27 0:51:17

HeidiSQL终极指南:免费数据库管理工具快速上手

HeidiSQL终极指南&#xff1a;免费数据库管理工具快速上手 【免费下载链接】HeidiSQL HeidiSQL: 是一个免费且强大的 SQL 编辑器和数据库管理工具&#xff0c;支持 MySQL、PostgreSQL、SQLite 等多种数据库。适合数据库管理员和开发者使用 HeidiSQL 管理数据库和查询数据。 项…

作者头像 李华