2015-07-26 1 views
1

Je fais un jeu en mosaïque en java et je veux faire une carte légère.Faire un cercle dans une matrice (Carte de lumière de jeu basée sur des tuiles)

J'ai quelques problèmes. J'ai le tableau lightmap qui a placé des lumières qui affectent le tableau. Les lumières émettent en forme de cercle. Cela semble correct jusqu'à présent mais ce n'est pas exactement ce que je voulais.

Voici mon code à ce jour:

for(float i = 0; i < strength + 1; i++){ 
    for(double u = 0.0f; u < 360; u += 0.5){ 
     double angle = u * Math.PI/180; 
     int x2 = (int)(x + i * Math.cos(angle)); 
     int y2 = (int)(y + i * Math.sin(angle)); 
     if(map[y2][x2] > 1 - 1/i) 
      map[y2][x2] = 1 - 1/i; 
    } 
} 

Résultat:

Result

Comme vous pouvez le voir dans le résultat, il semble que la lumière se développe trop sur le fond côté gauche (x rouge). Comment puis-je réparer ça?

Informations générales:

Force:
Le rayon du chemin parcouru le cours de lumière. Ceci aussi détermine à quel point la lumière sera brillante à chaque tuile de la matrice. La "carte" de tableau est une matrice flottante 2D. Le moteur que j'utilise utilise les valeurs pour le canal alpha. La plage est 0 (complètement transparent) à 1 (complètement opaque).

Solution (Merci à Gene):

for(int x2 = -strength; x2 <= strength; x2++){ 
    for (int y2 = -strength; y2 <= strength; y2++) { 
     double r = Math.sqrt(x2 * x2 + y2 * y2); 
     double inv_rad = r <= strength + 1 ? 1/r : 0; 
     if(map[y + y2][x + x2] > 1 - (float) inv_rad) 
      map[y + y2][x + x2] = 1 - (float) inv_rad; 
    } 
} 
+0

Pouvez-vous ajouter une autre image montrant votre résultat attendu? Et de préférence ayant une seule source de lumière, à la fois pour votre résultat actuel et le résultat attendu. – Gosu

Répondre

3

Votre algorithme souffre de troncature entier de la carte indicies. Essayez-le l'autre autour. Calculez la distance de chaque pixel dans un carré entourant le centre au centre. De cette distance calculez ce que l'intensité devrait être. Ce sera quelque chose comme ceci:

for (x = -R; x <= R; x++) 
    for (y = -R; y <= R; y++) { 
    double r = Math.sqrt(x * x + y * y); 
    double inv_rad = r <= R ? 1/r : 0; // truncate outside radius R 
    map[yc + y][xc + x] = 1 - inv_rad; 
    } 

Ici xc et yc sont les coordonnées du centre entier. R est la demi-taille de la boîte autour du centre.

+0

Je suis un peu confus sur ce que les variables représentent quoi. R est le rayon du cercle et r le rayon atteint jusqu'ici? – vedi0boy

+1

@ vedi0boy Ajout d'une note. – Gene

+1

'R' est probablement équivalent à' force' – njzk2

0

lorsque je tente d'ajouter à mon projet, je ne reçois que o.o retour les valeurs i où 500 entrai, 500,50

private float map[][] = new float[1000][1000]; 

public void test(int x, int y, float strength){ 
    public void addLight(int x,int y,int strength){ 
    for(int x2 = -strength; x2 <= strength; x2++){ 
     for (int y2 = -strength; y2 <= strength; y2++) { 
      double r = Math.sqrt(x2 * x2 + y2 * y2); 
      double inv_rad = r <= strength + 1 ? 1/r : 0; 
      if(map[y + y2][x + x2] > 1 - (float) inv_rad) 
       map[y + y2][x + x2] = 1 - (float) inv_rad; 
      System.out.println(map[y + y2][x + x2]); 
     } 
    } 
} 
+0

Cela devrait être un commentaire, quand il dit "Poster une réponse" c'est ce que cela signifie, pas une question. Tout d'abord, cette solution ne fonctionne pas. Cochez celui que j'ai posté sous "Solution (Merci à Gene)" et vérifiez également la réponse de Gene. Il y a une raison pour laquelle j'ai eu une erreur avec cet algorithme, la reproduire ne fera rien. – vedi0boy

+0

désolé je psoted la mauvaise méthode, mais quand vous utilisez le nouveau je reçois toujours 0 –

+0

@ vedi0boy mais je ne peux pas encore commenter et j'ai changé la méthode maintenant il montre le droit –