এইচটিএমএল 5 ক্যানভাসে বহুভুজগুলি কীভাবে আঁকবেন?


95

ক্যানভাসে বহুভুজগুলি কীভাবে আঁকতে হবে তা আমার জানতে হবে। JQuery বা এর মতো কিছু ব্যবহার না করে।


10
এটি মনে রাখা ভাল যে তৃতীয় পক্ষের লাইব্রেরি ছাড়া যা কিছু করা যায়, সাধারণত তা করা উচিত।
রডরিগো

উত্তর:


166

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

100
@ জিও বোর্জে: এএফাইক, জেএসফিডাল ক্যানভাস সম্পর্কে চিন্তা করে না, এটি আপনার ব্রাউজার। জেএসফিডেল আপনাকে কেবল আপনার এইচটিএমএল / সিএসএস / জেএস ফিরিয়ে দেয়।
মিউ খুব ছোট

4
দুর্দান্ত সমাধান। খুব ঝরঝরে কোড। আপনাকে @ ফিহাগ ধন্যবাদ এমন কিছু যা আমি বুঝতে পারি!
বাইটিজ

4
আপনি সিটিএক্স দিয়ে সি 2 প্রতিস্থাপন করতে পারেন? আমি মনে করি এটি ক্যানভাস প্রসঙ্গে আরও সাধারণ ব্যবহার। উপায় দ্বারা দুর্দান্ত উত্তর
gididaf

@ ব্যবহারকারী 1893354 বিজ্ঞপ্তির জন্য আপনাকে অনেক ধন্যবাদ। প্রকৃতপক্ষে, সেখানে jsfiddle নিয়ে কোনও সমস্যা আছে বলে মনে হচ্ছে - ত্রুটি বার্তাটি সম্পূর্ণ ক্যানভাসের সাথে সম্পর্কিত নয়। খুব সাধারণ লাইভ ডেমো সাইট দিয়ে প্রতিস্থাপন করা হয়েছে।
ফিলাগ

36

http : //www.sज्ञानprimer.com/drawing-regular-polygons- জাভাস্ক্রিপ্ট- ক্যানভাস থেকে :

নিম্নলিখিত কোডটি একটি ষড়ভুজ আঁকবে। বিভিন্ন নিয়মিত বহুভুজ তৈরি করতে পার্শ্বের সংখ্যা পরিবর্তন করুন।

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>


4
এটি দুর্দান্ত, খুব মার্জিত ছিল, এছাড়াও, যদি আপনি যুক্ত করেন: cxt.save(); cxt.fillStyle = "#FF000"; cxt.fill(); cxt.restore(); আপনি আকৃতিটি পূরণ করতে পারেন।
সামুয়েলকোব

এটি দুর্দান্ত - আমি এটি নিয়ে বসে আছি, তবে কীভাবে আমি নির্বাচিত বহুভুজটি ঘুরতে পারি - কোনও ধারণা নেই?
eskimomatt

4
আপনি যা চান তা পাওয়ার কয়েকটি উপায় রয়েছে। একটি বিকল্প হ'ল ক্যানভাসের কিছু অংশ ঘোরানোর জন্য cxt.rotate () পদ্ধতিটি [cxt.save () এবং cxt.restore ()] সহ ব্যবহার করুন। বিকল্পভাবে, কোস এবং পাপ ফাংশনগুলির জন্য একটি সামঞ্জস্যপূর্ণ মান যুক্ত করাও কাজ করবে। একটি বিক্ষোভের জন্য এই jsfiddle দেখুন: jsfiddle.net/kwyhn3ba
অ্যান্ড্রু

তার জন্য ধন্যবাদ - আপনি সরবরাহিত বিজ্ঞান প্রাইমার লিঙ্কটিতে যুক্তি দিয়ে আমি একই সমাধানটি পেয়েছি। var angle = i * 2 * Math.PI / shape.currentSides + rotation
কোস

যদি (আমার ক্ষেত্রে হিসাবে) আপনি শুধু চাই বরং মাঝখানের ডানদিকের চেয়ে বহুভুজ মাঝখানে শীর্ষ হতে আদ্যস্থল, টুসকি sinএবং cosকল ও পরিবর্তন Ycenter +করার Ycenter -(উভয় জায়গা মূল্যবোধের পার্থক্য বদলে একটি সমষ্টি হিসাবে এটা দিয়া ফলাফল ফলাফল আকারের নীচে একটি পয়েন্ট দিয়ে শুরু)। ট্রিগার করার সময় আমি কোনও চালাক মানুষ নই, সুতরাং নুনের দানা নিয়ে নিয়ে যাও; তবে এটি আমি যা চেয়েছিলাম তা অর্জন করেছে।
জোসেফ মেরিকলে

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()তবে এর অ্যাপ্লিকেশনটি অনেক কম বহুমুখী।
আলেকজান্ডার ডিকসন

8
@ আলেকজান্দার ডিকসন উপরের জাভাস্ক্রিপ্টটি খুব ভাল উদাহরণ নয়। সমস্ত ভেরিয়েবলের প্রয়োজন var, উপরের itemকোডটিতে বৈশ্বিক নেমস্পেস দূষণকারী। সবকিছু এক লাইনে রয়েছে, যা পাঠযোগ্যতা হ্রাস করে। আপনি যদি পঠনযোগ্যতার বিষয়ে চিন্তা না করেন তবে আপনি পাশাপাশি কোঁকড়ানো বন্ধনীগুলি মুছে ফেলতে পারেন।
আনানফায়

@ ক্যানভাসট্যাগ চমৎকার কাজ গতিশীল কাজ। এই উত্তরটি আমার কাছে গৃহীত উত্তর থেকে ভাল। আমি "ক্যোয়ারী .each ()" বুঝতে পারি না ... এটি এমন কিছু যাদু ফাংশন যা স্মৃতি গ্রহণ করে। এছাড়াও গ্লোবাল নেমস্পেসের জন্য;) মজার এই উদাহরণটি বুদ্ধিমানের মতো করুন যদি আপনি এটি চান want
নিকোলা লুকিক

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

আকর্ষণীয় ... আসলে প্রথম পয়েন্টটির জন্য একটি মুভিটো এবং একটি লাইন আছে ... তবে এখন আমি এটি সম্পর্কে চিন্তা করি ... কে যত্ন করে?
জেমস নিউটন

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

এই নিবন্ধটি "আপনারা কম প্রান্তের একটি বৃত্ত আঁকেন" বলার অপেক্ষা রাখে না। কোসকে কল করা এবং এত বেশি পাপ করা এড়াতে আপনি ফলাফলগুলি ক্যাশে করতে চাইতে পারেন (এটি ইতিমধ্যে যদি করা হয় তবে আমি ক্ষমা করুন, আমি জাভাস্ক্রিপ্ট প্রোগ্রামার নই)।
কোয়ান্টামকার্ল

1

আপনি লাইনটো () পদ্ধতিটি এর মতোই ব্যবহার করতে পারেন: 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();

যদি আপনি বহুভুজ পূরণ করতে না চান তবে পূরণের জায়গায় স্ট্রোক () পদ্ধতিটি ব্যবহার করুন ()

আপনি নিম্নলিখিতগুলিও পরীক্ষা করতে পারবেন: http://www.authorcode.com/draw-and-fill-a-polygon-and-triangle-in-html5/

ধন্যবাদ


1

@ ক্যানভাসট্যাগ ছাড়াও, 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

লুপের প্রয়োজন ছাড়াই একটি সাধারণ ষড়জাগুলি তৈরি করতে, কেবল সূচনাপথ () ফাংশনটি ব্যবহার করুন। নিশ্চিত করুন যে আপনার করুন canvas.getContext ( '2d') সমান CTX যদি না এটা কাজ করবে না।

আমি বার হিসাবে একটি পরিবর্তনশীল যুক্ত করতে চাই যা আমার প্রয়োজন হলে অবজেক্টটি স্কেল করতে ব্যবহার করতে পারি eachএটি প্রতিটি সংখ্যার পরিবর্তনের দরকার নেই।

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