Élimination temporaire des points d'une liste non visibles
Answered
Bonjour,
J'ai créé par une commande une liste de points L = { (x1,y1), ... , (xN,yN) }.
La commande en question peut se résumer par :
L = CopierObjetLibre[L]
SoitValeur[L, GarderSi[a < x(A) < b ∧ c < y(A) < d, A, L']]
avec L' une liste créée par une séquence sur L
et a = x(coin[1]), b = x(coin[3]... etc.
De sorte qu'à chaque itération de la séquence la nouvelle liste L ne contienne que les points de L' qui soient visibles à l'écran.
Le problème c'est que je n'arrive pas à ACTUALISER cette sélection de points : lorsqu'un point est supprimé et que je décale le graphique ou que je zoome pour qu'il apparaisse de nouveau ça ne marche pas.
Il faudrait faire en sorte que le calcul de L se fasse tout le temps. Comment faire ?
Bonjour,
Ce n'est pas vraiment ce que vous demandez. Mais peut-être que cette (simple) suggestion est suffisante.
.
Supplément :version améliorée 02 (avec delete et nouveaux points)
oui ça marche car votre liste VisiblePoint n'est pas un objet libre, elle dépend de AllPoints
mon problème c'est que la liste avec laquelle je dois faire ce tri est libre, le tri est donc fait une fois et une seule.
la définir libre n'était pas une bonne idée je pense car ça conduit à une impasse.
je l'ai défini ainsi pour y ajouter des points (ou en enlever) sans qu'elle change de nom.
il doit bien y avoir une autre méthode ?
Et qu'est-ce qui n'est pas bon dans la version 02 ?
Peut-être complété par un outil utilisateur qui crée un nouveau point (avec le prochain nom libre Ann).
Je pense que je peux utiliser la fonction Itération mais je bute dessus :
pourquoi Itération[Ajouter[liste, 2], liste, {}, 5]
ne donne--til pas la liste {2,2,2,2,2} ??
ah ok il faut mettre {{}} à la place de {}
:-)
Je ne comprends pas le sens / but / idée de cette commande.
(peut-être une "déformation professionnelle" de ma part).
------------------------------------------------
Supplément: Vous voulez peut-être dire:
IterationListe(<expression>, <variable>, <valeurs de début>, <nombre>)
Oui, c'est possible, mais ce serait plus facile
Itération(2, n, 1.5)
-------------------------------------------- ------ --------------------------
erreurs réservées: je pense qu'il n'y a que deux possibilités
(supprimer ou créer de nouveaux points par utilisateur)
- réalisation avec Java -Script et "Listener"
- réalisation avec table
ou peut-être comme alternative: déplacer les points dans une zone neutre
---------------------------- ----------------------
Et qu'est-ce qui ne va pas dans la version 02?
J'y suis arrivé avec une séquence du type Itération[Séquence sur L, L, {{}}, n]
ainsi ma liste est construite comme dépendante et est donc réactualisée lorsque je zoome ou quand je déplace le graphique
merci pour la version 2 ça marche aussi
mais pas si VisiblePoint est définie comme libre : par exemple en faisant VisiblePoint = copierobjetlibre (visiblepoint)
(mais votre définition avec GarderSi n'est alors plus valable)
D'accord.
Mais je ne comprends pas pourquoi VisiblePoints (ou AllPoints) devrait être un objet libre (dans version 02).
Mais je pense que VisiblePoints serait possible libre s’il le fallait (si tous les points portent le nom "Ann").
il le fallait pour ma figure initiale, pour la réactualisation
comment ça si tous les points s'appelaient "Ann" ? Je suis très intéressé
Supprimer un point
Insérez un point
et renommez-le en Ann (example A10) (une position libre dans le tableau)
(fonctionne également dans la version 02)
IJ'ai une suspicion:
pas l'utilisateur mais le programme supprime et définit les points.
Peut-être que le contexte est: zoom-in-out Koch-flake ??????
Et seule la zone visible est calculée. Mais basé sur la dernière "image".
Si c'est le cas: c'est un problème complètement différent, et pour moi actuellement unsolvable (mais intéressant)
--------------------------
Remarque: une réponse peut difficilement être meilleure que la question.
Je pense que c'est ce que vous cherchez
ben mince alors j'ai le même problème avec cette figure VisiblePoints04 qu'avec celle de Noël l'autre jour :
lorsque je clique sur les Propriétés de n'importe quel objet ça rame et ne s'ouvre jamais.
et il y aussi Curve non défini et Point (dépendant) non défini affichés dans le menu algèbre comme je l'ai signalé hier. Etrange.
(je suis sur Mac OS Sierra version 10 et j'utilise GeoGebra 5)
Ok,
Entrez à la main
ou importer VisiblePoints04.ggb dans la version web: https://www.geogebra.org/classic
----------------------------------------------------------
Saisie:
AllPoints ={}
VisiblePoints={}
Corner2 = Coin(2)
.
Créer un bouton "initial" avec scriptOnKlick
SoitValeur(AllPoints, {(-4, 4), (-4, 0), (-4, -4), (0, 4), (0, 0), (0, -4), (4, 4), (4, 0), (4, -4)} )
.
Script in Corner2 onUPdate
SoitValeur(VisiblePoints, GarderSi(EstDansRégion(P, Polygone({Coin(1), Coin(2), Coin(3), Coin(4)})), P, AllPoints))
.
# here you can do more
# for example Insert or delete or move points in AllPoints
# or move VisiblePoints to AllPoints and then change AllPoints
.
# I think it's also possible to auto-shift the focus but then (maybe !)
# you must supress the code-execution here in onUpdate Corner2
.
# maybe you must also supress the code-execution in the
# initial-time of applet and/or you must install a delay in
# the initial-time
yes it works, thanks.
(but my zoom still have a problem because too many points are deleted, i work on it)
yes i think my script must works slowly, is it what you are talking about when you say "delay" ? how can i do that ?
The principle of any delay (or timeout) is alway the same:
there exist a slider "timeout" with min = 0 and max=1 and step = 1 and Repete = increase once.
For start the timeout you use the following script:
The object timeout can (!) have a script OnUpdate
But is also (or only) possible to use the command above in (other) scripts.
This possibility is used when some scripts should not run when the timeout is active.
In some applets with long script - processes or with a big dependency to the window-size this can eliminate problems in the initial-phase.
--------------------------------------------------------------------------------------------
In your case (maybe and as sample) you want to ensure that the zoom-in-out or shift axis is blocked for a defined time
(the following code is not tested)
write in Corner2 onUpdate at beginning:
write in the script onUpdate in timeout:
In the algebraview define 2 script-list
I'm not sure but maybe this method is too hard (too jerky). Then use a (Circle-) slider instead of the mouse wheel.
--------------------------------------------------------------------------
But I think it is enough when you write at beginning of script in Corner 2 onUpdate
(without timeout)
and at end, when all commands are processed
======================================================
I see there is a small difference after scrBlockZoom.
I think I know why, for a correcture I need (small) time.
here the correct code for the script-lists:
The 2 script-lists need the following definitions
The problem is that there is a 2 pixel-difference between the corner-value and the real value of the windows.
Pour l'instant j'ai juste adapté votre script sur corner2 mais ça ne marche pas (message d'erreur). Je n'arrive pas à le corriger. Ce script doit donner la valeur L' (privée des points hors-cadre) à L si c> 50, et ne rien faire sinon.
SoitValeur(L',f(L))
SoitValeur(L', GarderSi(EstDansRégion(P, fenêtre), P, L'))
SoitValeur[L, Si(c>50,L',L)]
La fonction f sur une liste L marche, je l'ai testé séparément.
le nombre c varie quand on zoome, et aussi quand L passe à L'.
S'il vous plaît envoyer l'état actuel de l'applet, qui produit l'erreur.
Lequel de mes (divers) scripts avez-vous adapté et quel est le but / sens de ce changement?
J'espère reconnaître ce que les belles lettres (L, f, c, L' et probablement d'autres) signifient et ce qu'elles doivent faire.
Bon j'ai modifié le script pour n'en faire qu'une seule ligne, et là ça marche.
SoitValeur[L, Si(c>50,GarderSi(EstDansRégion(P, fenêtre), P, f(L)),L)]
Mais je ne sais pas pourquoi le premier ne marche pas... je pense que ne comprends rien à ce que c'est qu'un script...
Quoi qu'il en soit je vous envoie le fichier, mais attention ça bug :
- il faut sans doute agrandir la fenêtre pour que les points ne soient pas éliminés trop vite
- je comprends mal le réglage limite sur le nombre c.., il faut trouver un équilibre avec la taille de la liste L qui ne doit pas être trop grande
- je crois qu'un zoom-in à l'infini (ou presque :smile:) est faisable, mais le zoom-out doit être plus compliqué
PS : f : x -> y
x = un point A et son suivant B d'une liste
y = la liste des 5 points {A,G, H, I, E} fabriqués par l'outil classique KOCH
and c is, i was thinking, the lenght (in pixels) of a side of the actual snowflake. But i think now it's not, because sometimes L become L' without c>50
il y une meilleure façon de calculer c : on divise le côté du triangle équilatéral de départ (sqrt(3) ici) par 3^n, où n est le nombre de fois où le script a fonctionné.
il faut installer un compteur
Comments have been locked on this page!