«Comme si vous avez besoin d'explications»
Arthur

Écrire un logiciel de dessin.

Mais 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 même 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.

Mais 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. A partir de la position du curseur de pointage de la souris, il suffit alors d'ajouter l'objet choisi dans la collection. 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 pourrait se demander si seul cet élément (la courbe spline) ne pourrait-il 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érifiez 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, attention aux éléments que vous effacez :

    Le plus simple étant d'effacer les éléments de liste sélectionnés en partant du plus lointain dans la liste et d'effacer la liste des éléments sélectionnés. Si vous faites des trous dans la collection de dessin ayez soin, si ce n'est pas automatique, de décaler les éléments suivants, et c'est pour celà qu'il faut partir du plus lointain (le premier à l'indice zéro).

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

    Quand on cherche son rectangle d'encadrement, il suffit d'utiliser la fonction UnionRect avec tous les rectangles des dessins que cette liste contient.

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 il rencontre (ce rayon) un objet de la scène il mémorise la longeur du rayon de la caméra à la surface de l'objet en question 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é mais 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.

Un 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 )
Selection = (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:

  • Méthode d'affichage : celle-ci a besoin du display contexte d'affichage de WindowsTM, celui-ci est alors transmis comme paramètre de la boucle d'itération de la collection des dessins vers celui à afficher. Dans le cas d'un groupe celui-ci procède de la même façon, comme WindowsTM avec son message paint, envoie le rectangle d'affichage un simple test permet aussi de vérifier si ce dessin est inscrit dans ce rectangle pour optimiser la vitesse d'affichage en affichant uniquement les éléments qui correspondent qui sont dans le cadre.
  • Méthode de localisation : celle-ci demande à être précisée, en effet le simple fait de cliquer sur un rectangle de délimitation, permet seulement de localiser un groupe ou un élément de dessin complet mais pas de savoir si le curseur de la souris est positionné sur un des points de contrôle de chemin. Dans ce cas Denis-Draw regarde avant tout si le premier cas (le rectangle) est possible, ce test est très rapide. Puis, recherche en fonction de l'outil adéquat, la position des points de contrôle de chemin pour cette fois-ci déterminée si l'un d'eux est sous le curseur de positionnement de la souris.
  • Méthodes d'affectation des attributs, comme ils sont affectés uniquement à la sélection, Denis-Draw, parcours la liste des indices des objets sélectionnés pour leurs affecter l'attribut à modifier. Ce n'est pas une seule méthode car celles-ci distingue les différents attributs. En effet, vous pouvez vouloir changer la couleur de contour du ou des objet(s) sélectionnés sans vouloir changer la couleur de remplissage qui peut être différente.
 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 possible) mais dans le deuxièmes 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ée 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, qui bien moins rapide, utilise un dessin avec des tracés anti-aliasiasé*007 (sans crenelage apparent). De plus, l'impression des dégradés, poser des proplèmes avec certaines imprimantes, en utilisant une bibliothèque comme celle du GDI+Plus, qui implémente en mode natif les dégradés, on peut espérer de meilleurs résultats.
  6. 007 - anti-aliasias : procédé qui consiste à afficher des pixels intermédiaire (d'une intensité lumineuse moindre) pour estomper les effets «escalier» d'une ligne.

© BeeLog 2009

Denis Bertin le 21-23.07.2009