Annonces Google
Serveur IRC
Serveur : irc.portlane.se
Canal : #AmigaNG
Activité du Site

Pages vues depuis 25/07/2007 : 25 251 384

  • Nb. de membres 187
  • Nb. d'articles 1 270
  • Nb. de forums 19
  • Nb. de sujets 20
  • Nb. de critiques 24

Top 10  Statistiques

Index du forum »»  Création-Développement »» J'ai besoin d'aide

J'ai besoin d'aide#942

2Contributeur(s)
artblinkalex
3 Modérateur(s)
K-LElwoodcorto
artblink artblinkicon_post
Bonjour,

Oui, j'ai besoin d'un petit coup de main pour les hollywoodiens qui ma?trise les tableaux.

J'explique,

J'ai un tableau avec les coordonnées Zmoy,X,Y,Z,D

Le voici:

PT[0 à 95]={PZM=ZM[I],PX=X[I],PY=Y[I],PD=D[I]}

Se tableau m'a l'air Ok, mais comment fait-on pour trier se tableau en fonction de PZM, je veux que la valeur de PX,PY et PD suive la valeur trié de PZM

ex:

PT[0]={9,5,3,7,9}
PT[1]={8,4,4,8,2}
PT[3]={5,8,6,8,2}

Une fois trié, je veux que mon tableau soit comme sa:
PT[0]={5,8,6,8,2}
PT[1]={8,4,4,8,2}
PT[2]={9,5,3,7,9}

Quelqu'un sait? c'est pour trié les coordonnées afin d'afficher en premier le triangle le plus éloigné. Comme sa, plus d'erreur d'affichage lors d'une rotation.

Si j'arrive à faire sa, j'optimise le truc et hop, vous avez un code hollywood pour afficher des objet 3D surface pleine SANS ERREUR d'affichage. Car à la fin, je donne toujours tous ;-)

Merci du coup de main

Respect
alex alexicon_post
La première (et meilleure) solution serait d'insérer les éléments dans ton tableau de manière triée.
Si ce n'est pas possible peut-être pourrais-tu implémenter un tri rapide (qsort) : pour cela réfères-toi à Internet, par exemple Wikipedia où tu trouveras l'explication et même l'algorithme à utiliser.
--
AmigaOne A1222
AmigaOne X1000 - RadeonHD - 2 Gio RAM
AmigaOne XE G4@933 - Radeon 9200 SE - 512 Mio RAM
artblink artblinkicon_post
Bin, je voudrai bien, mais je n'ai pas de corrélation entre les différentes coordonnées... mais je buche.

Merci pour le lien, sa m'apprend encore plein de truc... c'est l'éclate n'hollywood

Sinon, j'ai une méthode pourri, attention, accroche toi toto lol

Je sauvegarde les coordonnées dans un fichier et je les récupère en les triant... lol moi je voudrais faire sa mais avec la mémoire, pas le DD, mais avec le fichier, sa marche PTDR

Donc c'est que je suis pas loin... vive la bidouille

Merci alex

Au fait, je sais pas si tu connais les différences, mais c'est quoi le plus rapide (pour le proc):

Add x,1 ou x=x+1

Les fonctions logiques sont-elles plus rapide que des test if (comme sur un automate)?

Merci pour les infos

Respect
alex alexicon_post
Je ne connais pas Hollywood et je ne sais pas comment ton tableau est déclaré ou rempli.
Si tu arrives à le trier en le rechargeant depuis un fichier je ne vois pas pourquoi tu n'y arriverais pas en mémoire, il te suffit juste de créer un nouveau tableau et d'y insérer les éléments depuis l'ancien tableau. Le seul problème de cette solution c'est :
1) elle n'est pas optimale en terme de rapidité d'exécution,
2) elle n'est pas optimale en terme de mémoire utilisée (à un moment donné tu as deux tableaux en mémoire).

Dis-moi comment tu accèdes aux divers éléments de ton tableau et je te ferais une esquisse du code à utiliser (utilisation des notions de fonctions, récursivité, boucle, etc.).

Pour ta question sur l'optimisation je ne peux pas te dire ça dépend de la façon dont c'est implémenté dans Hollywood, seul l'auteur pourra te répondre sur ce point. Toutefois je serais tenter de dire que "Add x,1" peut plus facilement être optimisé que x=x+1 (enfin avec un compilateur/optimiseur bête qui ne voit pas que c'est la même chose).
--
AmigaOne A1222
AmigaOne X1000 - RadeonHD - 2 Gio RAM
AmigaOne XE G4@933 - Radeon 9200 SE - 512 Mio RAM
artblink artblinkicon_post
oula... lol...

Bon, j'espère que tu va comprendre car dans mon esprit c'est clure (lol) mais pour expliquer, 20 di diou c'est différent.

Commencont

Tableau des X sur 96 lignes (0 à 95)
X[I]=(X1*CO[AZ]+Y1*SI[AZ])
Tableau des Y (idem que X)
Y[I]=(-X1*SI[AZ]+Y1*CO[AZ])
Tableau des Z
Z[I]=CZ+ZZ[I]
Tableau des D (calcule vectoriel)
D[I]=(Sqrt(X[I]^2+Y[I]^2+Z[I]^2))

Calcule des Zmoyen pour chaque triangle
For I=0 To 95
T=I
If T=94 Then T=0
If T=95 Then T=1
ZM[I]=(ZZ[I]+ZZ[T+1]+ZZ[T+2])/3
Next

Je mets toutes les données dans un tableau plus complexe
For I=0 To 95
PT[I]={PZM=ZM[I],PX=X[I],PY=Y[I],PD=D[I]}
Next

ICI, le trie

et tableau des coordonnées X,Y des triangles

XE[I]=MouseX()+(PT[I].PX*PT[I].PD)
YE[I]=MouseY()+(PT[I].PY*PT[I].PD)

voila le code

Si tu comprend, déjà, BRAVO lol

Si tu y arrive pas, c'est pas grave... ;-)

Merci de ton aide

Respect
Message édité par : artblink / 20-12-2010 20:16
alex alexicon_post
Bon alors voilà, je reprécise que je ne connais pas du tout Hollywood, j'ai fait deux trois recherches pour la syntaxe et je n'ai pas testé mon code (forcément puisque je n'ai pas Hollywood). Ce code ne fonctionne (enfin j'espère) que pour le tableau avec la structure PZM, X, Y et D.



Function tri_rapide(tableau, premier, dernier)
    If premier < dernier
        Local pivot = choix_pivot(tableau, premier, dernier)
        pivot = partitionner(tableau, premier, dernier, pivot)
        tri_rapide(tableau, premier, pivot-1)
        tri_rapide(tableau, pivot+1, dernier)
    EndIf
EndFunction

Function choix_pivot(tableau, premier, dernier)
    ; on choisit toujours le premier élément comme pivot
    return(premier)
EndFunction

Function partitionner(tableau, premier, dernier, pivot)
    echanger(tableau, pivot, dernier)
    Local j = premier
    For Local i = premier to dernier-1
        If tableau[i].PZM <= tableau[j].PZM
            echanger(tableau, i, j)
            Add(j,1)
    Next
    echanger(tableau, dernier, j)
    Return(j)
EndFunction

Function echanger(tableau, index1, index2)
    ; on mémorise les valeurs liées à index 1
    Local PZM = tableau[index1].PZM
    Local X = tableau[index1].X
    Local Y = tableau[index1].Y
    Local D = tableau[index1].D
    
    ; on recopie les valeurs liées à index2 dans index1
    tableau[index1].PZM = tableau[index2].PZM
    tableau[index1].X = tableau[index2].X
    tableau[index1].Y = tableau[index2].Y
    tableau[index1].D = tableau[index2].D
    
    ; on recopie les valeurs mémorisées dans index2
    tableau[index2].PZM = PZM
    tableau[index2].X = X
    tableau[index2].Y = Y
    tableau[index2].D = D
EndFunction



maintenant dans ton code il te suffit d'ajouter la ligne


tri_rapide(PT, 0, 95)


là où tu avais mis "Ici le tri"
--
AmigaOne A1222
AmigaOne X1000 - RadeonHD - 2 Gio RAM
AmigaOne XE G4@933 - Radeon 9200 SE - 512 Mio RAM
artblink artblinkicon_post
Merci,

Dis donc, c'est cohérent sa!!! sa m'a l'air plus que pas mal... J'essai de le traduire pour hollywood et je fais un retour

Respect
alex alexicon_post
c'est censé être déjà en Hollywood ;-)
--
AmigaOne A1222
AmigaOne X1000 - RadeonHD - 2 Gio RAM
AmigaOne XE G4@933 - Radeon 9200 SE - 512 Mio RAM
artblink artblinkicon_post
lol... brut de but sa marchera pas ;-) mais tu m'a donné la technique.

J'ai quelques erreurs, mais c'est déjà pas mal.
alex alexicon_post
Ah ??
Tiens en me relisant je me rends compte qu'il manque un EndIf dans la fonction partitionner juste avant le next.


Si tu peux me dire les messages d'erreur, peut-être que je pourrais t'aider à corriger les problèmes ??
Sinon y a pas d'autres pratiqueurs de Hollywood ici sur le forum ?
--
AmigaOne A1222
AmigaOne X1000 - RadeonHD - 2 Gio RAM
AmigaOne XE G4@933 - Radeon 9200 SE - 512 Mio RAM
Petites Annonces

0 annonce(s) publiée(s)

Consulter

AmigaOS 4.1

Laissez-vous tenter par
AmigaOS 4.1
AmiTheme

AmiTheme