Élimination temporaire des points d'une liste non visibles

Rousseau-Wallon shared this question 3 years ago
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 ?

Comments (26)

photo
1

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)

photo
1

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 ?

photo
1

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).

photo
1

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 {}

:-)

photo
1

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?

photo
1

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

photo
1

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)

photo
1

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").

photo
1

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é

photo
1

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)

photo
1

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.

photo
1

oui il s'agit de zoom-in-out Koch-flake

voir le sujet sur le zoom, j'ai posté une solution partielle

photo
photo
1

Je pense que c'est ce que vous cherchez

photo
1

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)

photo
1

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

photo
1

yes it works, thanks.

(but my zoom still have a problem because too many points are deleted, i work on it)

photo
1

yes i think my script must works slowly, is it what you are talking about when you say "delay" ? how can i do that ?

photo
1

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:

  • SetValue(timeout, 0)
  • StartAnimation(timeout, true)

The object timeout can (!) have a script OnUpdate

  • If(timeout==1, <do something>, <else do something>)

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:

  • SetValue(timeout,0)
  • StartAnimation(timeout,true)

write in the script onUpdate in timeout:

  • If(timeout==0, Execute(scrBlockZoom), Execute(scrUnblockZoom))

In the algebraview define 2 script-list

  • scrBlockZoom = {"SetValue(XMin,x(Corner(1)))", "SetValue(XMax, x(Corner(2)))", "SetValue(YMin,y(Corner(1)))", "SetValue(YMax, y(Corner(4)))", "ZoomIn( XMin, YMin, XMax, YMax )"}
  • scrUnblockZoom={"ZoomIn(CopyFreeObject(XMin), CopyFreeObject(YMin), CopyFreeObject(XMax), CopyFreeObject(YMax) )"}

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)


  • Execute(scrBlockZoom)

and at end, when all commands are processed


  • Execute(scrUnblockZoom)

======================================================

I see there is a small difference after scrBlockZoom.

I think I know why, for a correcture I need (small) time.

photo
1

here the correct code for the script-lists:

  • scrBlockZoom = {"SetValue(XMin,x(Corner(1))+pixX)", "SetValue(XMax, x(Corner(2))-pixX)", "SetValue(YMin,y(Corner(1))+pixY)", "SetValue(YMax, y(Corner(4))-pixY)", "ZoomIn( XMin, YMin, XMax, YMax )"}
  • scrUnblockZoom = {"ZoomIn(CopyFreeObject(XMin), CopyFreeObject(YMin), CopyFreeObject(XMax), CopyFreeObject(YMax) )"}

The 2 script-lists need the following definitions

  • XMin=0
  • XMax=0
  • YMin=0
  • YMax=0
  • pixX = Distance(Corner(1), Corner(2)) / x(Corner(5) + (2, 2))
  • pixY = Distance(Corner(1), Corner(4)) / y(Corner(5) + (2, 2))

The problem is that there is a 2 pixel-difference between the corner-value and the real value of the windows.

photo
1

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'.

photo
1

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.

photo
1

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

Files: koch.ggb
photo
1

Le problème principal est GGB dans la phase initiale.

La fenêtre a initialement la taille 0 et change environ 5 à 10 fois jusqu'à ce que tout soit initialisé du point de vue de GGB. Le script dans Corner2 est souvent exécuté , bien que rien n’ait encore été initialisé.

Le curseur iniTimeOut devrait empêcher cela.

Malheureusement, iniTimeOut ne peut être démarré qu'en JavaScript global.

c1e68cb1589c22b861e8bb8f22ce0a8a

Je soupçonne que la ligne 4 est nécessaire (mais n"a rien à voir avec iniTimeOut )

De plus, j"ai changé:

- nouvel objet iniTimeout

- Script dans coin2: Si(iniTimeOut==1, .......................... )

Sans les modifications ci-dessus, je reçois un message d'erreur dans le script coin2. Cela ne se produit pas maintenant (GGB 5.0.507 Windows 10).

photo
1

ok merci, ça marche pour moi aussi.

pourquoi le script est-il dans coin2 ? c'est nécessaire ou on peut le mettre n'importe ou ailleurs ?

photo
1

Tous les scripts sont exactement où ils doivent être.

Si vous parlez de Javascript, vous appelez cela le script Java global. Ce script peut être appelé depuis n'importe quel objet. Mais il n'est pas affecté à ceci ni à aucun autre objet.

photo
photo
1

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

© 2021 International GeoGebra Institute