TRACER UNE LIGNE OU UN CERCLE AVEC ANTICRÈNELAGE

tmcuh Messages postés 458 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 18 avril 2009 - 22 juin 2004 à 10:34
rayver Messages postés 26 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 29 décembre 2009 - 30 janv. 2008 à 09:37
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/23878-tracer-une-ligne-ou-un-cercle-avec-anticrenelage

rayver Messages postés 26 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 29 décembre 2009
30 janv. 2008 à 09:37
Je peux ous mettre mon source pour vérification de mon topic
hobbyF1
rayver Messages postés 26 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 29 décembre 2009
30 janv. 2008 à 09:33
hi
Mon petit mot en passant car je fais du delphi, tout le monde n'est pas parfait....hi,hi

Ligne 290:
YY = sqr(Rayon*Rayon - XX*XX) ??? bizarre

Je ne connais pas VB mais SQR en pascal fais le carré et non la racine carrée.EN Pascal c'est SQRT qu'il faut mettre. (bizare aussi)

En plus les boucles 'FOR' avec du boolean, ne sont pas acceptées.
J'ai été obligé de faire des 'REPEAT'.....'UNTIL' pour que les conditions booleenes soit acceptées.

En plus en VB vous melangez les 'byte avec les single' dans les operations,Qui n'est pas accepté non plus.

Resultat: je fais bien des lignes et des cercles, mais sans anti aliasing.
A+++ les VB
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
9 févr. 2005 à 21:48
Encore merci pour toutes ces précisions...

Vlad2i : ok, maintenant je crois avoir vraiment tout compris...

XbY : Là je comprends mieux :-) Pour la 3D il faut considérer les objets au premier plan comme étant les plus précis et disparaissant au dessus(-1) de ce 1er plan. Le fichier, quant à lui, ne doit stocker que ce qui est important... Rien n'empêche d'utiliser des fonctions de flood 3D (entre autre)... Enfin, quand j'aurais le temps je pense faire une petite démo ici. Mais il est inévitable de passer par les "Wu" (ou du moins, une technique similaire).
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
9 févr. 2005 à 21:19
ScSami >
"PI=4*ATN(1)... en radians. Ca marche, c'est super. Mais bon, je serais d'accord avec ça si je le comprennais..."

tu comprend pas pourquoi ca fait Pi ???
ATN(1) est l'angle dont la tangeante 1 c a d 45°.Puisque le tour du cercle fait 2Pi radiand 360°, 4*45° = 180° = Pi radian. dc 4*ATN(1) = Pi.

Pr la 3D volumique tu veux dire coder tout les pixels dans ton fichier??? tu va avoir plusieur probleme... qd les objets proche de l'observateur auront une resolution trop faible et on vera les "pixels cubique" alors que ceux plus loin auront de l'information qu'on ne verra pas.
A moins que tu dessine en axonometries c a d sans point de fuite puisque les objet auront la meme taille qu'il soit loin ou proche. La il y a une technique tout bête avec des matrices c vraiment tailler pour être coder ^^
vlad2i Messages postés 285 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 13 février 2005
9 févr. 2005 à 19:10
ScSami> je doutes que ce soit le lieu le plus approprié à tes questions métaphyisiques...

Pi = 4atn(1) ...

Tu as aussi pi²/6 = 1/1² + 1/2² + 1/3² + 1/4² + 1/5² + 1/6² etc ...

Le problème se trouvera au niveau de la précision des chiffres que tu utilises

pi ... 3.14159265358979323846264338327950288 41971693993751058209749445923 ...


En fait, il n'existe pas d'expression finie de Pi, car ce nombre est transcendant irrationnel, et on n'a que des algèbres infinies pour ce type de nombre. Donc, il faut faire tourner un calcul, théoriquement à l'infini, pour avoir le resultat exact. N'ayant pas tout ce temps, on se contente de le faire tourner "un certain temps" ce qui te donne "un certain nombre de décimales"

Ex: tu intègres de infini- à infini+ la fonction e^(-x²)dx et tu obtiendras la racine de pi... Ou la fonction gamma(1/2) = racine de pi ... ou l'intégrale de racine de (1--x²) sur [0;1] donne pi/4

Une meilleure méthode consiste à calculer les arctangentes, qui sont faciles a développer

ex: atn(1) = 4 (atn(1/5) - 4atn(1/239))
ou atn(1) = 44atn(1/57)+7atn(1/239)-12atn(1/682)+24atn(1/12943)

Et comme tu as atn(1) = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 ...

Tu peux facilement développer...

Liens utiles :
http://jc.michel.free.fr/pi.php
http://ktd.club.fr/programmation/cpp-metaprog.php

PS. Pour bézier, c'est une interpolation pondérée du troisième degré. Si tu as l'equation de bézier en 2D, il suffit d'ajouter la troisième, Z, pour avoir le resultat escompté. Quant aux rendus volumiques, nul besoin des Wu Pixels...

Bonne chance

Vlad
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
9 févr. 2005 à 12:51
Ennixo, Sibi12 et Vlad2i, VRAIMENT MERCI POUR TOUS CES PRECIEUX DÉTAILS...

Vous êtes des chefs (en math comme en prog). Heureusement qu'il y a des gens comme vous sur cette povre terre... parce qu'avec des mecs comme moi, on irrait pas loin ;-)

Maintenant je vais peut-être enfin trouver le sommeil (depuis 10 ans sans dormir, ça fera du bien une petite nuit de sommeil ;-).

Cependant, il me reste encore une ou deux petites questions (noooonnnn... ben si :-D).

PI=4*ATN(1)... en radians. Ca marche, c'est super. Mais bon, je serais d'accord avec ça si je le comprennais... Parce que là, ma question est : COMMENT CALCULER [avec explications parce que je comprends vite si on m'explique longtemps...] L'ARC-TANGENTE EN RADIAN ???

Sinon, j'ai pas vraiment compris ce 1/SRQ(2) mais je vais faire travailler mes cellules grises (ou noir de nécrose depuis le temps...).

Quant à "i=k/R2", mouai, je crois avoir pigé ça nickel ;-)

Non, plus sérieusement :
Ma question porte sur les Bézier... Je ne comprends pas vraiment l'équation (si quelqu'un pouvait m'aider).
Mais ce que j'aimerais le plus au monde (a part moi même et vous... dans le futur...) serait d'obtenir des courbes de Bézier en 3D... Et comme je comprends pas cette formule magique, ben j'aimerais que vous m'aidiez (ou la fassiez [c'est mieux ça comme solution...]).
Bien sûr, il faut considérer la 3ème dim en pixels ("Pixels 3D")...

Ce qui m'amène a un autre petit message :
J'en ai un peu marre de la 3D vectorielle et j'aimerais obtenir de la 3D Volumique, c.a.d. oú l'on considère que le volume de la scène est constitué de pixels. Ceci n'étant faisable qu'avec des Wu pixels et ne les ayant découverts que récemment, il serait bien de s'y mettre. Bien sur, il faudrait utiliser des fichiers compressés (en RLE p.ex.) laissant l'air vide.

Si ça vous interresse...

Et encore un grand merci du fond du coeur pour toutes vos remarques hyper constructives...
ennixo Messages postés 224 Date d'inscription samedi 25 janvier 2003 Statut Membre Dernière intervention 17 juin 2006
8 févr. 2005 à 22:57
un dernier détail...

si vous regardez bien les cercles vous pourrez voir qu'il y a sur certains cercles 4 points plus visibles ou 4 points moins visibles... c'est un des défauts de mon algo que je ne suis pas arrivé à améliorer.
de plus si vous tracez une ligne parfaitement verticale il y aura quand meme un décalage de 1 pixel entre le haut et le bas.

sinon, pour ceux qui ne l'ont pas encore vu j'ai déposé une source qui utilise ces bases d'algo sauf que ça calcule dans des tableaux pour gagner en perf (et heureusement !) : http://www.vbfrance.com/codes/ENNIXO_FILS_-LOGICIEL_DE_TRACES_DE_LIGNES_ARTISTIQUES-/27250.aspx
je dis pas ça pour faire ma pub, je dis ça parce que ça va un peu plus loin car je trace des courbes de bézier =)

et si vous êtes interessés par ça je peux mettre la nouvelle source, encore buggée, mais qui permet de faire ça : http://ennixo.free.fr/fils/vid/2.html
vlad2i Messages postés 285 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 13 février 2005
8 févr. 2005 à 22:16
ScSami> Coucou !
C'est moi le codeur qui ait lancé le code des Wu Pixels... pour celui que ca interesse.

Par ailleurs je compte bien balancer un joli code d'ici mi-fevrier qui les utilise (et l'effet sera, je l'espère, saisissant)

Si tu veux savoir qui est le Professeur Wu, je t'informe que tu ne pourra le rencontrer, pour cause de décès dans les années 80. C'est lui qui a proposé une méthode efficace (les Wu-...) pour dessiner des objets anticrénelés sur un écran. Le principe, cependant, n'est pas le meme que celui ci...

Je ne fais qu'informer :)

Pour le cercle, il y a d'autres méthodes, pas forcément "meilleures" mais ca dépend de tes critères

X^2 + Y^2 = R^2

d"où on sort notr

Y^2 = R^2-X^2

Y1 = racine(R*R-X*X)
Y2 = -Y1

Tu place les deux points Y1 et Y2 pour chaque valeur de X entre -R et +R et tu as un cercle... ca n'est pas très très efficace, mais ca marche plus rapidement sur les vielles machines.

Quant à pi, tu as, je crois, des millions de façons de le calculer... ne serait-ce que le simplissime Pi = 4* atn(1) jusqu'aux très complexes intégrales et sommes infinies qui permettent de trouver le xième nombre binaire...Mais si tu veux il doit bien me rester des vieux codes en basic qui calculent 10000 décimales par minute.

Sinus = Pli en latin, donné je crois par monsieur René Descartes au rapport Y/Longueur...

Ensuite, hehe, Pythagore : il n'y a besoin d'aucune preuve pour proposer un théorème. Mais celui ci s'est avéré exact jusqu'ici (dans les géométries euclidiènnes, du moins) en 1D, 2D, 3D et 4D.

Les grades maintenant, et je finirais sur ca : 400 grades 360 ° 2*pi radians (tient, une autre méthode pour pi : tu mesures un arc de 180° d'un cercle de rayon 1 :) ) je crois que ca n'a effectivement plus tellement d'utilité, seulement dans les coordonnées militaires, car on peut plus facilement décomposer des grades :

400->200->100->50->25->12grd5"...
360->180->90>45->22°5"...

Enfin ca reste discutable. Sinon les méridiens me semblent une approche possible aussi.

Pour simplifier la réponse de l'auteur :

Diagonale d'un carré de 1×1 = sqr(2)
Comme il veut que l'intensité décroisse (rappel : i = k/r²) si le point s'éloigne, il prend l'inverse : 1/sqr(2)

Je suis clair hehe (enfin plus obscur c'est dur)
Au moins j'ai essayé de répondre à tout hehe

Vlad
ennixo Messages postés 224 Date d'inscription samedi 25 janvier 2003 Statut Membre Dernière intervention 17 juin 2006
8 févr. 2005 à 21:39
merci pour ton commentaire ScSami ça fait plaisir =)

je ne peux répondre qu'à une de tes question : celle du 1 / Sqr(2)
en fait c'est très simple, si tu regarde mon algo je calcule une petite portion du cercle (1/8e du cercle pour etre exact) que je trace par symétrie pour former le cercle complet.
de plus je calcule le y en fonction du x.
le rayon * 1 / Sqr(2) c'est la valeur ou x y et ou donc il faut s'arreter pour éviter ce qu'on appelle l'overstrike, c'est le fait de tracer plusieurs fois des pixels au même endroit)

j'ai pas inventé tout ça je me suis inspiré d'un bouquin pas mal (et pas cher comparé à d'autres !!) : Computer Graphics de chez Schaum's (auteurs: Zhigang Xiang et Roy Plastock)
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
8 févr. 2005 à 02:37
Pour le calcul de Pi : http://www.google.fr/search?q=calcul+de+pi&sourceid=mozilla&start=0&start=0&ie=utf-8&oe=utf-8

Pour pythagore si je me souviens bien de mon cours de 3eme...ca remonte ct a partir de thales qu'il a elaborer sa formule...maintenant pkoi il s'est lever un matin en se disant aujourd'hui je calcule l'hypothenuse de ce triangle rectangle... je n'en sais rien... tout ce que je sais c'est que thales lui voulais mesurer la taille des pyramides a partir de leur ombre

les sinus cosinus et tout ca decoule un peu de la mesure des angles je pense pas qu'il y ai eu vmt un inventeur... c comme la mesure d'une longueur

Pour le grade une tite recherche sur google et : http://histoiredechiffres.neuf.fr/histoire%20notations/page/unites%20d'angles.htm

"Comme le méridien terrestre mesure environ 10 000 km , on peut aisément calculer les trajets le long des méridiens : un radian correspond à une distance de 100 km sur le méridien.

Seuls les géodésiens continuent d'utiliser le grade couramment . "
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
8 févr. 2005 à 00:23
Franchement, BRAVO, 9/10.

9 parce qu'a mon gout, pas assez commenté pi mettre une form, ça coute rien...

Il faut quand même le dire : C'EST LA BASE DE TOUT PROG D'INFOGRAPHIE PERFORMANT !!! Je dirais même que C'EST LA BASE DE L'INFOGRAPHIE...

Note : J'ai lu sur VB-France qu'un codeur appelais ça (je parle ici du principe) un "Wu pixel"... Si quelqu'un a plus d'infos sur ce mysterieux "Wu" je suis prenneur!

Et puis pour le Cercle... DU GRAND ART (c.f. ma povre source en comparaison...). FRANCHEMENT, MERCI. Je crois que c'est la méthode de traçage des cercles la plus efficace et la plus rapide (si quelqu'un a à redire, je serais curieux de voir ce qu'il pourrait bien proposer d'encore mieux... [je déconne, c'est pas possible de faire mieux ;-) ]). D'ailleurs, même le VB fait des cercles moins jolis.

Par contre, n'ayant pas un super niveau [3ème de college] en trigo (alors que ça me passionne), je m'intéroge toujour sur ce "Rayon * 1/Sqr(2)"... J'ai beau chercher, je comprends pas.

Et j'en profite d'ailleurs pour passer un petit message perso :

SI QUELQU'UN SAIT COMMENT PI EST CALCULÉ, JE VOUS SUPPLIE A QUATRE GENOUX, DITES-LE MOI !!!!!!
Je peux plus en dormir de la nuit... surtout quand aucun prof de math que j'ai pu rencontré (et dieu seul sait combien j'en ai eu...) n'a été capable de me répondre...

Je cherche également à savoir, si quelqu'un le sait (!), comment mon très cher Pythagore a fait pour nous pondre sa théorie... Avec quels outils mathématiques, par quel raisonnement, ..., ..., ... Et également, QUI A "découvert" les sinus, cosinus, ... Pi dans la foullée, A QUOI PEUVENT BIEN SERVIR LES GRADES ???

@++
ennixo Messages postés 224 Date d'inscription samedi 25 janvier 2003 Statut Membre Dernière intervention 17 juin 2006
17 janv. 2005 à 15:32
en fait si cette source avait été en .Net elle n'aurait pas utilisé les API GetPixel et SetPixel mais les objets déjà présents dans le framework, objets que je ne connais pas car je ne m'y suis jamais interessé...
ero_senin Messages postés 39 Date d'inscription mercredi 1 décembre 2004 Statut Membre Dernière intervention 17 janvier 2005
17 janv. 2005 à 15:10
merci ennixo
tu va me prendre pour un gayzor mais le parametre : DeviceContext sert à quoi je doit mettre quoi quand j'apelle DrawLineAA par exemple...
désolé pour mes question à la con de débutant
ennixo Messages postés 224 Date d'inscription samedi 25 janvier 2003 Statut Membre Dernière intervention 17 juin 2006
17 janv. 2005 à 14:44
en .Net c'est une méthode statique de la classe Math

il faut faire Math.Abs
ero_senin Messages postés 39 Date d'inscription mercredi 1 décembre 2004 Statut Membre Dernière intervention 17 janvier 2005
17 janv. 2005 à 14:19
ta source à l'air pas mal du tout en plus ça correcpond à ce que je veux faire mais j'ai un petit souci j'utilise vb.net et il me marque : le nom 'Abs' n'est pas déclaré .... quelqu'un pourai m'aider.... :(
cs_RDX Messages postés 117 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 27 août 2005
20 nov. 2004 à 20:52
La seule chose qui manque (pour moi), c'est le parametre 'épaisseur de la ligne'. Sinon je trouve ca vraiment terrible.

Incontournable même pour ceux qui aiment les interfaces travaillées.

bravo.
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
2 nov. 2004 à 17:18
On a qu'à ne pas tenir compte de la couleur du pixel a l'interieur du cercle et faire comme si il avait la couleur par laquelle on veux remplir le cercle...

sinon Pourquoi pas remplir le cercle avant de le tracer..enfin c'est pas très clair dit comme ca mais on connais la zone interieur au cercle on met dc ces point la dans le couleur voulue et on trace ensuite notre cercle avec l'anti crenelage...
ennixo Messages postés 224 Date d'inscription samedi 25 janvier 2003 Statut Membre Dernière intervention 17 juin 2006
2 nov. 2004 à 17:07
oui c'est possible mais soit il faut modifier l'algo (je n'ai encore jamais réfléchis comment) soit il faut tracer le cercle un peu différement (sans anticrènelage intérieur) puis faire un floodfill.

je vais y réfléchir :)
TouTenN Messages postés 11 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 juillet 2005
2 nov. 2004 à 11:55
Bonjour

Code très utile pour moi qui crée des cercles très petits. Mais y aurait-il une possibilité pour pouvoir les remplir d'une couleur???

merci

GuY
ennixo Messages postés 224 Date d'inscription samedi 25 janvier 2003 Statut Membre Dernière intervention 17 juin 2006
24 juin 2004 à 19:07
@ sibi12 :
oui c'est vrai, j'utilise d'ailleurs beaucoup cette API mais étant donné la presque rapidité de traçage des lignes et cercles (comparé à une image entière à tracer) j'ai préféré utiliser SetPixel (et maintenant SetPixelV). Mais c'est vrai que Get/SetDIBits et Get/SetBitmapBits sont super rapides.


@ vlad2i :
1. Excellent je ne connaissais pas du tout !!
2. Oui c'est vrai c'est parce que j'ai prit les DrawAA respectifs que j'ai modifié pour les simplifier et j'ai oublié de les changer.
3. voir @ sibi12


jvé updater bientot...
vlad2i Messages postés 285 Date d'inscription mercredi 20 août 2003 Statut Membre Dernière intervention 13 février 2005
24 juin 2004 à 10:10
Salut !

Trois petites suggestions...

1. Utilise SetPixelV au lieu de SetPixel, tu gagnera 30% de vitesse
2. Je ne vois pas l'intéret de placer XX et YY en Double avant de faire un SetPixel, parceque de toute façon ca ne marche qu'avec les entiers
3. Concernant la gestion des couleurs (Les opérations de Shift à répétition) le conseil de sibi12 est à suivre : en utilisant le groupe GetBitmapBits/SetDeviceBitmapBits tu devrais pouvoir gagner à la fois en performance, puisque ce serait la carte graphique qui traiterait l'affichage, et aussi car tu aurais accès directement aux 3 composantes couleur

Voila !

Vlad :)
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
23 juin 2004 à 12:47
Salut

beau boulot...mais tu peux ameliorrer en utilisant les apis Get/SetDIBits au lieu Get/SetPixel niveau performance les differences peuvent être assez importante...

www.AllApi.net si tu vx connaitre l'utilisation de l'api.
ennixo Messages postés 224 Date d'inscription samedi 25 janvier 2003 Statut Membre Dernière intervention 17 juin 2006
23 juin 2004 à 12:02
merci :)
ça fait plaisir
tmcuh Messages postés 458 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 18 avril 2009
22 juin 2004 à 10:34
Joli boulot. 10/10 clap clap clap (applaudissement loOol)
Rejoignez-nous