캔버스에 다각형을 그리는 방법을 알아야합니다. jQuery 또는 이와 유사한 것을 사용하지 않고.
답변:
moveTo
및 lineTo
( 라이브 데모 )를 사용하여 경로를 만듭니다 .
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();
에서 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>
cxt.save();
cxt.fillStyle = "#FF000";
cxt.fill();
cxt.restore();
하면 모양을 채울 수 있습니다.
var angle = i * 2 * Math.PI / shape.currentSides + rotation
다시 COS와 나를 위해 일한 죄 값 ... 덕분에 추가
sin
및 cos
호출을 뒤집고 두 곳 모두에서 변경 Ycenter +
합니다 Ycenter -
(값의 차이가 아닌 합계로 남겨 둡니다). 결과 모양의 맨 아래에있는 점에서 시작됩니다.) 나는 트리거에 관해서는 영리한 사람이 아니므로 소금 한 알을 가져 가십시오. 그러나 이것은 내가 적어도 원하는 것을 달성했습니다.
//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()
하지만 응용 프로그램은 훨씬 덜 다재다능합니다.
var
, 위의 코드 item
에서 전역 네임 스페이스를 오염시킵니다. 모든 것이 한 줄에 있으므로 가독성이 떨어집니다. 가독성에 신경 쓰지 않는다면 중괄호를 제거하는 것이 좋습니다.
//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');
다음은 시계 방향 / 반 시계 방향 그리기를 지원하는 기능으로 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();
다음과 같은 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/
감사
@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();
루프없이 간단한 육각형을 만들려면 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();
정다각형을 찾는 사람들 :
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();