Accueil > > > DESSINER DES CERCLES/DISQUES/LIGNES EN JAVASCRIPT
DESSINER DES CERCLES/DISQUES/LIGNES EN JAVASCRIPT
Information sur la source
Description
Cette source permet de dessiner des cercles, des disques et des lignes en javascript sans utiliser des outils tels que SVG ou Canvas, cela permet d'être utilisable sous la plupart des navigateurs, mais il n'y a pas vraiment de lissage et c'est un peu lent. Astuces : Pour faire un cercle lissé et flou mettez par exemple ceci comme paramètres : - Rayon : 150 - Epaisseur du cercle : 50 - Opacité du cercle : très basse ( entre 1 et 20 ) Pour faire une ligne lissée : - Epaisseur de la ligne : plus grande que 3 de préférence - Opacité de la ligne: faible ( entre 1 et 20 ) D'autres possibilités existent, il suffit de tester. Et n'hésitez pas à me dire si vous avez des bugs ! :)
Source
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
- <head>
- <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
- <script type="text/javascript">
- <!--
- function drawCircle(a, b, r, w, c, o) {
- if (document.getElementById('full').checked) {
- var h = 1;
- }
- else {
- var h = w;
- }
- var y = 0;
- for (x = 0; x <= Math.round(r / Math.sqrt(2)); x++) {
- y = Math.sqrt(Math.pow(r, 2) - (Math.pow(x, 2)));
- if (!document.getElementById('full').checked) {
- setPx(x + a, y + b, w, h, c, o);
- setPx(a - x, y + b, w, h, c, o);
- setPx(a - x, b - y, w, h, c, o);
- setPx(x + a, b - y, w, h, c, o);
- setPx(y + a, b - x, w, h, c, o);
- setPx(a - y, b - x, w, h, c, o);
- setPx(y + a, x + b, w, h, c, o);
- setPx(a - y, x + b, w, h, c, o);
- }
- else {
- setPx(a - x, y + b, 2 * x, h, c, o);
- setPx(a - x, b - y, 2 * x, h, c, o);
- setPx(a - y, b - x, 2 * y, h, c, o);
- setPx(a - y, x + b, 2 * y, h, c, o);
- }
- }
- }
-
- function drawLine(x1, y1, x2, y2, w, c, o) {
- var y = x = 0;
- var signX = (x1 - x2) / Math.abs(x1 - x2) * -1;
- var signY = (y1 - y2) / Math.abs(y1 - y2) * -1;
- if (x2 == x1) {
- setPx(Math.min(x1, x2), Math.min(y1, y2), w, Math.abs(y2 - y1), c, o);
- } else if (y1 == y2) {
- setPx(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), w, c, o);
- } else {
- if (Math.abs((y2 - y1) / (x2 - x1)) <= 1) {
- while (x <= Math.abs(x2 - x1)) {
- y = (y2 - y1) / Math.abs(x2 - x1) * x;
- setPx(signX * x + x1, y + y1, w, w, c, o);
- x++;
- }
- } else {
- while (y <= Math.abs(y2 - y1)) {
- x = (x2 - x1) / Math.abs(y2 - y1) * y;
- setPx(x + x1, signY * y + y1, w, w, c, o);
- y++;
- }
- }
- }
- }
-
- function setPx(x, y, w, h, c, o) {
- var px = document.createElement('div');
- px.id = 'px';
- px.style.cssText = 'position:absolute; top:' + y + 'px; left:' + x + 'px; background-color:' + c + '; width:' + w + 'px; height:' + h + 'px; opacity:' + o / 100 + '; filter:alpha(opacity=' + o + ');';
- document.body.appendChild(px);
- }
-
- function clearPx() {
- while (document.getElementById('px')) {
- document.body.removeChild(document.getElementById('px'));
- }
- }
- // -->
- </script>
- <style type="text/css">
- body {
- font-family:verdana, arial;
- font-size:11px;
- color:#333333;
- cursor:default;
- margin:0px;
- }
-
- p {
- margin:0px;
- font-weight:normal;
- }
-
- form {
- margin:0px;
- }
-
- #main {
- border:solid 5px #CCCCCC;
- background-color:#F0F0F0;
- text-align:center;
- padding:5px;
- width:500px;
- margin:5px auto 5px auto;
- }
- </style>
- <title>Dessiner en Javascript</title>
- </head>
- <body>
- <div id="main">
- <form method="post" action="javascript:;" style="float:left;">
- <p>
- <span style="font-weight:bold">Cercle</span><br/><br/>
- Abcisse du centre du cercle<br/>
- <input type="text" id="x" value="100"/><br/>
- Ordonnée du centre du cercle<br/>
- <input type="text" id="y" value="100"/><br/>
- Rayon du cercle<br/>
- <input type="text" id="r" value="50"/><br/>
- Epaisseur du cercle<br/>
- <input type="text" id="w" value="1"/><br/>
- Couleur du cercle<br/>
- <input type="text" id="c" value="red"/><br/>
- Opacité du cercle<br/>
- <input type="text" id="o" value="100"/><br/><br/>
- <input type="checkbox" id="full"/><label for="full"> Dessiner plein (disque)</label><br/><br/>
- <input type="submit" value="Afficher"
- onclick="drawCircle(parseInt(document.getElementById('x').value), parseInt(document.getElementById('y').value),
- parseInt(document.getElementById('r').value), parseInt(document.getElementById('w').value),
- document.getElementById('c').value, parseInt(document.getElementById('o').value));"/>
- </p>
- </form>
- <form method="post" action="javascript:;" style="float:right;">
- <p>
- <span style="font-weight:bold">Ligne</span><br/><br/>
- Abcisse du premier point<br/>
- <input type="text" id="x1" value="80"/><br/>
- Ordonnée du premier point<br/>
- <input type="text" id="y1" value="200"/><br/>
- Abcisse du second point<br/>
- <input type="text" id="x2" value="100"/><br/>
- Ordonnée du second point<br/>
- <input type="text" id="y2" value="100"/><br/>
- Epaisseur de la ligne<br/>
- <input type="text" id="w2" value="1"/><br/>
- Couleur de la ligne<br/>
- <input type="text" id="c2" value="red"/><br/>
- Opacité de la ligne<br/>
- <input type="text" id="o2" value="100"/><br/><br/>
- <input type="submit" value="Afficher"
- onclick="drawLine(parseInt(document.getElementById('x1').value), parseInt(document.getElementById('y1').value),
- parseInt(document.getElementById('x2').value), parseInt(document.getElementById('y2').value),
- parseInt(document.getElementById('w2').value), document.getElementById('c2').value, parseInt(document.getElementById('o2').value));"/>
- </p>
- </form>
- <div style="clear:both;"></div>
- <form method="post" action="javascript:;" style="border-top:solid 1px #CCCCCC; margin-top:5px; padding-top:5px;">
- <p>
- <input type="submit" value="Effacer" onclick="clearPx();"/>
- <input type="submit" value="Infos" onclick="alert('Attention, cette application Javascript est très lente sous IE (surtout la version 8).\n' +
- 'Elle a été testée avec succes sous:\n -Firefox 2\n -Firefox 3.0 RC1\n -IE7\n -IE8 Beta 1\n -Opera 9.26\n -Safari 3.1.1')"/>
- </p>
- </form>
- </div>
- </body>
- </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
<script type="text/javascript">
<!--
function drawCircle(a, b, r, w, c, o) {
if (document.getElementById('full').checked) {
var h = 1;
}
else {
var h = w;
}
var y = 0;
for (x = 0; x <= Math.round(r / Math.sqrt(2)); x++) {
y = Math.sqrt(Math.pow(r, 2) - (Math.pow(x, 2)));
if (!document.getElementById('full').checked) {
setPx(x + a, y + b, w, h, c, o);
setPx(a - x, y + b, w, h, c, o);
setPx(a - x, b - y, w, h, c, o);
setPx(x + a, b - y, w, h, c, o);
setPx(y + a, b - x, w, h, c, o);
setPx(a - y, b - x, w, h, c, o);
setPx(y + a, x + b, w, h, c, o);
setPx(a - y, x + b, w, h, c, o);
}
else {
setPx(a - x, y + b, 2 * x, h, c, o);
setPx(a - x, b - y, 2 * x, h, c, o);
setPx(a - y, b - x, 2 * y, h, c, o);
setPx(a - y, x + b, 2 * y, h, c, o);
}
}
}
function drawLine(x1, y1, x2, y2, w, c, o) {
var y = x = 0;
var signX = (x1 - x2) / Math.abs(x1 - x2) * -1;
var signY = (y1 - y2) / Math.abs(y1 - y2) * -1;
if (x2 == x1) {
setPx(Math.min(x1, x2), Math.min(y1, y2), w, Math.abs(y2 - y1), c, o);
} else if (y1 == y2) {
setPx(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), w, c, o);
} else {
if (Math.abs((y2 - y1) / (x2 - x1)) <= 1) {
while (x <= Math.abs(x2 - x1)) {
y = (y2 - y1) / Math.abs(x2 - x1) * x;
setPx(signX * x + x1, y + y1, w, w, c, o);
x++;
}
} else {
while (y <= Math.abs(y2 - y1)) {
x = (x2 - x1) / Math.abs(y2 - y1) * y;
setPx(x + x1, signY * y + y1, w, w, c, o);
y++;
}
}
}
}
function setPx(x, y, w, h, c, o) {
var px = document.createElement('div');
px.id = 'px';
px.style.cssText = 'position:absolute; top:' + y + 'px; left:' + x + 'px; background-color:' + c + '; width:' + w + 'px; height:' + h + 'px; opacity:' + o / 100 + '; filter:alpha(opacity=' + o + ');';
document.body.appendChild(px);
}
function clearPx() {
while (document.getElementById('px')) {
document.body.removeChild(document.getElementById('px'));
}
}
// -->
</script>
<style type="text/css">
body {
font-family:verdana, arial;
font-size:11px;
color:#333333;
cursor:default;
margin:0px;
}
p {
margin:0px;
font-weight:normal;
}
form {
margin:0px;
}
#main {
border:solid 5px #CCCCCC;
background-color:#F0F0F0;
text-align:center;
padding:5px;
width:500px;
margin:5px auto 5px auto;
}
</style>
<title>Dessiner en Javascript</title>
</head>
<body>
<div id="main">
<form method="post" action="javascript:;" style="float:left;">
<p>
<span style="font-weight:bold">Cercle</span><br/><br/>
Abcisse du centre du cercle<br/>
<input type="text" id="x" value="100"/><br/>
Ordonnée du centre du cercle<br/>
<input type="text" id="y" value="100"/><br/>
Rayon du cercle<br/>
<input type="text" id="r" value="50"/><br/>
Epaisseur du cercle<br/>
<input type="text" id="w" value="1"/><br/>
Couleur du cercle<br/>
<input type="text" id="c" value="red"/><br/>
Opacité du cercle<br/>
<input type="text" id="o" value="100"/><br/><br/>
<input type="checkbox" id="full"/><label for="full"> Dessiner plein (disque)</label><br/><br/>
<input type="submit" value="Afficher"
onclick="drawCircle(parseInt(document.getElementById('x').value), parseInt(document.getElementById('y').value),
parseInt(document.getElementById('r').value), parseInt(document.getElementById('w').value),
document.getElementById('c').value, parseInt(document.getElementById('o').value));"/>
</p>
</form>
<form method="post" action="javascript:;" style="float:right;">
<p>
<span style="font-weight:bold">Ligne</span><br/><br/>
Abcisse du premier point<br/>
<input type="text" id="x1" value="80"/><br/>
Ordonnée du premier point<br/>
<input type="text" id="y1" value="200"/><br/>
Abcisse du second point<br/>
<input type="text" id="x2" value="100"/><br/>
Ordonnée du second point<br/>
<input type="text" id="y2" value="100"/><br/>
Epaisseur de la ligne<br/>
<input type="text" id="w2" value="1"/><br/>
Couleur de la ligne<br/>
<input type="text" id="c2" value="red"/><br/>
Opacité de la ligne<br/>
<input type="text" id="o2" value="100"/><br/><br/>
<input type="submit" value="Afficher"
onclick="drawLine(parseInt(document.getElementById('x1').value), parseInt(document.getElementById('y1').value),
parseInt(document.getElementById('x2').value), parseInt(document.getElementById('y2').value),
parseInt(document.getElementById('w2').value), document.getElementById('c2').value, parseInt(document.getElementById('o2').value));"/>
</p>
</form>
<div style="clear:both;"></div>
<form method="post" action="javascript:;" style="border-top:solid 1px #CCCCCC; margin-top:5px; padding-top:5px;">
<p>
<input type="submit" value="Effacer" onclick="clearPx();"/>
<input type="submit" value="Infos" onclick="alert('Attention, cette application Javascript est très lente sous IE (surtout la version 8).\n' +
'Elle a été testée avec succes sous:\n -Firefox 2\n -Firefox 3.0 RC1\n -IE7\n -IE8 Beta 1\n -Opera 9.26\n -Safari 3.1.1')"/>
</p>
</form>
</div>
</body>
</html>
Conclusion
Ce code permet de faire quelques dessins mais est assez ( voire très ) lent sous IE, préférez donc un navigateur comme Opera, Safari ou Firefox pour le tester. (les plus rapides sont Opera et Safari pour ce code).
Historique
- 25 mai 2008 08:53:27 :
- Ajout d'un Zip.
- 25 mai 2008 11:34:20 :
- Ajout dune petite astuce dans la description du code...
Ajout d'une capture d'écran.
- 27 mai 2008 11:10:58 :
- Ajout de la fonction de dessin de lignes. Modification de la capture, du titre, de la source et des descriptions.
- 27 mai 2008 11:14:02 :
- Modification du titre, des descriptions, et de la source. Modification de la capture.
Ajout de la fonction de dessin de lignes.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Dessiner et redimensionner un cercle ou disque à la souris... :s [ par Tyra3l ]
Bonjour à tous, Tout d'abord joyeux noël :p Je bloque sur un problème en javascript : en effet je dois pouvoir créer un cercle de diamètre x (x étan
Agrandir et diminuer rayon cercle avec la souris [ par Tyra3l ]
Bonjour à tous, Tout d'abord joyeux noël :p Je bloque sur un problème en javascript : en effet je dois pouvoir créer un cercle de diamètre x (x étan
[RECRUTEMENT] OFLUXIA, jeu en ligne multijoueur de conquête spatiale [ par oilla ]
Bonjour, Je dirige la création d'un jeu en ligne et je recherche un programmeur JavaScript. J'ai pensé qu'il y a peut-être des personnes intéressé
Problème de script [ par pedrito57 ]
Bonjour, j'ai un petit problème avec mon script. Le début marche sans le php mais dès que j'y intègre la partie php, ca ne marche plus. Je débute, si
Merci pour votre aide... [ par 32dens ]
Bonjour, Dans la page index du site http://mcarmagnac.free.fr/index.html se trouve un script javascript (ligne 192) qui permet d'afficher le contenu
Comment inserer dynamiquement un champ input [ par aholigans ]
salut à vs ts, en faite j'ai le meme probleme que jarod1980, j'ai un tableau contenant 7 champs tewte (textfields), lorsque je clique sur un boutton u
Ligne d'un tableau cliquable [ par KasPe ]
Bonjour, Désolé si ma question n'est pas au bon endroit, mais comme j'ai l'intention de rajouter à ce code du javascript, je me suis dis ... Je cherc
Effacer une ligne dans fichier texte en php [ par michaelminelli1 ]
Bonjour, Ca fait deja un moment que je cherche sur le web comment supprimer une ligne dans un fichier texte, je vous explique plus en details : Ja'i
Tableau dynamique (nbr ligne fonction d'un nbr d'enregistrement dans une table) [ par zxr_stinger ]
Bonjour à tous Je voudrais créer un tableau dans lequel le nombre de ligne de celui-ci soit fonction d'une variable préalablement établie. Possible en
imprimer des lignes dans un tableau [ par oummm ]
salut, j'extrait d'une base de donnee Mysql des informations que je regroupe dans un tableau. chaque ligne de ce tableau representant 1 enregistrement
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|