Écrire un logiciel de dessin

Si vous voulez vraiment écrire, vous aussi votre logiciel de dessin, chaque structure doit aussi être définie.

Une collection principale pour contenir les éléments de dessin voire une collection de collection si vous voulez gérer les calques et autant d'objets que de types de formes de dessin comme les lignes, les arcs ou les courbes spline*002. Ce n'est pas le choix adopté par Denis-Draw car chaque dessin peut lui même contenir tous ces éléments à la fois.

J'ai rencontré un ami qui m'a demandé comment faire un ray-tracer, ces structures peuvent être les mêmes dans le cas de la 3D. Une fois ces structures en place, un choix d'outil dans la palette de dessin parmi plusieurs permet de créer chaque «morceau» du dessin. Il suffit d'ajouter l'objet choisi dans la collection à partir de la position du curseur de pointage de la souris Son tracé demande bien sur de s'afficher en temps réel pour visualiser immédiatement sa position.

Sachant que le dessin des splines détermine un segment de droite si seuls deux de ces points existent, que le dessin de point de spline successif dessine une courbe et que vous pouvez faire en sorte de les positionner pour obtenir un arc de cercle, on peut se demander si seul cet élément (la courbe spline) peut suffire à tous les autres avec une seule équation !
Il faut aussi parler des attributs, comme ceux des couleurs de tracé des courbes. Mais si vous connaissez Persistence Of Vision il suffit tout simplement de faire référence à la texture qui peut se décrire de la même façon dans une boîte de dialogue.

Le dessin de l'écran consiste à parcourir la collection d'éléments de dessin, puis d'appeler la méthode d'affichage de chaque élément en tenant compte de ces attributs de dessin. Vous pouvez aussi, comme le fait Denis-Draw, vérifier que le rectangle d'encadrement de chaque élément de dessin est bien inscrit dans le rectangle d'affichage (clipping). De même quand vous cliquez avec la souris sur un élément de dessin avec l'outil de sélection, il suffit de parcourir cette même collection pour extraire celui qui correspond à la position de la souris, en partant du dernier dessin ajouté si vous voulez gérer un ordre de priorité.

Chaque élément est circonscrit dans un rectangle en une fonction du GDI*003 PtInRect*004 permet de savoir si un point (celui de la position de la souris) est à l'intérieur du rectangle d'encadrement du dessin examiné. Il suffit de le marquer «sélectionné» ou de l'ajouter à une liste d'éléments sélectionnés avec leurs indexs. Une liste d'éléments sélectionnés distincte permet de parcourir seulement 3 entrées si seulement trois objets sont sélectionnés plutôt que l'ensemble de la collection mais dans ce cas faites attention aux éléments que vous effacez.

Les attributs (comme la couleur du pinceau) affectés alors s'appliquent à la sélection qu'il suffit de parcourir pour la mettre à jour et de demander l'affichage de tout le document, ou si vous êtes optimiseurs, du cadre des éléments modifiés.

L'élément Groupe est un élément particulier avec lui aussi une liste d'éléments de dessin, quand sa méthode d'affichage est appelée, il parcourt sa propre collection pour appeler les méthode d'affichage de ceux-ci.

Pour revenir sur le sujet du ray-tracer qui demande à être expliqué, celui-ci lance des rayons partant de l'œil d'observation ou de la caméra pour parcourir chacun des pixels de l'écran. Quand le rayon rencontre un objet de la scène, il mémorise la longueur du rayon de la caméra à la surface de l'objet pour continuer avec tous les autres objets de la scène et garder le plus proche, le rayon le plus court de l'œil à la surface de cette objet. La couleur de ce pixel prend alors la couleur de l'objet touché. On peut aussi calculer la normale à la surface pour déterminer l'angle de celle-ci avec une source de lumière et de la colorer en fonction.

Le prototype serait le suivant:


une liste des calques = ( une liste de Collection )
Collection = (liste de dessin...,...)
		(des méthodes de parcours de cette collection pour afficher, localiser, affecter des attributs)
Actif = (la collection en cours, celle sur lequel les nouveaux éléments de dessin s'ajoutent )
Sélection = (liste indice sur un ou plusieurs dessin )
un dessin = ( (une liste de segment, d'arc ou de spline )
		( avec un rectangle d'encadrement )
		( des attributs... )
		( une méthode d'affichage )
		( une méthode de localisation ) //celle-ci demande à être précisée
		( des méthodes d'affectation des attributs ) ).
des attributs = ( couleur du pinceau, du remplissage, épaisseur de tracé, relief, ombre ou lumière voir texture etc...)

Détail des méthodes:


La prévisualisation utilise aussi bien GDI (pour graphique device interface) que la nouvelle version GDI+Plus*006 pour s'afficher (les deux choix sont possibles) mais dans le deuxième cas le taux du zoom est lui aussi passé comme paramètre à la méthode d'affichage plutôt que de modifier le MapMode*005.

Liste des références :

  1. 002 - Spline: les logiciels techniques nomment ces fonctions NURBS, pour Non-Uniforme-Bézier-Spline. Si vous savez calculer la tangente de la fonction x², les courbes splines dessinent une approximation du passage du tracé vers ces tangentes, à vérifier avec le dessin de spline et la fonction ajouter les tangentes du menu Popup.
  2. 003 - Interface graphique GDI : Programmer sous Windowstm Charles petzold page 561 - Microsoft-Press.
  3. 004 - PtInRect : cette fonction recherche si un point donné, est à l'intérieur d'un rectangle.
  4. 005 - SetMapMode : Pour définir les unités de mesure utilisées pour convertir les unités des coordonnées logiques de celles du périphérique. Permet de définir un ratio entre les unités internes et celles affichées.
  5. 006 - GDI+ : une amélioration du GDI bien moins rapide qui utilise un dessin avec des tracés anti-aliasiasés*007 (sans crenelage apparent). De plus, l'impression des dégradés, posait des problèmes avec certaines imprimantes, en utilisant une bibliothèque comme celle du GDI+Plus, qui implémente en mode natif les dégradés et on peut espérer de meilleurs résultats.
  6. 007 - anti-aliasias : procédé qui consiste à afficher des pixels intermédiaires (d'une intensité lumineuse moindre) pour estomper les effets «escalier» d'une ligne.

© copyright BeeLog 2009

Denis Bertin le 21-23.07.2009