HTML5 캔버스에 다각형을 그리는 방법은 무엇입니까?


95

캔버스에 다각형을 그리는 방법을 알아야합니다. jQuery 또는 이와 유사한 것을 사용하지 않고.


10
타사 라이브러리없이 수행 할 수있는 모든 작업은 일반적으로 수행해야한다는 점을 기억하는 것이 좋습니다.
Rodrigo

답변:


165

moveTolineTo( 라이브 데모 )를 사용하여 경로를 만듭니다 .

var ctx = canvas.getContext('2d');
ctx.fillStyle = '#f00';
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(100,50);
ctx.lineTo(50, 100);
ctx.lineTo(0, 90);
ctx.closePath();
ctx.fill();

100
@Gio Borje : AFAIK, jsFiddle은 캔버스에 관심이 없습니다. 브라우저가 바로 그것입니다. jsFiddle은 HTML / CSS / JS를 다시 제공합니다.
MU이 너무 짧

2
탁월한 솔루션. 매우 깔끔한 코드. @phihag 감사합니다. 내가 이해할 수있는 것!
bytise

1
c2를 ctx로 바꿀 수 있습니까? 캔버스 컨텍스트에 더 일반적으로 사용되는 것 같습니다.
그건

@ user1893354 통지 해 주셔서 대단히 감사합니다. 실제로 jsfiddle에 문제가있는 것 같습니다. 오류 메시지는 캔버스와 완전히 관련이 없습니다. 매우 간단한 라이브 데모 사이트로 대체되었습니다.
phihag

36

에서 http://www.scienceprimer.com/drawing-regular-polygons-javascript-canvas :

다음 코드는 육각형을 그립니다. 측면의 수를 변경하여 다른 정다각형을 만듭니다.

var ctx = document.getElementById('hexagon').getContext('2d');

// hexagon
var numberOfSides = 6,
    size = 20,
    Xcenter = 25,
    Ycenter = 25;

ctx.beginPath();
ctx.moveTo (Xcenter +  size * Math.cos(0), Ycenter +  size *  Math.sin(0));          

for (var i = 1; i <= numberOfSides;i += 1) {
  ctx.lineTo (Xcenter + size * Math.cos(i * 2 * Math.PI / numberOfSides), Ycenter + size * Math.sin(i * 2 * Math.PI / numberOfSides));
}

ctx.strokeStyle = "#000000";
ctx.lineWidth = 1;
ctx.stroke();
#hexagon { border: thin dashed red; }
<canvas id="hexagon"></canvas>


3
이것은 훌륭하고 매우 우아했습니다. 또한 다음을 추가 cxt.save(); cxt.fillStyle = "#FF000"; cxt.fill(); cxt.restore(); 하면 모양을 채울 수 있습니다.
samuelkobe 2014

이것은 훌륭합니다-나는 그것을 가지고 놀았지만 선택한 다각형을 회전시킬 방법을 찾을 수 없습니다-아이디어가 있습니까?
eskimomatt 2015 년

1
원하는 것을 얻을 수있는 몇 가지 방법이 있습니다. 한 가지 옵션은 [cxt.save () 및 cxt.restore ()와 함께] 내장 된 cxt.rotate () 메서드를 사용하여 캔버스의 일부를 회전하는 것입니다. 또는 cos 및 sin 함수에 일관된 값을 추가하는 것도 작동합니다. : 데모이 jsfiddle 참조 jsfiddle.net/kwyhn3ba
앤드류 Staroscik

감사합니다-제공된 과학 입문서 링크의 논리를 읽은 후 동일한 솔루션을 발견했습니다. var angle = i * 2 * Math.PI / shape.currentSides + rotation다시 COS와 나를 위해 일한 죄 값 ... 덕분에 추가
eskimomatt

(제 경우와 같이) 시작점이 오른쪽 중간이 아닌 다각형의 중간 상단이되도록하려면 sincos호출을 뒤집고 두 곳 모두에서 변경 Ycenter +합니다 Ycenter -(값의 차이가 아닌 합계로 남겨 둡니다). 결과 모양의 맨 아래에있는 점에서 시작됩니다.) 나는 트리거에 관해서는 영리한 사람이 아니므로 소금 한 알을 가져 가십시오. 그러나 이것은 내가 적어도 원하는 것을 달성했습니다.
Joseph Marikle 2015-10-22

34
//poly [x,y, x,y, x,y.....];
var poly=[ 5,5, 100,50, 50,100, 10,90 ];
var canvas=document.getElementById("canvas")
var ctx = canvas.getContext('2d');
ctx.fillStyle = '#f00';

ctx.beginPath();
ctx.moveTo(poly[0], poly[1]);
for( item=2 ; item < poly.length-1 ; item+=2 ){ctx.lineTo( poly[item] , poly[item+1] )}

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

이것이 제가 자바 스크립트 바닐라 for방법을 근본적으로 이해할 수 있기를 바라는 이유 입니다. 한 줄의 코드는 일을 너무 단순화했습니다. 나는 일반적으로 jQuery를 사용 .each()하지만 응용 프로그램은 훨씬 덜 다재다능합니다.
Alexander Dixon

7
@AlexanderDixon 위의 자바 스크립트는 좋은 예가 아닙니다. 모든 변수는 var, 위의 코드 item에서 전역 네임 스페이스를 오염시킵니다. 모든 것이 한 줄에 있으므로 가독성이 떨어집니다. 가독성에 신경 쓰지 않는다면 중괄호를 제거하는 것이 좋습니다.
AnnanFay

@canvastag 멋진 작업 동적 작업입니다. 이 대답은 나를 위해 받아 들여진 대답보다 낫습니다. "Query .each ()"를 이해하지 못합니다 ... 이것은 메모리를 차지하는 마술 함수입니다. 또한 글로벌 네임 스페이스의 경우;) 재미 있습니다. 원하는 경우 클래스처럼 만드는 예제입니다.
Nikola Lukic

9
//create and fill polygon
CanvasRenderingContext2D.prototype.fillPolygon = function (pointsArray, fillColor,     strokeColor) {
    if (pointsArray.length <= 0) return;
    this.moveTo(pointsArray[0][0], pointsArray[0][1]);
    for (var i = 0; i < pointsArray.length; i++) {
        this.lineTo(pointsArray[i][0], pointsArray[i][1]);
    }
    if (strokeColor != null && strokeColor != undefined)
        this.strokeStyle = strokeColor;

    if (fillColor != null && fillColor != undefined) {
        this.fillStyle = fillColor;
        this.fill();
    }
}
//And you can use this method as 
var polygonPoints = [[10,100],[20,75],[50,100],[100,100],[10,100]];
context.fillPolygon(polygonPoints, '#F00','#000');

흥미 롭군요 ... 사실 첫 번째 요점에 대해 moveTo와 lineTo를합니다 ...하지만 이제 생각해 보면 ... 누가 신경 쓰나요?
James Newton

3

다음은 시계 방향 / 반 시계 방향 그리기를 지원하는 기능으로 0이 아닌 권선 규칙으로 채우기를 제어합니다.

작동 방식 등에 대한 전체 기사가 있습니다.

// Defines a path for any regular polygon with the specified number of sides and radius, 
// centered on the provide x and y coordinates.
// optional parameters: startAngle and anticlockwise

function polygon(ctx, x, y, radius, sides, startAngle, anticlockwise) {
  if (sides < 3) return;
  var a = (Math.PI * 2)/sides;
  a = anticlockwise?-a:a;
  ctx.save();
  ctx.translate(x,y);
  ctx.rotate(startAngle);
  ctx.moveTo(radius,0);
  for (var i = 1; i < sides; i++) {
    ctx.lineTo(radius*Math.cos(a*i),radius*Math.sin(a*i));
  }
  ctx.closePath();
  ctx.restore();
}

// Example using the function.
// Define a path in the shape of a pentagon and then fill and stroke it.
context.beginPath();
polygon(context,125,125,100,5,-Math.PI/2);
context.fillStyle="rgba(227,11,93,0.75)";
context.fill();
context.stroke();

그 기사는 "가장자리가 적은 원 그리기"라고 말하기에는 다소 길다. cos와 sin을 너무 많이 호출하는 것을 피하기 위해 결과를 캐시하고 싶을 수도 있습니다 (이미 그렇게하고 있다면 저는 JavaScript 프로그래머가 아닙니다).
QuantumKarl

1

다음과 같은 lineTo () 메서드를 사용할 수 있습니다. var objctx = canvas.getContext ( '2d');

        objctx.beginPath();
        objctx.moveTo(75, 50);
        objctx.lineTo(175, 50);
        objctx.lineTo(200, 75);
        objctx.lineTo(175, 100);
        objctx.lineTo(75, 100);
        objctx.lineTo(50, 75);
        objctx.closePath();
        objctx.fillStyle = "rgb(200,0,0)";
        objctx.fill();

다각형을 채우지 않으려면 fill () 대신 stroke () 메서드를 사용하십시오.

다음을 확인할 수도 있습니다. http://www.authorcode.com/draw-and-fill-a-polygon-and-triangle-in-html5/

감사


1

@canvastag 외에도 더 간결하다고 생각 하는 while루프를 사용하십시오 shift.

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

var poly = [5, 5, 100, 50, 50, 100, 10, 90];

// copy array
var shape = poly.slice(0);

ctx.fillStyle = '#f00'
ctx.beginPath();
ctx.moveTo(shape.shift(), shape.shift());
while(shape.length) {
  ctx.lineTo(shape.shift(), shape.shift());
}
ctx.closePath();
ctx.fill();

0

루프없이 간단한 육각형을 만들려면 beginPath () 함수를 사용하십시오. canvas.getContext ( '2d') 가 작동하지 않으면 ctx 와 같은지 확인하십시오 .

또한 필요한 경우 개체의 크기를 조정하는 데 사용할 수있는 시간이라는 변수를 추가하고 싶습니다.

     // Times Variable 

     var times = 1;

    // Create a shape

    ctx.beginPath();
    ctx.moveTo(99*times, 0*times);
    ctx.lineTo(99*times, 0*times);
    ctx.lineTo(198*times, 50*times);
    ctx.lineTo(198*times, 148*times);
    ctx.lineTo(99*times, 198*times);
    ctx.lineTo(99*times, 198*times);
    ctx.lineTo(1*times, 148*times);
    ctx.lineTo(1*times,57*times);
    ctx.closePath();
    ctx.clip();
    ctx.stroke();

0

정다각형을 찾는 사람들 :

function regPolyPath(r,p,ctx){ //Radius, #points, context
  //Azurethi was here!
  ctx.moveTo(r,0);
  for(i=0; i<p+1; i++){
    ctx.rotate(2*Math.PI/p);
    ctx.lineTo(r,0);
  }
  ctx.rotate(-2*Math.PI/p);
}

사용하다:

//Get canvas Context
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");

ctx.translate(60,60);    //Moves the origin to what is currently 60,60
//ctx.rotate(Rotation);  //Use this if you want the whole polygon rotated
regPolyPath(40,6,ctx);   //Hexagon with radius 40
//ctx.rotate(-Rotation); //remember to 'un-rotate' (or save and restore)
ctx.stroke();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.