× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Cách vẽ bất kỳ hình dạng thông thường nào chỉ bằng một hàm JavaScript

27/07/2023 01:29

Cùng tìm hiểu Cách vẽ bất kỳ hình dạng thông thường nào chỉ bằng một hàm JavaScript n gay trong bài viết dưới đây

Vẽ hình lục giác bằng JavaScript

Hình lục giác có sáu cạnh bằng nhau. Nếu chúng ta tưởng tượng điểm xuất phát của mình là tâm của hình lục giác, thì chúng ta có thể di chuyển quanh điểm này sáu lần, nối từng điểm khi chúng ta đi để tạo các cạnh.

Hãy bắt đầu bằng cách tạo bối cảnh <canvas>có 2d bản vẽ . Chúng tôi sẽ cố định kích thước của canvas thành 400 x 200 pixel cho ví dụ này và đặt điểm trung tâm là (200, 100).

<canvas></canvas>
const canvas = document.querySelector("canvas");
canvas.width = 400;
canvas.height = 200;

const ctx = canvas.getContext("2d");
const cx = 200;
const cy = 100;

Bây giờ chúng ta cần tìm ra vị trí x (ngang) và y (dọc) của các điểm xung quanh tâm, khi nối với một đường thẳng, sẽ tạo thành sáu cạnh bằng nhau. Đối với điều này, chúng tôi sử dụng phép đo từ tâm đến điểm (chúng tôi sẽ gọi đây là bán kính) và góc hướng từ tâm.

Vì có 360 độ trong một vòng quay đầy đủ và sáu điểm chúng tôi muốn tạo, chúng tôi có thể chia 360/6 và biết rằng chúng tôi sẽ tạo một điểm sau mỗi 60 độ. Tuy nhiên, có một cảnh báo nhỏ về vấn đề này – JavaScript hoạt động radiansvới degrees. Một điều tôi luôn nhớ là giá trị pitrong radianslà 180 độ, hoặc nửa vòng tròn. Vì vậy (Math.PI*2)/6, sẽ cung cấp cho chúng tôi mỗi vòng quay trong radians hoặc thậm chí đơn giản hơn Math.PI/3.

Tiếp theo, chúng ta cần thêm một chút lượng giác để tìm vị trí x và y của mỗi điểm. Đối với vị trí x, chúng ta có thể sử dụng tổng bán kính nhân với cos(angle) và đối với bán kính vị trí y nhân với sin(angle) . Hãy đặt tất cả lại với nhau, thêm vào mã JavaScript của chúng tôi ở trên:

JS

// set the radius of the hexagon
const radius = 50;

// move the canvas to the center position
ctx.translate(cx, cy);

for (let i = 0; i < 6; i++) {
  // calculate the rotation
  const rotation = (Math.PI / 3) * i;

  // for the first point move to
  if (i === 0) {
    ctx.moveTo(radius * Math.cos(rotation), radius * Math.sin(rotation));
  } else {
    // for the rest draw a line
    ctx.lineTo(radius * Math.cos(rotation), radius * Math.sin(rotation));
  }
}

// close path and stroke it
ctx.closePath();
ctx.stroke();

 

Vẽ một hình có số cạnh bất kỳ

Giả sử chúng ta muốn vẽ một hình tam giác, hình vuông hoặc hình bát giác. Tất cả những gì chúng ta cần sửa đổi trong hàm trên, được sử dụng để vẽ hình lục giác, là số lần chúng ta vẽ các đường trong forvòng lặp của mình và góc cho mỗi điểm.

Hãy biến cái này thành một hàm lấy điểm trung tâm, bán kính và số cạnh làm tham số:

function drawShape(x, y, r, sides) {
  // move the canvas to the center position
  ctx.translate(x, y);

  for (let i = 0; i < sides; i++) {
    // calculate the rotation
    const rotation = ((Math.PI * 2) / sides) * i;

    // for the first point move to
    if (i === 0) {
      ctx.moveTo(r * Math.cos(rotation), r * Math.sin(rotation));
    } else {
      // for the rest draw a line
      ctx.lineTo(r * Math.cos(rotation), r * Math.sin(rotation));
    }
  }

  // close path and stroke it
  ctx.closePath();
  ctx.stroke();

  // reset the translate position
  ctx.resetTransform();
}

Bây giờ chúng ta có thể vẽ các hình dạng khác nhau bằng cách điều chỉnh sidestham số:

JS

drawShape(100, 100, 50, 3);
drawShape(225, 100, 50, 7);
drawShape(350, 100, 50, 4);

Bản tóm tắt

Đây là phần giới thiệu nhỏ về <canvas>thành phần để vẽ trên trang web và một số phương pháp bạn có thể sử dụng để vẽ hình. Nếu bạn muốn tìm hiểu sâu hơn về cách thức hoạt động của tất cả các phần, đây là bản tóm tắt về những gì chúng tôi đã sử dụng:

  • <canvas>, phần tử mà chúng ta có thể hiển thị đồ họa
  • CanvasRenderingContext2Dđể vẽ các hình dạng 2D vào canvas
  • translate()để di chuyển nguồn gốc đến một vị trí mới
  • lineTo()để vẽ một đường từ điểm này đến điểm khác
  • closePath()nối điểm đầu tiên với điểm cuối cùng
  • stroke()để vẽ đường dẫn với một phong cách đột quỵ

Để tính toán vị trí của mỗi điểm, chúng tôi đã sử dụng một chút toán học và lượng giác:

  • Math.cos()để tính vị trí x của một điểm
  • Math.sin()để tính vị trí y của một điểm
  • Math.PIđể tính góc quay theo radian

Để có thêm cảm hứng về những gì bạn có thể làm với <canvas>thành phần này, hãy xem hướng dẫn Canvas bắt đầu với những điều cơ bản và sau đó bao gồm các chủ đề nâng cao hơn như hoạt ảnh và thao tác pixel.

Có rất nhiều cách bạn có thể mở rộng hàm hình dạng cơ bản này. Tôi muốn bao gồm một bán kính bên trong, để bạn có thể tạo ra các viên kim cương và các ngôi sao. Tôi cũng đã thử nghiệm một chút với các đường cong thay vì đường thẳng - hãy tự mình thử nghiệm. Hoặc thử một số tessellation, điều này luôn thú vị!