Détecter la présence d'un objet

Rousseau-Wallon shared this question 2 months ago
Answered

Bonsoir,

Est-il possible de détecter la présence d'un objet, par exemple le point A de coordonnées (2,1) ?

Lorsque ce point est à l'écran, GGB le sait, puisqu'il l'affiche dans la fenêtre algèbre. Mais pourrait-on créer un script sur un bouton (par exemple) qui renverrait le booléen correspondant ?

Autre question du même genre : étant donnés des segments déjà créés, peut-on en appuyant sur un bouton en connaitre leur nombre ?

Une idée : on pourrait par exemple détecter la présence du segment [(-1,0) (1,0)] en calculant le nombre de points d'intersection de ce qui est à l'écran avec le segment [(0,-1) (0,1)] (un 1 dirait qu'il y a qqchose, et ce serait un segment si on savait qu'il n'y avait que des segments à l'écran). Mais ce calcul est-il possible ?

Best Answer
photo

pourquoi "nouveau" ne remet pas "nombre" à 0 ?

car je n'y arrive pas !

ces scripts ça me passe toujours et encore un peu au dessus de la tête

j'ai essayé nombre = copierobjetlibre(nombre) puis SoitValeur(nombre, 0) dans le script Nouveau, mais du coup il reste à zéro..


ok pour SetMode(15) mais celui qui clique sur Déplacer puit sur un point crée qd même une erreur


dernière minute : éliminer tous les configurations impossibles est possible, car un "nombre " calculé ne correspond alors pas à la longueur de la ligne brisée. Or la longueur que ce nombre devrait avoir est calculable à partir de "nombre". Le truc c'est que je ne vois pas d'autre possibilité que d'effacer tout si ça ne correspond pas, ce qui est un peu radical

Comments (49)

photo
1

preuve

photo
1

ce n'est pas ce que je veux

dans ton fichier il faut que Ns passe tout seul à 5 (ou en appuyant sur un bouton) si je crée un nouveau segment

photo
1

Je suis désolé mais je ne suis pas en mesure de résoudre le problème.

mi spiace ma non sono in grado di risolvere il problema.

photo
1

Autre question du même genre : étant donnés des segments déjà créés, peut-on en appuyant sur un bouton en connaitre leur nombre ?


voir attaché, du javascript


pour la 1ère question, sur quoi porte la recherche ? le nom de point A ? ou le point de coordonnées (1,2) ?


Les scripts ne sont pas du bel ouvrage, simplement pour te donner des pistes

Edit : les 2 scripts pour points ajoutés

photo
1

ok, donc on peut, merci


la 1ère question est sur le point de coordonnées 1,2), pas son nom.

c'est possible de créer une variable égale au nombre de segments et un booléen égal à l'existence du point (sans fenêtre de message donc) ? et que le script s'arrête tout seul

photo
1

donc on peut faire un convertisseur cistercien-décimal :smile:

c'est à dire la reconnaissance des segments qui composent un nombre écrit en cistercien par l'utilisateur (qui a relié certains des 12 points de la grille) et sa conversion en décimal

photo
1

si je suis ton truc

ça veux dire tester l'existence ou non de 36 segments

et voir si certains existent il n'y a pas de doublet (5, 7 ou 8)ou triplet (9)

photo
1

en copiant-collant je pense que c'est faisable

mais c'est vrai qu'il risque d'y avoir des calculs logiques un peu longs


sinon j'ai trois autres idées :

1) cocher des cases (les extrémités des segments, voir grille2 où je crois qu'il en faut 4 de plus) ;

2) trouver la liste des intersections de la ligne brisée dessinée par l'utilisateur avec un polygone ressemblant au tracé bleu : ces intersections correspondent aux segments existants ;

3) les 12 points de la grille auront pour coordonnées des nombres très proches d'un multiple de 1000 (de sorte qu'on ne voit pas la différence à l'écran avec par exemple (2000,1000)). Et proches de cette façon : les coordonnées seront choisies de sorte que la longueur du segment unité 3 aura comme partie décimale 0,3 celle du segment unité quatre 0,4 etc. Celle du segment dizaine 8 aura pour partie décimale 0,08, celle de milliers huit 0,008 etc. De sorte que le code décimal de l'entier représenté soit contenu dans la longueur de la ligne brisée. Bon il y a le problème des segments diagonaux, mais ça doit pouvoir se résoudre.

Boone journée

photo
1

L'un de vous deux a-t-il testé le lien ci-dessus très brièvement ?

@Rousseau-Wallon: comment pourraient-ils reconnaître que c'est un "bon boulot" (bien que le résultat soit toujours 0)? -- Et pourquoi ne l'utilisez-vous pas et le compléter?

(Commentaires dans JS avec les corrections les plus importantes)

photo
1

j'ai testé la figure ci-dessus pour qq valeurs et ça marche,

par contre ton fichier apéro renvoie effectivement toujours 0

pourtant c'est bientôt l'heure de l'apéro


compléter quoi ? je ne comprends pas

photo
1

Raymond, je ne comprends pas cette remarque, un peu "acide"

Mon fichier fonctionne très bien, tout du moins de mon côté ...

Le seul souci de qualité que je lui trouve c'est de ne pas interdire des segments "illégaux" ou des cohabitations illégales par exemple des segments légaux en X

photo
1

et je confirme ce que vient d'écrire Alain, dans ton fichier apéro.ggb, oui, j'obtiens toujours 0

photo
1

vidéo

photo
1

Raymond tes corrections xy en x,y ne sont pas du tout correctes


corr (all indexOf("xy")) to indexOf("x, y")


j'utilise getDefinitionString(g.getObjectName(i)) qui retourne par exemple Segment [AB], non pas Segment [A, B]

photo
1

Voilà Raymond, c'est un Problème de langue ! en français Segment[AB] en anglais Segment A, B

photo
1

Oui, je viens de le trouver aussi. Aussi l'allemand a le "segment (A, B)"

Je pense que la variante française (de ggb) est fausse. Il n'y a pas d'objet AB.

Désolé pour mes questions pointues.

d7969ae51d127b164afc682cbc2f74be

30f6001852beef77f7e41cb600d39517

photo
1

voilà maintenant cela doit fonctionner dans toutes? les langues


https://www.geogebra.org/m/zdwrt2hf

photo
1

Je pense que la variante française (de ggb) est fausse. Il n'y a pas d'objet AB.


NON ! (ce n'est pas l'objet AB mais le Segment[AB] !)


05764f7bbe2ad1ffbb5e5824ecb59708

photo
photo
1

J'ai souhaité une bonne journée par simple politesse bien sûr,

sinon c'est du bon boulot Noël :-)


J'ai corrigé le bug sur le fichier cistercien, j'ai vérifié et je crois qu'il n'y a plus d'erreur .

pour ma méthode qui consiste à trouver les intersections du tracé bleu avec une représentation cistercienne, je n'arrive pas à les avoir sous forme de liste, c'est possible au moins ?

Dans le fichier ci-joint intersection (f, poly1) ne renvoie que les points..

photo
1

mets des accolades


{Intersection(f, poly1)}

photo
1

résolution partielle par la méthode du "tracé bleu" (voir plus haut)

testée pour 1,2, .... ,9, 10, 20,..... 90, 100, 200, ... ,900, 1000, 2000, ..., 9000

marche pour un cistercien représentable par une ligne brisée appelée f dans le script

reste à convertir un ensemble de segments en une "ligne" appelée f,

ou plutôt à déterminer la liste des intersections de cette ensemble de segments avec le polygone coloré

PS : le script sur le bouton DECHIFFRER utilise le fait que GGB va automatiquement appelé "f" une nouvelle ligne brisée ou un nouveau segment dessiné par l'utilisateur.

photo
1

dans le fichier grille3 ci-dessus, si l'utilisateur dessine des nouveaux segments ils seront appelés f,g,h,i,j,k,l

il n'y a pas un moyen que GGb détermine les intersections de ces segments avec le polygone de cette figure, seulement si ces segments existent ? (sans javascript)

si par exemple le segment k n'existe pas, GGB ne fait rien. Sinon il fait {Intersection(k, polygone)}

photo
1

J'ai trouvé, enfin presque, car il y a un petit bug d'initialisation.

Méthode : dans le fichier joint, GGB nomme automatiquement le premier segment créé par l'utilisateur, il l'appelle f. Ben c'est simple, avec un script sur Polygone, je cherche l'intersection de ce segment avec le polygone, ce qui permet de calculer les codes décimaux correspondants à ce segment. Puis je crée une ligne brisée en ajoutant à elle-même ce segment. Et j'efface le segment f !! Ainsi le prochain segment créé s'appellera encore f !!. Et rebelote, le script sur polygone marchant par actualisation le tour est joué (le script est appelé à chaque fois qu'on clique sur un des 12 points).


J'ai créé un bouton "nouveau" qui initialise, mais il m'envoie une erreur sur f, je n'arrive pas à modifier.

photo
1

voilà qui est mieux, il valait mieux faire un script par clic (sur Polygone)

segments illégaux non gérés

mais possibilité de relier directement deux points symétriques par rapport au support vertical


allez bonne nuit

photo
1

Bonjour,

Bravo cela fonction très bien ! Effectivement, si à chaque réinitialisation on oublie de sélectionner l'outil "Segment" le script signale une erreur par l'absence de f. Il faudrait pouvoir masquer l'icone de l'outil "Déplacer" automatiquement.

Votre solution est astucieuse.


Je me suis permis de rajouter l'image des différents codes cisterciens.

photo
1

Et je pense que c'est beaucoup simplifiable, ma méthode pour récupérer le code décimal ayant de gros calculs. Avec des booléens ça doit être mieux.


J'ai changé l'image à partir de mon fichier Berselius.ggb, elle est plus nette

photo
photo
1

j'ai rendu la plupart des segments illégaux intraçables, par ce script sur chacun des 12 points :

Si(Longueur(f)>8 ∨ EstDéfini(Intersection(f,y=0)),Effacer(f), LanceScriptClic(polygone))


reste à éliminer certaines configurations impossibles, mais c'est plus compliqué

et il y a toujours le problème du message d'erreur quant à la non-existence du segment f si on ne clique d'abord pas sur l'outil segment. Une idée ?

photo
1

setMode(15) en JS je l'ai ajouté au lancement et au bouton "nouveau" (via "toto", lol)


pourquoi "nouveau" ne remet pas "nombre" à 0

photo
1

pourquoi "nouveau" ne remet pas "nombre" à 0 ?

car je n'y arrive pas !

ces scripts ça me passe toujours et encore un peu au dessus de la tête

j'ai essayé nombre = copierobjetlibre(nombre) puis SoitValeur(nombre, 0) dans le script Nouveau, mais du coup il reste à zéro..


ok pour SetMode(15) mais celui qui clique sur Déplacer puit sur un point crée qd même une erreur


dernière minute : éliminer tous les configurations impossibles est possible, car un "nombre " calculé ne correspond alors pas à la longueur de la ligne brisée. Or la longueur que ce nombre devrait avoir est calculable à partir de "nombre". Le truc c'est que je ne vois pas d'autre possibilité que d'effacer tout si ça ne correspond pas, ce qui est un peu radical

photo
photo
1

"ok pour SetMode(15) mais celui qui clique sur Déplacer puit sur un point crée qd même une erreur"

et s'il ne peut pas être en mode Déplacer avant d'avoir créé un segment ?


"Le truc c'est que je ne vois pas d'autre possibilité que d'effacer tout si ça ne correspond pas, ce qui est un peu radical"

moi je pense que ce serait "normal" (avec l'affichage d'un texte)

photo
1

mais le mode Déplacer on n'a pas besoin ... non ?


dans ce cas il suffit de le virer de la barre d 'outils

photo
photo
1

oui j'ai enlevé le bouton déplacer,

et j'ai réussi à mettre nombre à 0 quand il le faut


les configurations impossibles sont maintenant gérées, les segments grossièrement illégaux ne sont pas tracés

et je lance le mode 15 au démarrage (j'ai recopié une ligne de script du forum (merci Michel)


quand la représentation n'existe pas un message apparaît, on peut cliquer sur nouveau ou bien revenir en arrière avec le bouton retour sur la bande d'outils, c'est possible d'inclure ces deux boutons dans la fenêtre de travail ? car on ne pense pas forcément à les utiliser

photo
1

t'as 2 fonctions onInit ? et mieux vaut interdire la création de points à la volée

photo
1

Quelques petites remarques :

Dans l'objet "Image" il y a un script "Par Actualiser" qui ne sert à rien (et que j'ai effacé).

J'ai rendu l'Image non sélectionnable.

Et j'ai remarqué une anomalie concernant la création des segments et par conséquent l'actualisation de la ligne brisée :

- si vous créez le segment en laissant appuyé le bouton gauche de la souris du point de départ au point d'arrivé, le segment est créé mais il ne met pas à jour la liste et donc la ligne brisée ! (Le segment n'est pas vert et il faut l'effacer manuellement).

- sinon si vous commencez par cliquer sur le point de départ puis sur le second point alors cela fonction bien, le segment ainsi crée devient vert et la ligne est bien mise à jour !

photo
1

Avant le départ en vacances de ma zone


un fichier bridé, tout en visuel, pas de problème de langue comme dans mon premier jet,

tout en visuel

(encore du copier/coller comme un pro, mais là non plus dans le javascript mais dans le xml)


https://www.geogebra.org/m/dypscvbr


bonnes vacances pour tous les enseignants/élèves de la zone B

(lundi soir sur la 2, saison 2 de Zone Blanche)

photo
1

super ce SoitValeur(u,Reste(u+1,10)) !

photo
1

le même fichier, dans l'autre sens ...


t'avais un champ texte, des curseurs, un potard .... et ben je rajoute une autre présentation : des listes déroulantes (donc aucun script dans le fichier)


https://www.geogebra.org/m/xdtakcfk

photo
photo
1

fichier en ligne avec image non sélectionnable et un texte de présentation

https://www.geogebra.org/m/gvewvvqg


comment interdire la création de points à la volée ?

J'ai essayé un truc du genre Si( reste( x(sommet(f,2)) , 1 ) > 0, effacer(f) )

mais ça doit marcher de façon permanente et ne peut marcher que si f existe

il doit y avoir un JS j'imagine


ya pas moyen de rendre selectionnable uniquement des points d'un certain calque ?

photo
1

"comment interdire la création de points à la volée ?"


comme c'est fait dans les fichiers que j'ai déposés ici


ggbApplet.setOnTheFlyPointCreationActive(false) dans la fonction ggbOnInit du JS Global

photo
1

Une autre méthode, à mi-chemin entre ta solution visuelle et la mienne où on clique directement sur les segments (voir sujet "Affichage superposé").

le problème de ma solution c'est que parfois on ne clique pas du premier coup sur un segment voulu. J'ai essayé de changer l'épaisseur avec Soitépaisseur(segment, 50) mais ça ne change rien à la zone de cliquage.

Alors j'ai fabriqué des polygones qui englobent chacun de ces segments (voir découpage) et utiliser ton script pour faire un booléen : par exemple SoitValeur(u1, reste(u1+1,2))

seuls les polygones sont sélectionnables

photo
1

Bonjour,

Le même principe mais une réalisation partielles différente :

https://www.geogebra.org/m/rmghw6tn

photo
1

On peut dans certains cas tester l'existence d'un objet sans faire de javascript, par exemple ici l'existence d'un carré d'aire double de celui dessiné. Avec deux boutons.

Question : dans le fichier ci-dessous peut-on faire en sorte que la vérification soit permanente et que le message BRAVO s'affiche dès que l'utilisateur a trouvé la solution, sans cliquer sur un bouton ?

photo
1

une 1ère rmq d'utilisation

j'ai voulu déplacer ton carré en le tirant par un coin

bon OK ce point était "fixe" mais comme la barre de propriétés apparaît je peux cliquer sur le cadenas, et fini le carré lol


il faudrait bloquer la barre de styles


/8DzxSnWe7EmwzAAAAAElFTkSuQmCC

photo
1

c'est bien le réglage dans Options/Avancées ou Affichage/Aspect ?

car j'ai décoché cette case mais ça ne change rien, j'ai toujours accès à la boîte de propriétés

photo
1

moi j'ai testé avec Affichage/Aspect ?

(bon, il doit y avoir aussi le clic droit?)


pour un test "en live" je ne vois qu'une solution : un mouchard listener qui a chaque création d'objets va tester s'il s'agit d'un polygon? quadrilateral? (à fouiller) et si oui si ....

photo
1

et le script du bouton Vérification écrit sur un curseur invisible dont l'animation est lancée à l'ouverture du fichier et dure 10 minutes ?

photo
1

je ne comprends rien ... pas de curseur invisible pas de script global ...


(tu aurais dû créer un nouveau fil afin de nous éviter de dérouler des écrans avant d'arriver au dernier message, si on veut en même temps avoir le message de départ de cette nouvelle question)

photo
photo
1

comme ça

mais comment régler 10 minutes ?

© 2019 International GeoGebra Institute