2017-09-17 1 views
2

J'espère que vous allez tous bien!Utilisation de JavaScript Math. méthodes comme HTML Canvas .fillRect Coordonnées

J'ai passé toute la soirée à essayer de comprendre comment utiliser (Math.floor(Math.random()) comme coordonnées pour la méthode .fillRect utilisée sur l'élément de canevas HTML.

J'ai regardé autour de ce site et en ligne pour une réponse, mais rien n'a été suggéré jusqu'à présent. Mon approche actuelle est basée sur this Stack Overflow answer.

Je veux dessiner un rectangle 20 * 20px à un point aléatoire sur la toile chaque fois que je clique sur un bouton. J'ai tout fonctionnant excepté alimentant les nombres aléatoires que je reçois des méthodes Math dans les arguments de coordonnée .fillRect.

Ceci est mon code HTML et mon code JS:

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

 
$("#btn").click(function() { 
 

 
    var rectCoord = { 
 
    "x": (Math.floor(Math.random() * 699) + 1), //Canvas is 700px wide. 
 
    "y": (Math.floor(Math.random() * 599) + 1), //Canvas is 600px high. 
 
    }; 
 

 

 
    console.log(rectCoord.x, rectCoord.y) 
 
    //Test. Random X and Y points log in console correctly. 
 

 
    ctx.fillRect(rectCoord.x, rectCoord.y, 20, 20); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="container"> 
 

 
    <canvas id="canvas"></canvas> 
 
    <button id="btn">Click!</button> 
 

 
</div>

Le console.log était où je testais si:

1) Le "x" et "y" les points étaient randomisés à chaque clic, et

2) Les points de données rectCoord.x, rectCoord.y arrivaient correctement être utilisé dans une ligne de code suivante.

Les points randomisés se connectent bien à la console, et chaque fois que je mets juste des entiers pour les arguments de coordonnées dans fillRect il dessine un rectangle parfaitement. Je ne peux pas comprendre comment insérer les points randomisés comme arguments dans .fillRect. Pourquoi travaillent-ils en tant qu'arguments pour console.log et non pour .fillRect?

Merci beaucoup d'avance pour toutes les réponses, je suis assez nouveau pour le codage et je ne peux tout simplement pas envelopper ma tête autour de cela !! Toute aide est très appréciée!

+0

Avez-vous essayé de placer 'ctx.fillStyle = « black'' ou quelque chose comme ça? –

+0

Oui, cela ne fait pas de différence. 'fillStyle' est noir par défaut de toute façon, et quand je mets des nombres (par exemple 40, 500) pour les arguments de coordonnées, le code s'exécute comme il se doit. C'est pourquoi je pense que cela a quelque chose à voir avec moi en essayant d'utiliser une variable variable comme valeur de coordination. @PatrickRoberts – Pete

+0

Vous devriez utiliser 'ctx.fillRect ((Math.random() * ctx.canvas.width-20) | 0, (Math.random() * ctx.canvas.height -20) | 0, 20, 20); 'pour assurer un 20 par 20 rectangle ** Always ** apparaît sur la toile. – Blindman67

Répondre

1

vous devez mettre la taille de la toile (peut-être vous avez dans la feuille de style)

puis supprimez simplement l'ancienne position et le mettre à jour

var canvas = document.getElementById("canvas"); 
 
var ctx = canvas.getContext("2d"); 
 
//creates a function for the random value 
 
function rectCoord(){ 
 
    return { 
 
    "x": (Math.floor(Math.random()*699)+1), 
 
    "y": (Math.floor(Math.random()*599)+1) 
 
    } 
 
} 
 
//defines the initial values 
 
var x = 0,//rectCoord().x 
 
    y = 0;//rectCoord().y 
 
//then draw 
 
ctx.fillRect(x, y, 20, 20); 
 
$("#btn").click(function() { 
 
    //in each click delete the previous state 
 
    ctx.clearRect(x, y, 20, 20); 
 
    //renews values 
 
    x = rectCoord().x; 
 
    y = rectCoord().y; 
 
    //renews the position of the drawing 
 
    ctx.fillRect(x, y, 20, 20); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="container"> 
 
    <canvas id="canvas" width="700" height="600"></canvas> 
 
    <button id="btn">Click!</button> 
 
</div>

+0

La seule chose importante à prendre en compte est de définir la taille du canevas. Changer uniquement cela fait que les carrés dessinent toujours. Si vous cliquez sur le bouton dans la démo de la question assez de fois, un carré sera rendu, mais le risque est assez faible qu'il tombe dans les limites par défaut d'un canevas. –

+0

Aha! Merci beaucoup!! J'ai donc ajouté des attributs de largeur et de hauteur à la balise canvas, ce qui résout instantanément le problème. Cependant, j'avais déjà ces valeurs dans la feuille de style css. Quelle est la différence entre l'attribut en ligne et la déclaration dans une feuille de style externe? @PatrickRoberts – Pete

+0

La feuille de style CSS @Pete provoque l'étirement du "pixel" du canevas afin de s'adapter aux dimensions CSS à l'écran, tandis que les attributs contrôlent le nombre de pixels contenus dans les données d'image canevas. Ce comportement est dû à '' en utilisant [CSS 'object-fit: fill;' rule] (https://css-tricks.com/almanac/properties/o/object-fit/) par défaut. –

0

Le rectangle que vous dessinez est hors de la gamme de toile, définir la largeur et la hauteur à <canvas> tag:

<canvas id="canvas" width="700" height="600"></canvas> 

var canvas = document.getElementById("canvas"); 
 
var ctx = canvas.getContext("2d"); 
 
var width = canvas.width; 
 
var height = canvas.height; 
 

 
$("#btn").click(function() { 
 

 
    var rectCoord = { 
 
    "x": (Math.floor(Math.random() * width) + 1), 
 
    "y": (Math.floor(Math.random() * height) + 1) 
 
    }; 
 

 

 
    console.log(rectCoord.x, rectCoord.y) 
 
    //Test. Random X and Y points log in console correctly. 
 

 
    ctx.fillRect(rectCoord.x, rectCoord.y, 20, 20); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="container"> 
 

 
    <button id="btn">Click!</button> 
 
    <canvas id="canvas" width="700" height="600"></canvas> 
 

 
</div>