HTML5キャンバスにポリゴンを描画する方法は?


94

キャンバスにポリゴンを描画する方法を知る必要があります。jQueryなどを使用せずに。


10
サードパーティのライブラリなしでできることは何であれ、通常そうするべきであることを覚えておくことは良いことです。
ロドリゴ

回答:


164

moveToand 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();

100
@Gio Borje:AFAIK、jsFiddleはキャンバスを気にしません、それはあなたのブラウザです。jsFiddleはHTML / CSS / JSをユーザーにフィードバックするだけです。
muが短すぎる

2
優れたソリューション。とてもきちんとしたコード。@phihagに感謝します。私が理解できる何か!
bytise

1
あなたはc2をctxで置き換えることができますか?キャンバスコンテキストのより一般的な使用法だと思います。ちなみに素晴らしい答え
gididaf

@ user1893354お知らせありがとうございます。実際、jsfiddleに問題があるようです。エラーメッセージはキャンバスとはまったく関係ありません。非常にシンプルなライブデモサイトに置き換えられました。
phihag 2018

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();

これが、JavaScriptのバニラforメソッドを根本的に理解できればと思います。この1行のコードで、物事が大幅に簡略化されました。私は通常jQueryを使用しますが、その.each()アプリケーションは汎用性がはるかに低くなります。
Alexander Dixon

7
@AlexanderDixon上記のJavaScriptは本当に良い例ではありません。上記のコードでは、すべての変数にが必要ですがvaritemグローバルネームスペースを汚染しています。すべてが1行になっているため、読みやすさが低下します。読みやすさを気にしない場合は、中括弧を削除することもできます。
AnnanFay 2018

@canvastag素晴らしい仕事のダイナミックな仕事。この答えは私にとって受け入れられた答えよりも優れています。"Query .each()"がわかりません...これは、メモリを消費する魔法の関数です。また、グローバル名前空間;)おもしろいのは、これが単なる例であり、必要に応じてクラスのようにすることです。
Nikola Lukic

33

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 14

これは素晴らしいです-私はそれで遊んでいましたが、選択したポリゴンをどのように回転させるのかわかりません-アイデアはありますか?
エスキモーマット2015年

1
欲しいものを手に入れるにはいくつかの方法があります。1つのオプションは、組み込みのcxt.rotate()メソッドを[cxt.save()およびcxt.restore()とともに]使用して、キャンバスの一部を回転させることです。または、cos関数とsin関数に一貫した値を追加することもできます。デモンストレーションについては、このjsfiddleを参照してください。jsfiddle.net/ kwyhn3ba
Andrew Staroscik

そのおかげで-あなたが提供した科学入門リンクのロジックを読んだ後、私は同じ解決策に出くわしました。var angle = i * 2 * Math.PI / shape.currentSides + rotationcosに追加され、罪の値は私のために働きました...再びありがとう
eskimomatt

(私の場合のように)開始点を右中央ではなく多角形の中央上部にしたい場合は、sinとを反転させて両方の場所にcos変更Ycenter +Ycenter -ます(値の差ではなく合計として残します)結果の形状の下部にある点から始まります)。引き金に関しては私は賢い人ではないので、一粒の塩を飲んでください。しかし、これは少なくとも私が欲しかったものを達成しました。
ジョセフマリクル、2015年

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が最初のポイントで行われます...しかし、私がそれについて考えたところで...誰が気にしていますか?
ジェームズニュートン

3

以下は、時計回り/反時計回りの描画をサポートする関数であり、非ゼロのワインディングルールで塗りつぶしを制御します。

これがどのように機能するかについての完全な記事などがあります。

// 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 2015

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という変数を追加します。これにより、各数値を変更する必要がなくなります。

     // 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.