Méthode de dessins avancé sur iOS ?
yoann
Membre
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.
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.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
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.
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.
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 ?
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 /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).
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.
Je ne connais pas le iPen.
Pour le iPen c'est par là http://cregle.com/ipen
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ù :
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,/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...
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.
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.
Bonjour,
Juste par curiosité, quel type d'algo utilises-tu pour ce genre de chose?
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à .