Maths et Prog Java

Postez ici tout ce qui ne concerne ni RO ni Prontera.fr. Expression libre ^_^ (dans la limite du raisonnable ;p)

Maths et Prog Java

Messagepar myrtill » 19 Août 2008 10:27

Amis codeurs et autres mecs intelligents, j'ai besoin de vous.

Problème n°1 (java) :
Imaginez une room (dans un chat). Elle est sensée contenir tous les clients qui y sont actuellements connectés.
Soit, un Vecteur qui se rempli d'objet "client".
Imaginons maintenant que ces clients puissent changer certains tag (variables), comme : afk, Dnd, saickstime etc etc etc

Actuellement, retournant la référence de mon objet pour l'ajouter dans le vecteur, je suis obligé, quand je parcours ce vecteur, de caster ma référence en objet de type client et ensuite vérifier les variables en appelant les methodes adéquate.

La question que je me pose, c'est que ce travail est-il gourmand ou pas ? Car si oui, ne serait-il pas plus judicieux de faire un vecteur pour les clients afk, un autre pour les clients dnd etc etc etc, afin de pas parcourir tous les clients si je ne veux que ceux qui sont afk ? Avec ce concept, je diminue les ressources proc en augmentant ma quantité de ram utilisé ?

(Si vous avez compris, GG)

Problème n°2 (Maths) :
Soit une matrice deux dimensions (x, y), un tableau quoi :o :
Chaque case de la matrice est un Boolean, soit 0 ou 1.
Imaginons alors que cette matrice est une map d'un jeu et qu'un client peut se déplacer a l'intérieur.
Imaginons aussi par simplicité que l'angle de vision d'une personne est de 180.

Je cherche à savoir la formule mathématique à appliquer pour trouver toutes les celules de la matrice visible suivant la position (et l'orientation) du client.

Si une case est à 0, c'est un mur, et donc on doit considérer qu'on ne voit plus ensuite. Sinon, pas de soucis.
Voici un petit tableau pour illustrer mon problème :
Image
Si le point blanc correspond au client, on est d'accord qu'il ne peut voir que le vert et non le rouge, a cause du mur a sa gauche. Mais comment calculer ca ? Est ce gourmand en ressources (imo oui) ?
Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Re: Maths et Prog Java

Messagepar patos » 19 Août 2008 10:57

Pb n°1:
Le status, c'est qu'une info. C'est pas parce que tu es BRB que personne te causera. Je te dirais donc que je ne vois pas où est la question :P

Pb n°2:
Objet case->estcequ'onvoitàtravers? Définir la ligne de vue (180° en face de lui je suppose?) et recalculer à chaque tir.

Le calcul se fait par récursivité. Chaque case regarde si les autres cases sont visibles par rapport à elles depuis un côté / coin. Ainsi, tu calcule pas trop et tu as une ligne de vue efficace.
\o/ [o] [o_ |o| !!

Avatar de l’utilisateur
patos
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 8818
Inscrit le: 13 Déc 2004 22:23
Localisation: Ben je roule alors je bouge

Re: Maths et Prog Java

Messagepar myrtill » 19 Août 2008 12:57

Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Re: Maths et Prog Java

Messagepar Nawa » 19 Août 2008 13:12

pour le problème n°2 : au final ton client il aura une vue de dessus?
tu veux fonctionner par cases ( dames, échecs )? ou par intersections (go)? Parce que en pratique ça fait bouger l'emplacement de ton point blanc, imo. Et ça peut sans doute changer les lignes de vue, donc le code.
Nawa
1st Class - LV 12
1st Class - LV 12
 
Messages: 125
Inscrit le: 06 Juil 2007 15:51

Re: Maths et Prog Java

Messagepar patos » 19 Août 2008 13:50

Vecteur de client = la meilleur méthode car tu as accès à tout... comme je te l'ai déjà dis par tel...
\o/ [o] [o_ |o| !!

Avatar de l’utilisateur
patos
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 8818
Inscrit le: 13 Déc 2004 22:23
Localisation: Ben je roule alors je bouge

Re: Maths et Prog Java

Messagepar myrtill » 19 Août 2008 15:12

PB n° 2
Pour l'instant je m'oriente vers une vue de dessus, vu que le support client serait en flash. (ce qui me limite fortement xD)
Je ne souhaite pas vraiment faire de cases à la RO, mais un system plus libre, ou le joueur déplace ses persos au clavier.
On se rapproche du pixel par pixel.

J'ai du mal à voir ta comparaison avec le Go.

Par contre, je reviens sur ce que tu disais patos.
En fait, je vois pas du tout comment tu gères l'angle de vue pour trouver les pixel visibles après le mur. Car dans le schéma du dessus, typiquement, faudrait tracer une ligne entre le point blanc et le pixel repéresantant le mur au plus à droite. D'ailleurs je me rend compte que mon dessins est faux. Une case n'est pas un pixel, mais une intersection dans mon quadrillage.
Enfin bref, si je sais que mon pixel qui représente le mur n'est pas visible, je peux savoir si celui du dessus l'est à partir de la position latérale de mon client. Mais à partir de ce pixel du dessus, comment savoir si celui de gauche le sera. Ca dépend de l'angle en fait.

Rah c'est ultra pas clair, faut que je schématise :p Hop voila :
Image

Voila, est ce que c'est mieux xD ?
Typiquement, faudrait que je me serve de ce genre de ligne a chaque fois que la ligne de vue est coupée. Mais je vois pas comment l'implémenter.

PB n° 1
Je t'avoues que je me souviens pas de tout ce dont on avait parlé l'autre fois. Tu parlais un langage inconnu à l'époque xD
Enfin même si je pige un peu mieux, je pense que tu arriveras encore à me paumer :mrgreen:
Donc ok, osef de recaster un objet client en entier, on se fait pas chier.
Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Re: Maths et Prog Java

Messagepar patos » 19 Août 2008 15:27

Désires-tu que les cases mi-visible le soient?
\o/ [o] [o_ |o| !!

Avatar de l’utilisateur
patos
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 8818
Inscrit le: 13 Déc 2004 22:23
Localisation: Ben je roule alors je bouge

Re: Maths et Prog Java

Messagepar myrtill » 19 Août 2008 15:31

Vu qu'un pixel se trouve a l'intersection du quadrillage, je serais tenté de dire que (dans l'exemple qu'on a plus haut), tout ce qui se trouve a droite de la ligne est visible, tout ce qui se trouve a gauche ne l'est pas. Donc la réponse serait oui et non, ca dépend du centre du pixel :p
Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Re: Maths et Prog Java

Messagepar patos » 19 Août 2008 15:32

Donc tu dois tester pixel par pixel...... bon courage !
\o/ [o] [o_ |o| !!

Avatar de l’utilisateur
patos
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 8818
Inscrit le: 13 Déc 2004 22:23
Localisation: Ben je roule alors je bouge

Re: Maths et Prog Java

Messagepar myrtill » 19 Août 2008 15:38

En gros oui. Mais j'arrive pas à voir comment faire ca au niveau mathématique quoi. Je pense qu'en math on doit voir ca, genre tous les mecs qui ont fait math spé toussa XD
Doit bien éxister des fonctions mathématique pour faire un truc dans le genre non :mrgreen: ?
Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Re: Maths et Prog Java

Messagepar psykokarl » 19 Août 2008 15:55

problème 1:

En algorithmique, si ton code est bien conçut, ce que tu gagnes en temps de calcul tu le perds forcement en espace mémoire libre. Le choix d'une solution plutôt qu'une autre dépend des contraintes auquel sera soumit ton logiciel (nombres de clients, modification des variables fréquentes, évolutions envisagées du code, etc...)

Avec le vecteur unique:
- il y a qu'une ressource vecteur (moins d espace utilisé)
- on ne teste pas le tag de chaque client (gain de temps)
- on doit parcourir toute le vecteur de client et tester chacun d entre eux si on veut faire du traitement en fonction du tag (perte de temps a chaque traitement de client par lot)
- si le client change de statuts il reste en place mais il faudra peut être se retaper toute la liste pour le traiter ultérieurement.

Avec un vecteur par statuts:
- il y a autant de ressource supplémentaire que de vecteur (perte de place de moins en moins significative a mesure que le nombre de client augmente)
- on teste le tag de chaque client pour le ranger dans le vecteur approprié. (perte de temps quand le tag change)
- on parcourt la liste qui correspond au tag (gain de temps)
- si le client change de statuts il faut changer le changer de vecteur .

Tu peux en revanche garder les avantages deux systèmes en optant pour un vecteur unique et en créant des vecteurs de références sur chaque élément. Tu peux également optimiser le temps nécessaire a la modification des tag en créant un système de références dans chaque client. Tu te retrouves avec un système performant en vitesse qui ressemble a ce qui est utilisés avec les bases de données relationnelles. Par contre ta consommation mémoire va exploser si tu code ça en objet sans parler de la difficulté liée à la conception du code et du garbage collector qui sera hyper-sollicité.

problème 2:
Il ne faut pas confondre raytracing et raycasting. Dans ton cas le raycasting est suffisant pas besoin de calculer pixel par pixel tu prends le barycentre du mur au premier plan et ses dimensions, puis tu fais un clipping par rapport a ce que cache ce mur.
C'est pas comme si on te demandais de faire du traitement d'image.

edit :
http://student.kuleuven.be/~m0216922/CG/raycasting.html

Si tu trouves pas ton bonheur dedans :3 !!§!
Avatar de l’utilisateur
psykokarl
2nd Class - Rebirth
2nd Class - Rebirth
 
Messages: 1281
Inscrit le: 13 Déc 2004 22:23
Localisation: devant son ecran 24 pouce !1!one§eleven!

Re: Maths et Prog Java

Messagepar myrtill » 19 Août 2008 17:27

merci pour les infos psykokarl.
Ton lien est intéressant, mais il y a surtout des infos pour faire une sorte de pseudo 3D (avec placement de la caméra etc).
De mon coté, c'est pour une application serveur qui doit gérer les déplacements et ce que les clients voient dans la map suivant leur placement et leur orientation.

Je ne renvoi a chaque client qu'une information sur la position des joueurs/mur etc.
Tout de fois c'est très intéressant et j'en apprend pas mal avec ce que tu m'as donné. Je vais me tourner vers le DDA (j'ai du mal à voir ce que c'est) et comprendre comment ils font dans l'exemple pour l'adapter à ce dont j'ai besoin.
Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Re: Maths et Prog Java

Messagepar sitouanang » 19 Août 2008 18:09

>> Client temp=(Client) listclient.elementAt(i);

les cast d'éléments de vecteur c'est moche x)

utilise plutot les nouveaux trucs dans java :

>> Vector<Client> listclient = new Vector<Client>();


->Ca cast automatiquement tout ton vecteur en élément Client à la création, et donc plus besoin de lancer le cast a chaque ligne de code dans ta méthode :)


Après pour le coût de cette opération je connais pas, c'est du java après tout xD
Image
euRO c'est fini pour moi >:3
Aion - serveur Urtem -
Avatar de l’utilisateur
sitouanang
2nd Class - LV 98
2nd Class - LV 98
 
Messages: 837
Inscrit le: 13 Déc 2004 22:23
Localisation: entre du yop fraise et une boite de cookies

Re: Maths et Prog Java

Messagepar myrtill » 19 Août 2008 19:19

A vrai dire, le coût à la création, je m'en fou. La quantité de mémoire used aussi. C'est surtout celui à l'utilisation quotidienne ensuite.
Je test ca de suite, merci pour l'info !

edit : omfg, comment ca m'aide trop niveau code en plus.
On serait pas loin irl je t'aurais payé une bière !

(enfin je devrais pas dire ca, sinon patos va se pointer chez moi et je vais devoir lui payer un tonneau mini -_-)
Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Re: Maths et Prog Java

Messagepar patos » 20 Août 2008 08:24

\o/ [o] [o_ |o| !!

Avatar de l’utilisateur
patos
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 8818
Inscrit le: 13 Déc 2004 22:23
Localisation: Ben je roule alors je bouge

Re: Maths et Prog Java

Messagepar myrtill » 20 Août 2008 08:51

Ce que je veux pas, c'est avoir à recalculer toute la zone visible d'un client dans une room (comprendre, d'un joueur dans une map), a chaque déplacement. Vla l'usine à gaz et la chute de perf si 300 personnes bougent en même temps :?

Il faudrait qu'au login je lui affiche tout, mais qu'a chaque déplacement je n'affiche que le delta, que ce qui n'était pas visible avant et qui l'est maintenant.

J'ai eu une idée ce matin, faire pour chaque client une représentation de son écran. Suivant ses coordonées, je pointe sur les cellule correspondantes dans la map réelle et je change ce que j'ai a changé uniquement a chaque déplacement. Avec ca par contre, je vais avoir pas mal de decallage a gauche / droite / haut / bas a faire pour chaque client.

schéma :
Image


L'avantage c'est queje pourrais tager toutes les cellule en Boolean Visible True or false.
Donc a chaque orientation (sans changer de position), je n'ai pas à calculer un truc immense, juste a changer un tag dans les cell correspondantes.
Cet espece de screen virtuel allant pointer vers les cellule de la map originale, tout changment dans cette map sera répercuté automatiquement chez les clients.

Bon ? Mauvaise idée ?
Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Re: Maths et Prog Java

Messagepar patos » 20 Août 2008 09:33

Avant de dire comment tu dis que c'est visible, cherche d'abord comment le calculer...
\o/ [o] [o_ |o| !!

Avatar de l’utilisateur
patos
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 8818
Inscrit le: 13 Déc 2004 22:23
Localisation: Ben je roule alors je bouge

Re: Maths et Prog Java

Messagepar myrtill » 20 Août 2008 09:52

Je pensais parcourir chaque cellule de la zone normalement visible (assez facile avec un angle de vision d'un client de 180°).
Je skip si la cellule contient un mur ou tout autre objet bloquant ou est déjà tagée. Si ce n'est pas le cas, je lance alors une fonction qui vérifie la ligne de visée entre cette cellule et mon client.

Plus j'avance et moins j'ai de cellule à calculer.
Schéma ! (vous l'aurez devinez, je me fais chier au taff xD)
Image


On considère que la personne regarde vers le haut

Ligne 1
cell 1 -> mur, on skip
cell 2 -> mur, on skip etc etc etc ....
cell 8 -> pas de mur, on calcul la visée entre la cible et le client. On tag chaque cellule lors du parcours en visible ou non.

ligne 2
Cell 1-> pas de mur, ligne de visée, on tag etc
Cell 8 -> déjà tagée car déjà calculée en ligne 1, on skip.


Ca doit marcher, par contre, je dois tout recalculer a chaque déplacement quand même. Faut que je trouve une méthode pour savoir qu'en me déplacment, je change l'angle de vision et je ne dois changer que ce qui est maintenant visible.
Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Re: Maths et Prog Java

Messagepar patos » 20 Août 2008 10:21

Et pourquoi tu ne calculerais pas, pour chaque case qui a subit un déplacement, pour chaque face/coin, un facteur de visibilité depuis les 8 cases qui l'entourent. Cela te fait 64 calculs, et ensuite tu ne fais que "lire" si une case et visible ou non, par récursivité.
\o/ [o] [o_ |o| !!

Avatar de l’utilisateur
patos
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 8818
Inscrit le: 13 Déc 2004 22:23
Localisation: Ben je roule alors je bouge

Re: Maths et Prog Java

Messagepar myrtill » 20 Août 2008 10:38

J'ai du mal à voir ta facon de faire en te déplaçant de case en case, puisque suivant l'angle du client avec le mur, on verra plus ou moins les cellules derriere.
Avatar de l’utilisateur
myrtill
Rebirth - LV 98
Rebirth - LV 98
 
Messages: 6367
Inscrit le: 12 Mars 2005 10:32

Suivant

Retour vers Off-Topic

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit and 2 invités

cron