当前位置:首页 > JavaScript

js实现心形线

2026-03-02 06:11:40JavaScript

js实现心形线

实现心形线的 JavaScript 方法

心形线(Cardioid)是一种极坐标方程曲线,可以通过以下数学公式描述:

js实现心形线

  • 极坐标方程:$r = a(1 + \cos\theta)$
  • 参数方程:
    $x = a(2\cos t - \cos 2t)$
    $y = a(2\sin t - \sin 2t)$

使用 Canvas 绘制心形线

const canvas = document.createElement('canvas');
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');
canvas.width = 400;
canvas.height = 400;

// 心形线参数方程
function cardioid(t, scale) {
  return {
    x: scale * (16 * Math.pow(Math.sin(t), 3)),
    y: scale * (13 * Math.cos(t) - 5 * Math.cos(2*t) - 2 * Math.cos(3*t) - Math.cos(4*t))
  };
}

// 绘制心形
ctx.beginPath();
ctx.strokeStyle = 'red';
ctx.fillStyle = 'pink';

for (let t = 0; t < 2 * Math.PI; t += 0.01) {
  const point = cardioid(t, 10);
  const x = point.x + canvas.width / 2;
  const y = -point.y + canvas.height / 2; // 反转Y轴

  if (t === 0) {
    ctx.moveTo(x, y);
  } else {
    ctx.lineTo(x, y);
  }
}

ctx.closePath();
ctx.fill();
ctx.stroke();

使用 SVG 绘制心形线

const svgNS = "http://www.w3.org/2000/svg";
const svg = document.createElementNS(svgNS, "svg");
svg.setAttribute("width", "400");
svg.setAttribute("height", "400");
document.body.appendChild(svg);

let pathData = "";
for (let t = 0; t <= 2 * Math.PI; t += 0.01) {
  const x = 200 + 16 * Math.pow(Math.sin(t), 3) * 10;
  const y = 200 - (13 * Math.cos(t) - 5 * Math.cos(2*t) - 2 * Math.cos(3*t) - Math.cos(4*t)) * 10;

  if (t === 0) {
    pathData += `M ${x} ${y}`;
  } else {
    pathData += ` L ${x} ${y}`;
  }
}

const path = document.createElementNS(svgNS, "path");
path.setAttribute("d", pathData);
path.setAttribute("fill", "pink");
path.setAttribute("stroke", "red");
svg.appendChild(path);

使用 Three.js 绘制 3D 心形

import * as THREE from 'three';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建心形几何体
const heartShape = new THREE.Shape();
heartShape.moveTo(0, 0);
for (let t = 0; t < 2 * Math.PI; t += 0.01) {
  const x = 16 * Math.pow(Math.sin(t), 3);
  const y = 13 * Math.cos(t) - 5 * Math.cos(2*t) - 2 * Math.cos(3*t) - Math.cos(4*t);
  heartShape.lineTo(x, y);
}

const geometry = new THREE.ExtrudeGeometry(heartShape, {
  depth: 1,
  bevelEnabled: true,
  bevelSize: 0.5
});
const material = new THREE.MeshPhongMaterial({ color: 0xff69b4 });
const heart = new THREE.Mesh(geometry, material);
scene.add(heart);

camera.position.z = 30;

function animate() {
  requestAnimationFrame(animate);
  heart.rotation.x += 0.01;
  heart.rotation.y += 0.01;
  renderer.render(scene, camera);
}
animate();

数学公式变体

经典心形线公式: $r = 1 - \cos\theta$
或参数方程:
$x = \cos t \cdot (1 + \cos t)$
$y = \sin t \cdot (1 + \cos t)$

更复杂的心形公式(如上文代码所用): $x = 16\sin^3 t$
$y = 13\cos t - 5\cos 2t - 2\cos 3t - \cos 4t$

标签: js心形线
分享给朋友:

相关文章

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…