DeepSeek-r1和O1、O3mini谁更强?

DeepSeek-r1和O1、O3mini谁更强?

题目:编写一个 js 程序,显示一个球在旋转的六边形内弹跳。球应该受到重力和摩擦力的影响,并且必须逼真地从旋转的墙壁上弹起

DeepSeek-r1

<!DOCTYPE html>
<html>
<body>
<canvas id="canvas" width="600" height="400"></canvas>
<script>
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const center = { x: canvas.width/2, y: canvas.height/2 };// 六边形参数
const hexRadius = 150;
let hexRotation = 0;
const hexRotationSpeed = 0.02;// 球参数
const ball = {x: center.x,y: center.y,radius: 10,vx: 2,vy: 0
};// 物理参数
const gravity = 0.5;
const restitution = 0.8; // 弹性系数
const friction = 0.7;   // 摩擦力系数function getHexagonPoints(cx, cy, radius, rotation) {const points = [];for (let i = 0; i < 6; i++) {const angle = rotation + (i * Math.PI/3);points.push({x: cx + radius * Math.cos(angle),y: cy + radius * Math.sin(angle)});}return points;
}function distanceToSegment(p, a, b) {const ab = { x: b.x - a.x, y: b.y - a.y };const ap = { x: p.x - a.x, y: p.y - a.y };const dot = ap.x * ab.x + ap.y * ab.y;if (dot <= 0) return Math.hypot(ap.x, ap.y);if (dot >= ab.x**2 + ab.y**2) return Math.hypot(p.x - b.x, p.y - b.y);const t = dot / (ab.x**2 + ab.y**2);const proj = { x: a.x + t*ab.x, y: a.y + t*ab.y };return Math.hypot(p.x - proj.x, p.y - proj.y);
}function update() {// 应用物理ball.vy += gravity;ball.x += ball.vx;ball.y += ball.vy;// 碰撞检测const points = getHexagonPoints(center.x, center.y, hexRadius, hexRotation);for (let i = 0; i < 6; i++) {const a = points[i];const b = points[(i+1)%6];const distance = distanceToSegment(ball, a, b);if (distance < ball.radius) {// 计算碰撞法线const mid = { x: (a.x + b.x)/2, y: (a.y + b.y)/2 };const normal = { x: (center.x - mid.x)/hexRadius,y: (center.y - mid.y)/hexRadius };// 校正位置const overlap = ball.radius - distance;ball.x += normal.x * overlap;ball.y += normal.y * overlap;// 计算速度变化const velocityDot = ball.vx * normal.x + ball.vy * normal.y;if (velocityDot < 0) {// 法向反弹const bounce = -velocityDot * restitution;// 切向摩擦const tangentVx = ball.vx - velocityDot * normal.x;const tangentVy = ball.vy - velocityDot * normal.y;ball.vx = tangentVx * friction + bounce * normal.x;ball.vy = tangentVy * friction + bounce * normal.y;}}}// 更新旋转hexRotation += hexRotationSpeed;// 绘制ctx.clearRect(0, 0, canvas.width, canvas.height);// 绘制六边形ctx.beginPath();ctx.moveTo(points[0].x, points[0].y);points.slice(1).forEach(p => ctx.lineTo(p.x, p.y));ctx.closePath();ctx.strokeStyle = '#000';ctx.stroke();// 绘制球ctx.beginPath();ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI*2);ctx.fillStyle = 'red';ctx.fill();requestAnimationFrame(update);
}update();
</script>
</body>
</html>

O1

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>旋转六边形内弹跳的球</title><style>body { margin: 0; overflow: hidden; background: #222; }canvas { display: block; }</style>
</head>
<body><canvas id="canvas"></canvas><script>// 获取 canvas 并设置全屏const canvas = document.getElementById('canvas');const ctx = canvas.getContext('2d');canvas.width = window.innerWidth;canvas.height = window.innerHeight;// 六边形的参数const center = { x: canvas.width / 2, y: canvas.height / 2 }; // 六边形中心const hexRadius = 200;      // 六边形半径(顶点到中心的距离)let hexRotation = 0;        // 当前旋转角度const hexRotationSpeed = 0.01; // 每帧旋转的弧度// 小球的参数const ballRadius = 10;let ball = {// 初始位置设在中心附近,可自行调整x: center.x,y: center.y,// 初始速度(可调整以获得不同运动效果)vx: 5,vy: -2};// 物理参数const gravity = 0.3;      // 重力加速度(单位:像素/帧²)const airFriction = 0.999; // 空气阻力,每帧对速度轻微衰减const restitution = 0.9;   // 碰撞时法向速度的反弹系数(0~1之间)const wallFriction = 0.98; // 墙面摩擦,降低切向分量// 动画主循环function animate() {update();draw();requestAnimationFrame(animate);}// 更新物理状态function update() {// 更新六边形旋转角度hexRotation += hexRotationSpeed;// 对小球施加重力ball.vy += gravity;// 应用空气阻力ball.vx *= airFriction;ball.vy *= airFriction;// 更新小球的位置ball.x += ball.vx;ball.y += ball.vy;// 计算当前旋转后的六边形各顶点const vertices = [];for (let i = 0; i < 6; i++) {const angle = hexRotation + i * Math.PI / 3; // 360°/6 = 60° = π/3vertices.push({x: center.x + hexRadius * Math.cos(angle),y: center.y + hexRadius * Math.sin(angle)});}// 对六边形每条边检测碰撞for (let i = 0; i < 6; i++) {const p1 = vertices[i];const p2 = vertices[(i + 1) % 6];// 计算边向量const edge = { x: p2.x - p1.x, y: p2.y - p1.y };const edgeLenSq = edge.x * edge.x + edge.y * edge.y;// 将小球中心投影到边所在直线上,求最接近边的点let t = ((ball.x - p1.x) * edge.x + (ball.y - p1.y) * edge.y) / edgeLenSq;t = Math.max(0, Math.min(1, t)); // 限定在 [0, 1] 内,保证点在边上const closest = { x: p1.x + t * edge.x, y: p1.y + t * edge.y };// 计算小球中心到最近点的距离const dx = ball.x - closest.x;const dy = ball.y - closest.y;const dist = Math.sqrt(dx * dx + dy * dy);// 若距离小于小球半径,则发生碰撞if (dist < ballRadius) {// 计算碰撞点处墙壁的速度// 对于以 center 为旋转中心、角速度 ω 的旋转体,// 任一点 r 相对于 center 的瞬时速度 v = ω × r,// 对于二维而言 v = ω * (-r.y, r.x)const rx = closest.x - center.x;const ry = closest.y - center.y;const wallV = {x: -hexRotationSpeed * ry,y: hexRotationSpeed * rx};// 计算小球相对于墙壁的速度(相对速度)const relV = {x: ball.vx - wallV.x,y: ball.vy - wallV.y};// 碰撞法线:从最近点指向小球中心let n = { x: dx, y: dy };const nMag = Math.sqrt(n.x * n.x + n.y * n.y) || 1;n.x /= nMag;n.y /= nMag;// 检查相对速度在法线方向上的分量(若小于 0,则表示正向墙壁运动)const relDotN = relV.x * n.x + relV.y * n.y;if (relDotN < 0) {// 将相对速度分解为法向分量和切向分量const vN = { x: n.x * relDotN, y: n.y * relDotN };const vT = { x: relV.x - vN.x, y: relV.y - vN.y };// 反弹:法向分量取反并乘以反弹系数,同时对切向分量施加摩擦衰减const newRelV = {x: -restitution * vN.x + wallFriction * vT.x,y: -restitution * vN.y + wallFriction * vT.y};// 小球碰撞后的速度 = 墙壁速度 + 更新后的相对速度ball.vx = newRelV.x + wallV.x;ball.vy = newRelV.y + wallV.y;// 将小球稍微移出碰撞状态,防止卡住const penetration = ballRadius - dist;ball.x += n.x * penetration;ball.y += n.y * penetration;}}}}// 绘制六边形和小球function draw() {// 清空画布ctx.clearRect(0, 0, canvas.width, canvas.height);// 绘制旋转六边形ctx.strokeStyle = "#fff";ctx.lineWidth = 3;ctx.beginPath();for (let i = 0; i < 6; i++) {const angle = hexRotation + i * Math.PI / 3;const x = center.x + hexRadius * Math.cos(angle);const y = center.y + hexRadius * Math.sin(angle);if (i === 0) {ctx.moveTo(x, y);} else {ctx.lineTo(x, y);}}ctx.closePath();ctx.stroke();// 绘制小球ctx.fillStyle = "#f00";ctx.beginPath();ctx.arc(ball.x, ball.y, ballRadius, 0, Math.PI * 2);ctx.fill();}// 开始动画animate();// 窗口尺寸变化时,重新设置 canvas 尺寸和中心点window.addEventListener('resize', function() {canvas.width = window.innerWidth;canvas.height = window.innerHeight;center.x = canvas.width / 2;center.y = canvas.height / 2;});</script>
</body>
</html>

O3-mini

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>旋转六边形内弹跳的球</title><style>body { margin: 0; background: #f0f0f0; }canvas { display: block; margin: 0 auto; background: #fff; }</style>
</head>
<body><canvas id="canvas" width="800" height="600"></canvas><script>// 获取 Canvas 及上下文const canvas = document.getElementById('canvas');const ctx = canvas.getContext('2d');// 全局参数const centerX = canvas.width / 2;const centerY = canvas.height / 2;const hexRadius = 250;         // 六边形的“外接圆”半径let hexRotation = 0;           // 六边形当前旋转角度(弧度)const omega = 0.01;            // 六边形旋转角速度(每帧增加的弧度)const gravity = 0.5;           // 重力加速度(像素/帧²)const airFriction = 0.999;     // 空气摩擦,每帧稍微衰减球的速度const restitution = 0.9;       // 反弹系数(碰撞时法向速度反向并缩小)const wallFriction = 0.98;     // 碰撞时切向速度摩擦(模拟与墙面接触时的摩擦损耗)// 球的属性const ball = {x: centerX,y: centerY - 100,radius: 15,vx: 3,vy: 0,};// --- 辅助函数 ---// 计算两个向量的点积function dot(ax, ay, bx, by) {return ax * bx + ay * by;}// 归一化向量 (x, y)function normalize(x, y) {const mag = Math.hypot(x, y);if (mag === 0) return { x: 0, y: 0 };return { x: x / mag, y: y / mag };}// 根据当前旋转角计算六边形的 6 个顶点(数组中的每个元素都是 {x, y} 对象)function getHexagonVertices() {const vertices = [];for (let i = 0; i < 6; i++) {// 每个顶点的角度:初始角加上 i * 60°const angle = hexRotation + i * Math.PI / 3;const x = centerX + hexRadius * Math.cos(angle);const y = centerY + hexRadius * Math.sin(angle);vertices.push({ x, y });}return vertices;}// 绘制六边形function drawHexagon(vertices) {ctx.beginPath();ctx.moveTo(vertices[0].x, vertices[0].y);for (let i = 1; i < vertices.length; i++) {ctx.lineTo(vertices[i].x, vertices[i].y);}ctx.closePath();ctx.lineWidth = 3;ctx.strokeStyle = '#333';ctx.stroke();}// 绘制球function drawBall() {ctx.beginPath();ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2);ctx.fillStyle = 'red';ctx.fill();ctx.lineWidth = 1;ctx.strokeStyle = '#000';ctx.stroke();}// 检测并处理球与一条边(p1 到 p2)的碰撞function resolveCollisionWithEdge(p1, p2) {// 求球心到边的最近点(将 p1p2 作为线段处理)const dx = p2.x - p1.x;const dy = p2.y - p1.y;const lengthSq = dx * dx + dy * dy;let t = ((ball.x - p1.x) * dx + (ball.y - p1.y) * dy) / lengthSq;t = Math.max(0, Math.min(1, t));  // 限制 t 在 [0, 1] 内const closestX = p1.x + t * dx;const closestY = p1.y + t * dy;// 计算球心与最近点的向量及距离const diffX = ball.x - closestX;const diffY = ball.y - closestY;const distance = Math.hypot(diffX, diffY);// 如果距离小于球半径,说明发生了碰撞if (distance < ball.radius) {const penetration = ball.radius - distance;  // 穿透深度// 计算碰撞法线:初步取从最近点指向球心的方向let normal = normalize(diffX, diffY);// 如果球心恰好与边重合(distance == 0),则使用边的法线if (distance === 0) {normal = normalize(dy, -dx);}// 也可以根据边向量计算两个垂直方向,并选择指向六边形内部的那个const edgeNormalCandidate = normalize(dy, -dx);const midX = (p1.x + p2.x) / 2;const midY = (p1.y + p2.y) / 2;const toCenter = { x: centerX - midX, y: centerY - midY };if (dot(edgeNormalCandidate.x, edgeNormalCandidate.y, toCenter.x, toCenter.y) > 0) {normal = edgeNormalCandidate;} else {normal = { x: -edgeNormalCandidate.x, y: -edgeNormalCandidate.y };}// 计算碰撞点处边的运动速度(因为六边形在旋转,边上的点有切向速度)// 对于一个位于 P 点(最近点)的位置,其速度 v_wall = ω × (P - center)// 在 2D 中:v_wall = (-ω*(P.y-centerY), ω*(P.x-centerX))const vWall = {x: -omega * (closestY - centerY),y:  omega * (closestX - centerX)};// 计算球相对于“运动边”的相对速度const relV = {x: ball.vx - vWall.x,y: ball.vy - vWall.y};// 计算相对速度在法线方向上的分量const relVNormal = dot(relV.x, relV.y, normal.x, normal.y);// 如果球正向墙面运动(相对速度法向分量为负),才处理碰撞if (relVNormal < 0) {// 反转法向分量,并按反弹系数缩放const newRelVNormal = -restitution * relVNormal;// 分离出切向分量,并加入碰撞摩擦(减少切向分量能量)const relVTangent = {x: (relV.x - relVNormal * normal.x) * wallFriction,y: (relV.y - relVNormal * normal.y) * wallFriction};// 碰撞后的相对速度const newRelV = {x: newRelVNormal * normal.x + relVTangent.x,y: newRelVNormal * normal.y + relVTangent.y};// 转换回绝对速度(加上边的运动速度)ball.vx = newRelV.x + vWall.x;ball.vy = newRelV.y + vWall.y;// 将球推出边界,防止“卡在墙内”ball.x += normal.x * penetration;ball.y += normal.y * penetration;}}}// --- 主循环 ---function update() {// 更新六边形的旋转角度hexRotation += omega;// 更新球的速度:加重力、应用空气摩擦ball.vy += gravity;ball.vx *= airFriction;ball.vy *= airFriction;// 更新球的位置ball.x += ball.vx;ball.y += ball.vy;// 获取当前六边形的顶点const vertices = getHexagonVertices();// 检测并处理球与六边形每条边的碰撞for (let i = 0; i < vertices.length; i++) {const p1 = vertices[i];const p2 = vertices[(i + 1) % vertices.length];resolveCollisionWithEdge(p1, p2);}// 清空画布ctx.clearRect(0, 0, canvas.width, canvas.height);// 绘制六边形和球drawHexagon(vertices);drawBall();// 循环调用下一帧requestAnimationFrame(update);}// 启动动画update();</script>
</body>
</html>

image-20250209213308563

运行结果

运行视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14989.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我用AI做数据分析之数据清洗

我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样&#xff1f; 这里描述自己在使用AI进行数据分析&#xff08;数据清洗&#xff09;过程中的几个小故事&#xff1a; 1. 变量名的翻译 有一个项目是某医生自己收集的数据&#xff0c;变量名使用的是中文&#xff0c;分…

如何搭建DeepSeek R1的训推环境?

本篇文章主要介绍基于Linux系统的Tesla A30 GPU的硬件环境搭建深度学习环境&#xff0c;为训练和推理DeepSeek R1 提供必要的环境&#xff0c;篇幅最后也会介绍到MIG的一些常见报错解决方案。 Anaconda安装 进入 https://www.anaconda.com/download/success 选择Linux安装包。…

模型压缩 --学习记录2

模型压缩 --学习记录2 如何找到更好的权衡方式(模型量化)方法一:寻找更好的 range方法二:寻找更好的 X-fp32(浮点数)方法三:寻找更好的 scale 和 zp方法四:寻找更好的 roundPTQ 后训练量化(离线量化)QAT 量化感知训练(在线量化)量化为什么会带来加速?三、模型稀疏技…

Unity3D仿星露谷物语开发28之切换场景

1、目标 Player可以在Scene1_Farm和Scene2_Field之间自动切换。通过Trigger实现该功能。同时创建一个预设体绑定该功能&#xff0c;这样可以把预设体放到任何场景中&#xff0c;通过配置即可实现Player在Scene之间的自由切换。 2、创建场景切换的工具对象 在Hierarchy中&…

Maven插件—flatten-maven-plugin:工程模块统一版本依赖

文章目录 前言一、认识flatten-maven-plugin插件二、如何使用flatten-maven-plugin插件&#xff1f;未使用flatten-maven-plugin插件之前的情况描述配置flatten-maven-plugin插件步骤1&#xff1a;最外层父模块安装插件&配置版本变量步骤2&#xff1a;各个自模块使用版本使…

并查集题目

并查集题目 聚合一块&#xff08;蓝桥&#xff09;合根植物&#xff08;蓝桥&#xff09;等式方程的可满足性省份数量 并查集&#xff08;Union-Find&#xff09;算法是一个专门针对「动态连通性」的算法。双方向的连通。 模板&#xff1a; class UF {// 连通分量个数private …

【玩转 Postman 接口测试与开发2_019】第15章:利用 Postman 初探 API 性能测试(含实战截图)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十五章 API 接口性能测试1 性能负载的类型2 Postman 负载配置3 Postman 性能测试实战3.1 Fixed 型负载下的性能测试3.2 基于数据驱动的 Postman 接口性能测试 4 性能测试的注意事项 写在前面 终于来到了…

Linux(20)——调度作业

目录 一、调度延迟的用户作业&#xff1a; 1、延迟的用户作业&#xff1a; 2、查看延迟的用户作业&#xff1a; 3、从计划中删除作业&#xff1a; 二、调度周期性用户作业&#xff1a; 1、周期性用户作业&#xff1a; 2、调度周期性用户作业&#xff1a; 3、用户作业格…

在 Visual Studio Code 与微信开发者工具中调试使用 emscripten 基于 C 生成的 WASM 代码

最近在尝试将一些 C/C、Lua 项目挪到 Web 上跑, 接触到了 emscripten. 这里会介绍下在 Visual Studio Code 与微信开发者工具中调试使用 emscripten 基于 C 生成的 WASM 代码 (WebAssembly) 的一些方法. Emscripten 与 WebAssebmly WebAssembly 是一种新的编码方式, 可以在现代…

deepseek API开发简介

1、申请deepseek api key&#xff1a; https://platform.deepseek.com/api_keys创建API Key&#xff0c;并复制Key 2、安装python、pip&#xff0c;然后安装requests pip install requests3、.示例代码 import requests import json# DeepSeek API 地址 API_URL "ht…

uniapp开发微信小程序请求超时设置【亲测有效】

在Hbuilderx中 使用uniapp开发微信小程序时 封装请求方法 请求代码如下 function requestFun(app) {// get请求app.config.globalProperties._get function(path, data, success, fail, complete) {data data || {};data.token uni.getStorageSync(token) || ;uni.request…

【03】 区块链分布式网络

3-1 P2P网络 传统中心化网络由中央服务器保存全量数据。客户端之间无法直接连接&#xff0c;必须通过中央服务器作为桥梁。客户端必须和中央服务器建立连接后访问资源。客户端之间并无连通。 在P2P网络中通过将数据资源分散在网络各个节点中存储以及节点间交互连接&#xff0…

DeepSeek-R1 论文解析——人工智能领域的 RL LLM 新时代?

简介 最近几年&#xff0c;AI领域真是突飞猛进&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;&#xff0c;它们为通用人工智能&#xff08;AGI&#xff09;的发展打下了基础。OpenAI的o1模型就是个很好的例子&#xff0c;它用了一种创新的推理时间扩展技术&#…

第七节 文件与流

基本的输入输出&#xff08;iostream&#xff09; C标准库提供了一组丰富的输入/输出功能&#xff0c;C的I/O发生在流中&#xff0c;流是字节序列。如果字节流是从设备&#xff08;键盘、磁盘驱动器、网络连接等&#xff09;流向内存&#xff0c;叫做输入操作。如果字节流是从…

算法篇——动态规划

核心思想&#xff1a; 将问题分解为重叠的子问题&#xff0c;并储存子问题的解&#xff08;使用字典、数组或哈希表&#xff09;&#xff0c;避免重复计算&#xff0c;从而提高效率。 题目特点&#xff1a;重叠子问题&#xff08;特殊地&#xff0c;是最优子结构&#xff09; …

redis高级数据结构Stream

文章目录 背景stream概述消息 ID消息内容常见操作独立消费创建消费组消费 Stream弊端Stream 消息太多怎么办?消息如果忘记 ACK 会怎样?PEL 如何避免消息丢失?分区 Partition Stream 的高可用总结 背景 为了解决list作为消息队列是无法支持消息多播问题&#xff0c;Redis5.0…

ASP.NET Core WebSocket、SignalR

目录 WebSocket SignalR SignalR的基本使用 WebSocket WebSocket基于TCP协议&#xff0c;支持二进制通信&#xff0c;双工通信。性能和并发能力更强。WebSocket独立于HTTP协议&#xff0c;不过我们一般仍然把WebSocket服务器端部署到Web服务器上&#xff0c;因为可以借助HT…

多路文件IO

一、思维导图

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…

小红书提出新面部视频交换方法DynamicFace,可生成高质量且一致的视频面部图像。

DynamicFace是一种新颖的面部视频交换方法&#xff0c;旨在生成高质量且一致的视频面部图像。该方法结合了扩散模型的强大能力和可插拔的时间层&#xff0c;以解决传统面部交换技术面临的两个主要挑战&#xff1a;在保持源面部身份的同时&#xff0c;准确传递目标面部的运动信息…