2013-08-26 6 views
5

Vorrei chiedere se c'è del codice o se puoi darmi un aiuto nella scrittura di alcuni (C#, ma immagino che la matematica sia la stessa ovunque) .Trova i vertici nella mesh del triangolo equilatero proveniente da un vertice centrale

Vorrei specificare un punto centrale da cui viene creata una mesh a triangolo equilatero e ottenere i vertici di questi triangoli. Il punto centrale non dovrebbe essere un centro del viso, ma un vertice stesso. Un ulteriore input sarebbe la dimensione dei triangoli (cioè la lunghezza del lato) e un raggio a cui vengono generati i vertici del triangolo.

Il motivo dietro questo è che voglio creare una maglia che è centrata bene sullo schermo/centro della finestra con il minor numero possibile di codice. Ho appena trovato il codice di generazione mesh, ma non un esempio di "propagazione radiale verso l'esterno".

Alla fine, mi piacerebbe avere i vertici successivi più lontani che vengono spostati in modo logaritmico, ma suppongo che sia solo un'aggiunta facile una volta che il codice mesh è lì.

Qualcuno può aiutarmi? Grazie!

+0

Può descrivere "propagazione radiale verso l'esterno" un po 'più? Posso pensare a più di un modo che potrebbe accadere. – asimes

risposta

1

È necessario specificare due elementi, un raggio e la direzione indicata dal primo triangolo.

  • Il raggio sarà la distanza dal punto iniziale ai vertici del primo triangolo. Tutti i triangoli avranno lo stesso raggio.
  • La direzione è una specifica in radianti. Assumerò che 0 significhi puntare a destra (il PI sarebbe il punto a sinistra).

Trovare i vertici del primo triangolo può essere fatto come questo (pseudo-codice, non è linguaggio specifico):

float theta = 0; // The direction, 0 means pointing to the right 
float thetaInc = TWO_PI/3; // 3 because you want a triangle 
for (int i = 0; i < 3; i++) { 
    vertX[i] = initialPointX+cos(theta)*radius; 
    vertY[i] = initialPointY+sin(theta)*radius; 
    theta += thetaInc; 
} 

Ci sono molti modi per trovare i punti centrali dei triangoli vicini. Un modo sarebbe quello di utilizzare lo stesso codice ma inizializzare theta = TWO_PI/6, sostituire radius con foo (vedere la matematica di seguito), assegnare i nuovi punti centrali dei triangoli adiacenti nel ciclo for, e quindi utilizzare lo stesso codice con una direzione opportunamente ruotata (theta += PI) trova i vertici di quei triangoli.

Distanza da un centro triangolo ad un altro solo conoscendo radius:

  • ipotenusa = sqrt(sq(radius)+sq(radius));
  • halfHypotenuse = hypotenuse/2.0;
  • teorema di Pitagora per trovare la distanza dal centro del triangolo al centro di un bordo: foo = sqrt(sq(radius)-sq(halfHypotenuse));
  • Distanza finale = foo*2.0;

codice per trovare i punti centrali dei triangoli vicini:

float[] nx = new float[3]; 
float[] ny = new float[3]; 

float theta = TWO_PI/6; 
float hyp = sqrt(sq(radius)+sq(radius)); 
float halfHyp = hyp/2.0; 
float foo = sqrt((sq(radius)-sq(halfHyp)))*2.0; 
for (int i = 0; i < 3; i++) { 
    nx[i] = initialPointX+cos(theta)*foo; 
    ny[i] = initialPointY+sin(theta)*foo; 
    theta += thetaInc; 
} 
0

La ringrazio molto per la risposta. Giocherò con il tuo codice: la parte di propagazione sarà sicuramente utile.

Nel frattempo ho giocato con esagoni invece di triangoli e questo codice funziona abbastanza bene per lo stesso scopo.:

// compilare matrice dal centro esagono, andando verso l'esterno il numero di squilli desiderato esagonali

  for (int i = 0; i < numberOfHexagonRings; i++) 
      { 
       for (double j = -i; j <= i; j++) 
        for (double k = -i; k <= i; k++) 
         for (double l = -i; l <= i; l++) 
          if ((Math.Abs(j) + Math.Abs(k) + Math.Abs(l) == i * 2) && (j + k + l == 0)) 
          { 
           positionX = (int)(screenCenterX + ((double)sideLength * (l/2 + j))); 
           positionY = (int)(screenCenterY + (3/2 * ((double)sideLength/Math.Sqrt(3)) * l)); 
+0

In realtà non ho aggiunto un metodo per creare la griglia, solo una dimostrazione di come posizionare il primo triangolo e i suoi vicini. Non ero sicuro di come volevi espandere la griglia (ci sono molti modi). Se è stato utile allora contrassegnarlo sarebbe bello :) – asimes

Problemi correlati