Méthode de dessins avancé sur iOS ?

Salut la compagnie,



Depuis un moment je réfléchit à  un système de tableau blanc sur iPad pour donner mes cours. Avec une Apple TV et le support de AirPlay sur Moutain Lion je pense qu'il y a un vrai truc cool à  faire pour des cours augmenté.



Je suis donc en train de réunir un peu toutes les doc qui pourraient m'être utile.



Est-ce que certain d'entre vous auraient de bonne documentation sur l'approche à  adopter pour un logiciel de dessin vectoriel un peu évolué ? J'entend par là  que tous les tracés seront des objet indépendant pour être déplacé après coup. J'aimerais aussi travailler sur un mode de reconnaissance de forme pour faire qu'un patatoide soit un cercle, etc.



Bref, vous voyez l'idée.



Je suis preneur de toute référence ayant attrait au sujet.

Réponses

  • AliGatorAliGator Membre, Modérateur
    Je pense que tu as plusieurs problématiques ici, et qu'il faut séparer les problèmes car chaque module a ses propres considérations à  prendre en compte :
    • Créer un logiciel de dessin vectoriel avancé, avec reconnaissance de forme au tracé, etc.
    • Et dans un autre régistre, tu veux que ce qui est dessiné puisse être envoyé à  un écran externe. Là  tu as soit AirPlay pour envoyer l'écran de ton iPad directement sur un AppleTV, soit d'autres méthodes maison, qui peuvent aussi avoir leur avantage.


    Par exemple j'avais testé à  une époque un soft iPad de dessin (mais bitmap, pas vectoriel -- faut que je te retrouve le nom) qui intégrait un serveur HTTP simpliste en interne, permettant à  n'importe qui d'ouvrir son navigateur sur une adresse genre http://ip.de.l.ipad:9999 et de voir le dessin en live ! Pratique pour les conférences, y compris à  distance (du moins à  partir du moment où ton iPad est accessible sur le réseau), même dans des pièces différentes ou sans vidéo-projecteur.



    Du coup le principe si tu pars là -dessus serait plutôt de partager les objets vectoriels dessinés (envoi de portions de SVG sur ton socket par exemple) et le redessiner sur le client, plutôt que d'envoyer tout le bitmap du dessin prérendu sur le réseau pour l'afficher sur les clients. Cela peut rentrer en considération dans ton approche concernant la sérialisation de ton modèle.
  • Je réfléchissait à  une option d'export http en effet mais ça sera en secondaire je pense (si c'est que du dessins ça ira, mais si j'intègre des webview par exemple, ça sera à  réfléchir).



    Concernant le display sur l'Apple TV j'ai déjà  codé un truc avec le connecteur VGA du dock, c'est normalement la même chose aujourd'hui avec l'Apple TV.



    Ma problématique d'architecture se trouve plus au niveau de l'appli de dessins vectoriel.



    J'ai une idée global de comment faire ça (des objets indépendant capable de créer leur vue de rendu puis un système de layout manager global qui joue à  Tetris avec).



    Je me demandais simplement s'il existait un article type "state of the art" pour ce genre de chose.
  • Bonjour,



    Dans iPocket Draw, j'ai un outil de dessin libre avec reconnaissance de formes (ligne, arc, ellipse, rectangle, polygone).

    Dans la prochaine version, cet outil évolue un peu d'ailleurs avec une reconnaissance de formes qui tient compte des points d'attirance rencontrés.

    Tu peux essayer le version Lite pour voir si certaines choses te conviennent.
  • Je viens de jeter un oe“il sur iPocket Draw, c'est très lourd comme UI !



    Il semble qu'on puisse faire de bonne chose vu les screen mais c'est vraiment lourd comme interface...



    Tu supporte l'usage du iPen dessus ?
  • AliGatorAliGator Membre, Modérateur
    'yoann' a écrit:
    J'ai une idée global de comment faire ça (des objets indépendant capable de créer leur vue de rendu puis un système de layout manager global qui joue à  Tetris avec).
    Je ne sais pas pour la littérature existante sur le sujet, mais c'est marrant moi j'aurais pas imaginé ça comme ça.



    Tu peux faire autant de UIView que tu as d'objets, ce qui peut avoir l'avantage de permettre de gérer les UITouches pour déplacer les objets, c'est vrai. Mais c'est plutôt lourd, surtout si tu commences à  avoir pas mal d'objets.

    Par contre tu peux utiliser des objets modèles qui savent se dessiner (implémentent drawInContext:(CGContextRef)ctx par exemple, un truc comme ça) et boucler dessus pour demander à  chacun de se dessiner avec CoreGraphics sur la vue principale unique. Ca t'évitera d'avoir 15000 subviews ce qui devient vite trop lourd.



    Autre solution intermédiaire et plutôt intéressante, utiliser CALayer et non UIView : bien plus léger, mais implémente déjà  ce mécanisme de savoir se dessiner soi-même (c'est le but de CALayer d'ailleurs, se dessiner à  l'écran image/wink.png' class='bbc_emoticon' alt=';)' />), et en plus avec -hitTest: tu peux savoir quel sublayer de ton layer principal a été touché, donc ça te permet d'implémenter aussi assez facilement la partie touch/déplacement des objets existants.



    Pour la partie "reconnaissance de formes" pour transformer un tracé à  main levé d'une patatoà¯de en un objet vectoriel "cercle" ou "ovale", par contre c'est une autre paire de manches (et un module dédié à  part entière).
  • 'yoann' a écrit:


    Je viens de jeter un oe“il sur iPocket Draw, c'est très lourd comme UI !



    Il semble qu'on puisse faire de bonne chose vu les screen mais c'est vraiment lourd comme interface...




    L'interface s'efface lors des touches sur le dessin...

    iPocket Draw est maintenant un véritable programme de CAD 2D, il est donc normal que l'UI soit en conséquence.

    De là  à  dire qu'elle est lourde !?

    Si tu la compares à  celles de programmes type Paint, oui, mais les possibilités ne sont pas les mêmes.

    Après, je suis ouvert à  toutes propositions d'amélioration.


    'yoann' a écrit:


    Tu supporte l'usage du iPen dessus ?




    Je ne connais pas le iPen.
  • Mon objectif n'est pas de la CAD mais de l'enseignement, d'où ma remarque sur la lourdeur de l'interface, trop d'option disponible pour des gens qui n'ont besoin que de feutre de différentes couleurs habituellement :-)



    Pour le iPen c'est par là  http://cregle.com/ipen
  • AliGatorAliGator Membre, Modérateur
    Pour la reconnaissance de forme, sinon, des idées simples :
    • Pour le principe général, à  chaque touchesMoved tu vas mémoriser les points de ton tracé à  main levé, et au touchesEnded tu vas analyser l'ensemble de ces points que l'utilisateur a tracé entre touchesBegan et touchesEnded et tenter de reconnaà®tre la forme. Une fois la forme reconnue (segment, cercle, ...), tu construis ton objet vectoriel correspondant et tu oublies les points du tracé main levé. (Bon sauf si aucun objet vectoriel n'est reconnu, là  tu peux imaginer construire un objet "tracé main levé" qui garde tous les points au lieu d'être converti en une forme définie)
    • Pour reconnaà®tre une ligne, c'est une simple régression linéaire. Si l'écart entre tes points et ta ligne de tendance est assez faible, tu considères que l'ensemble des points ressemblent assez à  une ligne pour être considéré comme tel, et tu as donc un segment qui va du premier au dernier point.
    • Pour un cercle, c'est un peu le même principe mais dans l'espace polaire. En pratique, tu calcules le centre de gravité de tous les points (la moyenne, quoi), qui va te donner le centre du cercle potentiel. Puis tu calcules la plus grande et la plus petite distance entre ce centre de gravité et chacun des points, ainsi que la distance moyenne. Si la différence entre le min et le max est assez faible, ou mieux si les ratios moyenne/min et max/moyenne sont assez proches de 1 (erreur relative faible), alors tu as un cercle pas trop mal dessiné que tu peux valider, de centre le centre de gravité et de rayon la distance moyenne.


    Pour les polygones, genre triangle ou rectangle, là  par contre c'est une autre paire de manches, car il faut détecter les changement d'orientation dans ton nuage de points. Mais je ne sais pas si tu veux aller jusque-là ... Tracer 3 lignes (à  main levée, qui seront reconnues comme 3 lignes vectorielles) est peut-être aussi simple, d'autant que tu peux imaginer un système où :
    • Le premier point ainsi que le dernier point de ton tracé à  main levé peut être magnétisé sur un point existant s'il y en a un assez près. Ce qui permet de "chaà®ner" les tracés, et de tracer 3 lignes bout à  bout pour faire un beau triangle plutôt que de risquer de faire 3 segments qui ne se raccrochent pas
    • Lorsque tu traces segment qui commence par un point d'un autre segment, il est alors envisageable une fois le segment construit, de le "rajouter" au segment précédent, pour n'avoir qu'un seul objet / une seule forme / un seul BezierPath contenant l'ensemble des segments bout à  bout plutôt que plusieurs BezierPaths (un par segment).


    Au final si tu implémentes ces deux cas, somme toutes assez simples, il sera facile de tracer un triangle ou un quadrilatère en traçant 3 segments d'affilée qui vont facilement se mettre bout à  bout pour former une forme unique.



    Reste le problème des rectangles : tracer des côtés à  angle droit et égaux en particulier. Mais ça tu peux prévoir un mode "snap to grid", qui va privilégier les segments horizontaux ou verticaux si l'angle du segment est assez proche d'un multiple de 90°, et qui va aimanter les points aux valeurs x ou y des points des segments déjà  existants de la forme que tu complètes, de sorte de pouvoir facilement aligner les points. Ainsi tu traces un premier trait à  main levée qui est reconnu comme un segment de (Ax,Ay) vers (Bx,By), bah ensuite si tu traces à  main levée un trait qui part de (Bx,By) vers (Cx,Cy) tu vas essayer de faire en sorte que si MIN(fabsf(Cx-Px)<eps) pour P dans {A,image/cool.png' class='bbc_emoticon' alt='B)' /> alors tu utilises Px plutôt que Cx (en gros si Cx est très proche de Ax ou de Bx, tu utilises Ax ou Bx (celui qui est le plus proche de Cx) à  la place de Cx.





    Voilà , c'est juste un jet d'idées en vrac, j'espère que ça peut te faire avancer dans la réflexion...
  • 'yoann' a écrit:


    Mon objectif n'est pas de la CAD mais de l'enseignement, d'où ma remarque sur la lourdeur de l'interface, trop d'option disponible pour des gens qui n'ont besoin que de feutre de différentes couleurs habituellement :-)


    C'est sûr qu'avec un seul outil et peu d'options, il doit être possible de faire une interface plus légère.






    'yoann' a écrit:


    Pour le iPen c'est par là  http://cregle.com/ipen


    Je n'ai pas compris comment fonctionne ce truc et s'il y a un SDK pour le prendre en charge dans une app.
  • 'Eric a écrit:


    Je n'ai pas compris comment fonctionne ce truc et s'il y a un SDK pour le prendre en charge dans une app.




    Il y a un SDK accessible sur demande. Le principe du stylo est que tu as un récepteur qui se place sur le dock de l'iPad ou de l'iPhone et qui va être capable via des capteurs de calculer la distance du stylet qui est actif (deux piles de montre). Le but du jeux étant d'avoir une précision au pixel près, bien plus précis que le doigt ou les stylet passif.
  • 'Eric a écrit:


    Bonjour,



    Dans iPocket Draw, j'ai un outil de dessin libre avec reconnaissance de formes (ligne, arc, ellipse, rectangle, polygone).

    Dans la prochaine version, cet outil évolue un peu d'ailleurs avec une reconnaissance de formes qui tient compte des points d'attirance rencontrés.

    Tu peux essayer le version Lite pour voir si certaines choses te conviennent.


    Bonjour,



    Juste par curiosité, quel type d'algo utilises-tu pour ce genre de chose?
  • Comme l'a évoqué Aligator, en faisant des moyennes etc.

    Pour les cercles et arcs de cercle, j'ai une routine qui calcule le cercle passant par 3 points puisque j'ai un outil qui fait ça.

    Donc quand j'ai tous les points tracés par l'utilisateur, je prends les points par 3, je calcule le cercle (centre et diamètre), puis le centre moyen et le diamètre moyen puis les écarts avec les valeurs moyennes et je décide si ça ressemble ou non à  un cercle ou un arc de cercle.

    Si ce n'est pas un cercle ou un arc de cercle, je continue en cherchant si j'ai des alignements de points en privilégiant les horizontales ou les verticales, toujours avec des moyennes et des écarts et je construis ainsi un tableau de droites.

    Si j'ai trouvé 2 lignes verticales et 2 horizontales, c'est peut-être un carré ou un rectangle donc test sur les continuités des lignes et si la figure se referme ou pas.

    Sinon c'est un polygone (ou une simple ligne), je repars de mon tableau de droite, si j'en ai plusieurs, je calcule les intersections et je crée un polygone.

    Voilà .
Connectez-vous ou Inscrivez-vous pour répondre.