2015-12-09 2 views
2

J'essaie de générer des ellipses de taille aléatoire et de les dessiner sur une carte (juste un tableau 2D de mosaïques). Pour la plupart, cela fonctionne, mais il semble que lorsque la pièce est plus large que plus grande, elle coupe les coins des murs.Dessin d'une ellipse basée sur une mosaïque à l'intérieur d'un rectangle

enter image description here

Ci-dessous mon code pour dessiner l'ellipse. Fondamentalement prend dans un rectangle et dessine l'ellipse à l'intérieur de celui-ci.

private void AddCellEllipse(int xStart, int yStart, int xEnd, int yEnd, Tile tile) 
{ 
    // Draw an ellipse centered in the passed-in coordinates 
    float xCenter = (xEnd + xStart)/2.0f; 
    float yCenter = (yEnd + yStart)/2.0f; 
    float xAxis = (xEnd - xStart)/2.0f; 
    float yAxis = (yEnd - yStart)/2.0f; 

    for (int y = yStart; y <= yEnd; y++) 
     for (int x = xStart; x <= xEnd; x++) 
     { 
      // Only draw if (x,y) is within the ellipse 
      if (Math.sqrt(Math.pow((x - xCenter)/xAxis, 2.0) + Math.pow((y - yCenter)/yAxis, 2.0)) <= 1.0f) 
       tiles[x][y] = tile; 
     } 
} 

J'appelle cette méthode comme ça. Génère un rectangle de taille aléatoire dans une position aléatoire, puis crée une ellipse de carreaux muraux, puis couvre les carreaux muraux intérieurs avec des carreaux de sol.

AddCellEllipse(xRoomStart, yRoomStart, xRoomStart + roomWidth, yRoomStart + roomHeight, Tile.WALL); 
    AddCellEllipse(xRoomStart + 1, yRoomStart + 1, xRoomStart + roomWidth - 1, yRoomStart + roomHeight - 1, Tile.FLOOR); 

question bonus Aussi, quelqu'un a une idée comment je peux le faire pas mettre le 1 tuile qui sort en haut/bas de l'ellipse?

Répondre

4

Vous pouvez utiliser Bresenham ellipse algorithm ou un algorithme de point central pour dessiner des ellipses.

Et quand vous dessinez deux points symétriques (tuiles) avec algo mentionnés comme ceux-ci:

DrawPixel (xc + x, yc + y); 
DrawPixel (xc - x, yc + y); 

remplir tout segment de ligne entre eux avec des tuiles intérieures.

+0

Dans cet exemple de l'algorithme de Bresenham, je suppose que les variables xc et yc sont le centre de l'ellipse? – Darren

+0

Oui, c'est. Comme votre xCenter et yCenter – MBo

+0

Merci. J'ai réussi à implémenter cet algorithme, juste pour le faire remplir l'ellipse avec des carreaux de sol maintenant mais j'ai généré quelques cartes et je n'ai pas encore remarqué le problème. – Darren