sélection sur panel

andrada
sélection sur panel

Bonjour,

j'ai un panel sur lequel je peux dessiner des points, lignes, polygones, cercles et rectangles. J'aimerais pouvoir sélectionner un des objets et le supprimer. Est ce que quelqu'un pourrait m'aider?

Merci d'avance.

andrada

Il n'y a personne qui pourrait me donner des idées pour sélectionner un point ou une ligne et le supprimer?

S'il vous plaît, j'en ai vraiment besoin.

Merci d'avance

fredericmazue

Quote:
Il n'y a personne qui pourrait me donner des idées pour sélectionner un point ou une ligne et le supprimer?

En cliquant dessus ?

Tu remarqueras que ma suggestion est aussi vague que ta question.

Quote:
S'il vous plaît, j'en ai vraiment besoin.

Personne n'en doute. Mais avec ta question telle que tu l'as posée, je ne sais pas comment on pourrait t'aider concrètement.
Niroken

Bonjour,

Selon moi, voila ce qu'il faudrait que tu fasses :
a chaque fois que dessines une figure géométrique sur ton panel
tu gardes les équations de droite ou centre de cercle etc qui te
permettront d identifier ta figure.
Ensuite a chaque fois que tu cliques sur ton panel tu vas vérifier si
le point ou tu as cliqué est un point appartenant une des figures en
question en te resservant des équations que tu auras établies.
Après bon tu il suffit de la supprimer en peignant en blanc l'élément
supprimer et en repeignant les autres en noir des fois qu en peignant
en blanc tu en est supprimé un morceau d un autre:)

Après il faut gérer les superpositions et tt ca... mais obn jespère que ca
peut t'aider,

Si je trouve un peu de temp et si tu ne trouves pas mes explications
faisables je te le coderais :)

Bonne chance

fredericmazue

Quote:
tu gardes les équations de droite ou centre de cercle etc qui te
permettront d identifier ta figure.

Et si c'est un polygone ?
Ou si l'utilisateur clique malencontreusement sur le point d'intersection de deux droites ?
Je pense qu'il devrait définir des rectangles englobants de chaque objet tracé, les classer en Z-order pour identifier celui-ci est cliqué et agir en conséquence.
Mais il faudrait aussi dans ce cas que chaque tracé soit un objet ce qu'il ne dit pas dans sa question.
C'est pourquoi j'essaie de lui faire préciser son problème.
Niroken

Hmmm même si c est un polygone ca ne pose pas de problème,
j'ai commencé par simple evidemment mais :
pour un polygone tu peux le voir comme la construction de figures
géométriques simples (triangle, rectangle, droite, cercle) et après
de le tracer par combinaison de ces figures..la ca commence a devenir
compliqué:p..
sinon dans le second problème que tu as soulevé par exemple un triangle
et un cercle au même endroit, tu cliques au milieu et tu ne sais pas lequel
du cercle ou du triangle prendre...
Je rajouterais un attribut à chaque figure, un niveau de superposition par
exemple et quand on rajoute une figure par dessus une autre, le niveau
de la figure du dessus est incrémenté de 1 par rapport a celle du dessous,
ensuite quand on clique dans le tas..on sélectionne la figure ayant le plus
haut niveau de superposition..on reclique on prend celui du dessous etc
etc cela peut gérer ce cas de figure.

Après il faut voir s'il pense que la solution que je présente lui est faisable
ou non, sinon va falloir je mette les mains dans le camboui :D

andrada

Quote:
Mais il faudrait aussi dans ce cas que chaque tracé soit un objet ce qu'il ne dit pas dans sa question.
C'est pourquoi j'essaie de lui faire préciser son problème.

oui, chaque tracé est un objet appartenant à une des classes suivantes: Point, Ligne, Rectangle, Cercle, Polygone.

A chaque tracé, je récupère les coordonnées de l'objet pour les stocker dans un tableau.

Je comprends un peu ce que niroken a expliqué mais comment le faire, ça je ne le sais pas.

merci pour vos réponses

andrada

fredericmazue

Quote:
Hmmm même si c est un polygone ca ne pose pas de problème,

Ah ? Tu connais l'équation du polygône toi ? ;)

Quote:

Je rajouterais un attribut à chaque figure, un niveau de superposition par
exemple

Voleur :!: ;)
C'est mon idée :!: ;)
Des triangles englobeant classés en Z-Ordre, n'est-ce pas un niveau de superposition pour chaque figure ?
Et travailler avec des rectangles englogant pour tous tracés simplifie tellement le problème :)

Quote:

Après il faut voir s'il pense que la solution que je présente lui est faisable

Ce que tu lui présentes est faisable. Mais est-ce faisable dans son code ? je veux dire facilement intégrable dans ce qu'il a déjà écrit. Ca c'est autre chose. On ne sait pas. Quand il aura donné plus de renseignements, peut être...
Enfin apparement il commence à en donner c'est un bon début.
Quote:

ou non, sinon va falloir je mette les mains dans le camboui

Y a pas à dire, t'es vraiment le gars de bonne volonté. :)
Niroken

A la limite je peux essayer de te coder ca pour la fin de la semaine
mais j'aimerais autant que tu me donnes les sources de ce
que tu as fais jusqu'à présent et puis que je reparte sur ton modèle
d'objets existants.

Voili voilou :wink:

andrada

Merci niroken,

je n'ai pas les sources en ce moment, je te les enverrai ce soir.

andrada

andrada

Alors, je n'ai pas le code en ma possession (étant en déplacement) mais je vais te donner juste la structure de mes classes et les méthodes de dessin.

Voici mes classes:

 public class Point implements Serializable{

int x,y;

public Point(int x, int y){
this.x=x;
this.y=y;
}

public dessinePoint(Graphics g){
Graphics2D g2 = (Graphics2D ) g ;
g2.drawRect(x,y,1,1);}


public class Ligne extends Point {

Point[] tabPoint;

public Ligne(Point[] p){
this.tabpoint=p;
}

public dessineLigne(Graphics g){
for(int i=0; i<this.tabPoint.length; i++)
g.drawLine(this.tabPoint[i].x,this.tabPoint[i].y,this.tabPoint[i+1].x,this.tabPoint[i+1].y);
}

Pour le polygone, c'est à peu près la même classe sauf qu'il y a des méthodes pour ajouter un point à un polygone, avoir le nombre de points du polygone et la méthode de dessin est différente.


public class Cercle extends Point {
Point p
 int r ;


public Cercle (Point c, int rayon )
{
this.p=c;
this.r=rayon;
}


public void dessineCercle( Graphics g ) {
Graphics2D g2 = (Graphics2D ) g ;
g2.setColor(Color.green);
g2.drawOval( p.x -r , p.y -r , 2 * r , 2 * r ) ;

}

} 

Au moment du dessin sur le panel, chaque dessin est stocké dans une liste de Shape. Et j'ai également pour chaque type d'objet un tableau où je stocke les coordonnées des objets dessinés.

Pour le dessin, sur le panel, j'ai des boutons correspondants à chaque type d'objet et au clic sur un objet, je le dessine en récupérant les coordonnées de la souris.

Je ne sais pas si ça pourra te permettre de partir de ça car c'est vrai il n'y a pas tout le code.

Dans tous les cas, merci pour l'aide.

andrada

andrada

J'ai vu le message de niroken pour la sélection. Cela m'a permis d'avancer merci niroken. Mais pour la méthode contains, je bloque un peu. Je la redéfinit dans chaque classe. Pour le point, un equals() suffit je pense mais pour les autres objets alors là, je n'ai pas d'idées.

Niroken

Lol bon c'est vrai que y a un peu des messages dans tout les sens sur ce
sujet :)

Bon en ce qui concerne la redéfinition de la méthode contains je vais
te faire un petiti topo par figure :

Point : bon la facile tu vérifies que le X et Y du point cliqué est le même
que le point voulu.

Droite (orientée nimporte comment dans le plan) : Tu peux établir une
petite équation de droite en connaissant les deux points qui t'ont permis
de la tracer c est facile. tu calcules le coef directeur puis l'ordonnée a l'origine.
La méthode contains doit vérifier que le point cliqué vérifie l'équation de droite : y = ax +b

Cercle : Tu calcules la distance entre le point cliqué et le centre du cercle
en te servant du théorème de pythagore et pour que le dit-point
appartiennent au cerlce il faut que la distance en question soit inférieure au rayon.

Rectangle (dont les cotés sont parallèles aux axes) : dans ce cas
tu connais Xmin et Xmax ainsi que Ymin Ymax du rectangle il suffit
de vérifier que le point cliqué soit compris entre Xmin et Xmax d'une part
et Ymin et Ymax d'autre part.

Rectangle (orienté n'importe comment dans le plan) : Tu établis les
équations de droite des 4 coins du rectangle. puis tu vérifies appartient
au plan formé par l'intersection des 4 plans délimités par les équations
de droite.

Polygone : j'ai réfléchi a une idée, mais comme j'ai pas trop eu le temp
de tester si c'etait mathématiquemen fonctionnel, je reviendrais dessus
quand ca sera mûri.

Bonne chance

andrada

merci niroken,
juste une dernière petite question, dans le cas de la ligne, si j'ai une polyligne, je dois calculer l'équation de droite entre chaque ligne qui compose la polyligne?

Niroken

En fait pour une droite je dois apporter une petite
précision :

On va surement te demander l'équation d'une droite
mais qui n'est pas infini : un segment de droite quoi:)
dans ce cas tu établis l'équation de la droite et tu vérifis
aussi que le point cliqué est bien dans le segment pour cela:

chaque poitn aux extrémités du segment a des coordonnées:
donc il y en a forcément un qui a un X plus petit que l autre
appellons le Xmin et de fait l autre c est Xmax.
Idem pour les Y -> Ymin et Ymax

Tu dois déterminer que ton point cliqué a un X compris entre
Xmin et Xmax et un Y compris entre Ymin et Ymax.

J'en viens a ta question :
Pour une polyligne tu dois établir l équation de droites des
deux lignes refaire le topo Xmin-Xmax Ymin Ymax pour chacune
d'elles
Et tu vérifies ensuite que ton point cliqué appartient a l'une
ou l'autre des lignes.

Bonne chance

fredericmazue

Quote:
Rectangle (dont les cotés sont parallèles aux axes) :
Rectangle (orienté n'importe comment dans le plan)
Polygone :

Pourquoi 3 cas différents ?
Et pour l'ellipse au fait ?
Quote:

J'en viens a ta question :
Pour une polyligne tu dois établir l équation de droites des
deux lignes refaire le topo Xmin-Xmax Ymin Ymax pour chacune
d'elles
Et tu vérifies ensuite que ton point cliqué appartient a l'une
ou l'autre des lignes.

Et si on clique dedans le polygone ?

Mais enfin pourquoi tant de complications. Pourquoi, (décidément je m'époumone pour rien sur ce forum) ne pas travailler avec des rectangles englobant les figures quelles qu'elles soient ?
Rien de plus facile que de les sélectionner car rien de plus facile que de tester si on clique dans un rectangle englobant et dans le cas de rectangles englobant superposés, rien de plus facile que de permuter leur z-order ave cun Shift-clic ou qcq chose du genre
Et comme ça, on traite tout de la même façon, rectangle cercle ellipse, polygone même une courbe de Bézier si on en a envie (de Bézier)
C'est tellement simple que les logiciels simples font comme ça, et c'est il me semble ce que veux faire le posteur initial.
Evidemment s'il est question de faire un logiciel de dessin industriel, ça sera autre chose, mais alors il faudrait tout revoir, parce que dans un tel cas, il faudrait sans doute quelque chose de plus consitant que "j'ai un panel sur lequel je peux dessiner des points, lignes, polygones, cercles et rectangles. J'aimerais pouvoir sélectionner un des objets et le supprimer."

Niroken

Effectivement ta problématique est intéressante :

Celle des rectangles englobants je parle :
Sauf que si la figure ne remplit presque rien du rectangle
ca n'est pas très utile d'englober la figure.
Et hmmm la ce n'est que mon point de vue.

Bon j'ai différencié le cas des rectangles pour la raison
suivante :
En supposant que tu ne puisses pas coder la fonction
qui fasse contains() du polygone(qui n'est pas triviale)...
Il ne faut pas se retrouver bloqué alors que tu peux coder
facilement celle d'un rectangle qui est un cas particulier
de polygone.

Quote:

Citation:

J'en viens a ta question :
Pour une polyligne tu dois établir l équation de droites des
deux lignes refaire le topo Xmin-Xmax Ymin Ymax pour chacune
d'elles
Et tu vérifies ensuite que ton point cliqué appartient a l'une
ou l'autre des lignes.

->Et si on clique dedans le polygone ?

beh euh je parlais de polylignes la..pas de polygones :)

Ensuite le découpage a été fait puisque à la base c'était le
découpage de andrada (cercle, rectangle, ligne, point, polygone)
si ma mémoire est bonne :)

fredericmazue

Quote:

Celle des rectangles englobants je parle :
Sauf que si la figure ne remplit presque rien du rectangle

Le plus mauvais cas est une ligne diagonale d'un carré englobant. Ce n'est pas très gênant si l'on veut faire dans le très simple. Mais en fait il faut penser une gestion particulière des figures à une dimension telles qu'une ligne par rapport aux figures à 2 dimensions telle que cercle ou polygône.
Ce qui repose en fait l'approche de la conception de l'application dès le départ.
La hiérarchie de classes "intuitive" (et que je qualifierais de naïve) telle que présentée en générale et ici implicitement dans la question d'andrada n'est pas forcément la bonne :)
Et quand je dis pas forcément, c'est juste une formule :)

Quote:
beh euh je parlais de polylignes la..pas de polygones

Ah oui, je t'ai mal lu :oops:

Quote:
Ensuite le découpage a été fait puisque à la base c'était le
découpage de andrada (cercle, rectangle, ligne, point, polygone)

Justement j'étais resté sur le polygone moi ...
Mais bon comme dit plus haut le "découpage" en question est-il pertinent ? Je ne le crois pas.
andrada

J'ai bien lu tout ce que vous avez écrit.

Si vous pensez que mon découpage n'est pas assez pertinent, comment est ce vous l'auriez fait à ma place?

Et comment faire avec les rectangles englobants? A chaque fois que je dessine un objet, il faut que je crée également un rectanglr qui l'englobe :?: :roll:

fredericmazue

Quote:

Si vous pensez que mon découpage n'est pas assez pertinent, comment est ce vous l'auriez fait à ma place?

Ben tu as la réponse dans mon post précédent.
Tu fais de l'informatique. Donc tu manipules des informations. Et il est souvent pertinent de "découper" par catégories de mapulations communes des information diverses apparement dissemblables, plutôt que de répèter bêtement ce qu'on entend dans les cours et ce qu'on lit dans les livres sur la programmation objet, lorsqu'il s'agit de définir une hiérarchie de classes.

Ah autre chose aussi. Je sais que je vais m'attirer quelques commentaires puisque je vais à l'encontre des idées reçues ;) mais je ne résiste pas à l'envie de te dire que dans une hiérachie de classe moins il y a d'héritage (donc de hérarchie ;) ) mieux tu te portes.
Par exemple la librairie STL de C++ n'utilise quasiment pas l'héritage, ce qui est une raison de sa souplesse et de sa puissance.

A toi de jouer, c'est en écrivant du code qu'on devient codeur :)

Quote:
A chaque fois que je dessine un objet, il faut que je crée également un rectanglr qui l'englobe

Voilà :) Ce qui ne veut pas dire le dessiner à l'écran n'est-ce pas.
Ni même définir un rectangle hein ? :lol:
Parce que si tu y réfléchis et si tu pars du principe légitime qu'un rectangle englobant peut toujours être défini comme ayant des bords parallèles aux axes de ton repère, alors deux points suffisent ;)