返回

拖拽调整曲线控制点巧绘粽子:解锁您的画图潜能

前端

前言

在看到 @岛上码农 的文章《拖拽调整曲线控制点画粽子》后,我被深深吸引了。作为一名专注于界面的开发者,我很少有机会参与绘画方面的工作。然而,这篇博文激发了我探索拖拽曲线控制点技术的好奇心,它可以用来创建复杂而富有表现力的图形。

我立刻动手重写了这篇文章的代码,却发现原始代码仅提供了一半的功能。为了填补这一空白,我决定完善代码,允许用户通过拖拽曲线控制点来调整粽子的形状和尺寸。

代码示例

<canvas id="canvas" width="500" height="500"></canvas>
// 获取画布和上下文
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

// 定义粽子的初始形状
const points = [
  {x: 100, y: 200},
  {x: 200, y: 100},
  {x: 300, y: 200},
  {x: 200, y: 300},
];

// 绘制粽子
function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  ctx.beginPath();
  ctx.moveTo(points[0].x, points[0].y);
  for (let i = 1; i < points.length; i++) {
    ctx.quadraticCurveTo(points[i - 1].x, points[i - 1].y, points[i].x, points[i].y);
  }
  ctx.closePath();
  ctx.fill();
}

// 启用拖拽功能
for (let i = 0; i < points.length; i++) {
  const point = points[i];

  point.handle = document.createElement("div");
  point.handle.style.position = "absolute";
  point.handle.style.width = "10px";
  point.handle.style.height = "10px";
  point.handle.style.backgroundColor = "red";
  point.handle.style.cursor = "move";

  canvas.appendChild(point.handle);

  point.handle.addEventListener("mousedown", (e) => {
    e.preventDefault();

    const rect = canvas.getBoundingClientRect();
    const mouseX = e.clientX - rect.left;
    const mouseY = e.clientY - rect.top;

    point.offset = {
      x: point.x - mouseX,
      y: point.y - mouseY,
    };

    document.addEventListener("mousemove", movePoint);
    document.addEventListener("mouseup", stopMoving);
  });
}

// 移动控制点
function movePoint(e) {
  e.preventDefault();

  const rect = canvas.getBoundingClientRect();
  const mouseX = e.clientX - rect.left;
  const mouseY = e.clientY - rect.top;

  point.x = mouseX + point.offset.x;
  point.y = mouseY + point.offset.y;

  draw();
}

// 停止移动
function stopMoving() {
  document.removeEventListener("mousemove", movePoint);
  document.removeEventListener("mouseup", stopMoving);
}

// 初始绘制
draw();

结论

通过补充完整的代码,我们现在可以创建可通过拖拽曲线控制点进行调整的粽子。这种技术不仅可以用于绘制复杂的图形,还可以提供交互式体验,让用户控制图像的外观。

如果您对绘制自己的粽子感兴趣,请随时尝试提供的代码。只需将其复制到您的编辑器中,运行即可。如果您在途中遇到任何问题,请随时留言,我会尽力提供帮助。