7
votes

Comment calculer la hauteur et la largeur d'un rectangle isométrique / carré

J'écris un jeu de tuiles isométrique. Chaque carreau est deux fois plus large que sa grande taille (W: H = 2: 1). Toutes les carreaux sur une carte ont la même taille et leur largeur et leur hauteurs sont connues (TileWidth et TileHeight).

Il peut y avoir un nombre quelconque de colonnes (> 0) et des lignes (> 0).

Je me débats pour trouver une formule pour calculer la largeur et la hauteur de la carte entièrement dessinée. Cela doit être la distance entre le haut du haut vers le fond même et l'extrême gauche à l'extrême droite. Comme le nombre de colonnes et de lignes peut varier (et donc la carte n'est pas toujours un diamant parfait), il se révèle très dur!


0 commentaires

5 Réponses :


0
votes

Pourquoi ne pas utiliser d'équations de rotation comme suit:

Supposons que les tuiles ne sont pas pivotées, les quatre coins ont les coordonnées suivantes: p> xxx pré>

où P>

w = Number of Columns * Tile Width
h = Number of Rows * Tile Height
  • Obtenez la coordonnée minimale X de tous les points (après projection). LI>
  • Obtenez la coordonnée X maximale de tous les points (après projection). LI>
  • Obtenez la coordonnée Y minimum de tous les points (après projection). Li>
  • Obtenez la coordonnée Y maximum de tous les points (après projection). LI> ol>

    Soustrayez 1 de 2, et vous pour obtenir la largeur et 3 à partir de 4 pour obtenir la hauteur. P>

    Est-ce que cela aide? P> P>


  • 6 commentaires

    La projection isométrique n'est pas une rotation.


    OPS, désolé, mais cela ne change pas vraiment la solution. Plutôt que d'utiliser la matrice de rotation, il peut utiliser la matrice de projection, puis effectuer le même calcul.


    Blimey. C'est délicat. Je pense que mon angle thêta est de 45 degrés mais je ne comprends pas vraiment les formules matricielles écrites dans l'article Wikipedia. Je me sens assez stupide (mon arrière-plan n'est pas des mathématiques ou de l'informatique!).


    Ok, alors pouvez-vous s'il vous plaît expliquer plus sur votre jeu? Qu'est-ce que tu utilises pour ça? Moteur de jeu? DirectX, etc.? Comment définissez-vous les tuiles? De cette façon, je peux vous donner une réponse spécifique.


    C'est un moteur de jeu écrit en studio réel. Les tuiles sont des images PNG. Voici le code que j'utilise pour placer les tuiles à l'écran: x = colonne * (Data.tilwidth / 2) + (ligne * (TileWidth / 2)) + Origin.x y = colonne * (TileHeight / 2) - ( Rangée * (TileHeight / 2)) + Origine.y. Où origine est le début de la carte (les transactions avec défilement) et x et y sont les coordonnées réelles.


    Garry, je ne peux pas vraiment dire avec les informations fournies; Aucun angle, etc. Je vous recommande de modifier la question et de mentionner que vous utilisez un véritable studio et mettez le code en détail du code, de cette façon, d'autres pourront peut-être vous aider.



    0
    votes

    Je pense que vous pourriez faire cela avec Théorème de Pythagore :

    halfWidth = tileWidth / 2;
    halfHeight = tileHeight / 2;
    h = Math.sqrt((halfWidth * halfWidth ) * (halfHeight * halfHeight));
    rowLength = rowSize * h;
    colLength = colSize * h;
    


    1 commentaires

    Cela fonctionne pour calculer la largeur et la hauteur du rectangle (et donc l'hypoténuse du triangle bisectant la carte) mais pas la largeur de la carte.



    2
    votes

    Les angles de la projection isométrique sont 60DEG et 30DEG. La largeur réelle et la hauteur d'une tuile seront les suivantes:

    wiso = tuilewidth * cos (30) + tuileheight * cos (60)
    HISO = TILEWIDTH * SIN (30) + TILEHEIGHT * SIN (60)

    Vous pouvez maintenant ajouter de multiplier ces chiffres par le nombre de tuiles par ligne et par colonne pour obtenir la taille de la grille.

    Edit: En regardant vos images, il semble que la projection ne soit pas isométrique (du moins pas ce que j'ai appris à l'école), et les angles sont 60deg aux deux côtés, remplacez donc le COS (60) avec cos (30) et le sin (60) avec sin (30)

    Une autre façon de regarder:

    wgrid = tuilewidth * cos (30) * ncols + tuileheight * cos (30) * NROWS
    HGRID = TILEWIDTH * SIN (30) * NCOLS + TILEHEIGHT * SIN (30) * NROWS


    1 commentaires

    Merci. Ils ne sont pas strictement isométriques - ils sont dimétriques (deux fois plus larges que hauts).



    5
    votes

    bonne question! Il y a une réponse non trop évidente, mais il est facile de calculer:

    Appelons l'axe de la rangée "R" et l'axe de colonne "C", et considérons la première image, où l'étendue le long de l'axe R est 5 et le L'étendue le long de l'axe C est de 3.

    L'incrément de l'unité le long de l'axe R, par rapport au plan de dessin, est à angle +30 = (cos 30 °, péché 30 °) = (SQRT (3) / 2, 0,5), et l'incrément de l'unité le long de l'axe C est à -30 = (COS 30 °, -Sin 30 °) = (SQRT (3) / 2, -0,5).

    You Besoin de considérer les deux diagonales de votre rectangle isométrique. Dans la première image, ces diagonales sont D1 = [+ 5 * u le long de l'axe R et + 3 * U le long de l'axe C] et D2 = [+ 5 * U le long de l'axe R et de -3 * u le long de l'axe C ], où vous êtes la longueur de tuile dans le plan isométrique. Lorsqu'il est transformé dans le plan de dessin, cela devient D1 = (((5 + 3) * sqrt (3) / 2 * u, (5-3) / 2 * u) = (4 * sqrt (3) * u, 1 * U) et d2 = (((5-3) * sqrt (3) / 2 * u, (5 + 3) / 2 * u) = (sqrt (3) * u, 4 * u). La largeur de l'écran et la hauteur sont donc le maximum des deux étendues = 4 * sqrt (3) * u, 4 * u.

    Ceci peut être généralisé: s'il y a des lignes NR et des colonnes NC, et la longueur de la tuile est U, l'étendue des diagonales du rectangle dans le plan de dessin sont D1 = ((NR + NC) * sqrt (3) / 2 * U, (NR-NC) / 2 * U) et D2 = ((NR-NC) * sqrt (3) / 2 * u, (nr + nc) / 2 * u) et la largeur et la hauteur de l'écran sont donc les suivantes: xxx


    0 commentaires

    2
    votes

    Si vous commencez en bas et marchez sur le côté gauche, vous déplacez la moitié de la hauteur de la tuile pour chaque colonne, puis la moitié de la hauteur de chaque rangée. De même, si vous commencez à gauche et marchez le long du bord inférieur, vous remettez la moitié de la largeur de la tuile pour chaque colonne, puis la moitié de la largeur de chaque rangée.

    de sorte que la largeur de la boîte de sélection d'axe-alignée pour la carte est (lignes + colonnes) * TILEWIDTH / 2 et la hauteur est (lignes + colonnes) * TILEHEIGH / 2 < / code>


    0 commentaires