2010-08-20 21 views
9

Tengo una matriz con vértices que representan una franja triangular. Necesito convertirlo en polígono. Hay muchas soluciones para hacer lo contrario, pero no pude encontrar una para el problema anterior. O podría ser demasiado fácil y simplemente no puedo verlo. Por favor ayuda.Algoritmo para convertir vértices de una franja triangular al polígono

OpenGL = compatible, ver http://en.wikipedia.org/wiki/Triangle_strip

Ejemplo: para esta tira http://en.wikipedia.org/wiki/File:Triangle_Strip_Small.png necesito ABDFEC de salida o ACEFDB

+1

¿Qué quiere decir por "franja triangular"? ¿Es una forma arbitraria construida de triángulos? ¿O algo más específico? –

+0

¿Se puede incluir una imagen? –

+0

Esto es para una "tira de triángulo", no una "tira triangular". Un tristrip es un formato de datos que especifica una lista de triángulos que usa solo nTriangles + 2 vértices, ya que cada triángulo después del primero usa los dos últimos vértices de los triángulos anteriores. –

Respuesta

0

Puede haber un acceso directo si su forma tiene una estructura particularmente simple, pero en general Creo que quiere hacer la siguiente

  • Crear una lista de vértices y aristas de su lista de triángulos. Esto implica detectar puntos compartidos (con suerte son coincidencias exactas para que pueda encontrarlos mediante hash en lugar de necesitar algún tipo de búsqueda difusa) y líneas compartidas (eso es fácil, simplemente no dibuje dos bordes entre el mismo par de vértices compartidos) .
  • Encuentra el punto superior izquierdo.
  • Encuentra el borde que se desplaza lo más arriba a la izquierda posible, y está en el sentido contrario a las agujas del reloj.
  • Camine hasta el siguiente vértice.
  • Encuentra el siguiente borde que duplica el anterior tanto como sea posible.
  • Continúe hasta llegar al punto superior izquierdo más.
6

creo que el siguiente debería funcionar:

Paseo por la lista de vértices. Agrega el primer punto a tu polígono. Empuja el segundo punto en la pila. Agrega el tercer punto al polígono. Continúa alternando entre puntos de empuje en la pila y agregándolos al polígono hasta que llegues al final de la lista. Cuando llegue al final de la lista, muestre los puntos de la pila y agréguelos al polígono.

+0

Creo que esto no tiene en cuenta los puntos interiores. ¿Lo hace? –

+0

@belisarius: no intenta "simplificar" el polígono, si eso es lo que quiere decir, es decir, creará un polígono que coincida exactamente con el contorno de la franja del triángulo. Si (por ejemplo) ha teselado una superficie en una larga franja triangular que serpentea alrededor de un lote, producirá un polígono que se redondeará exactamente de la misma manera. Al menos, si usa 3 dimensiones, no puede hacer mucho más: los puntos interiores a menudo tienen valores Z diferentes que deben preservarse. –

+0

Sí. Pensé que esa era la intención del OP. Puede ser que esté equivocado. Tnx. –

1

alt text

Voy a asumir su tira de triángulos siempre está conectado de la misma manera (que creo que es cierto para OpenGL).

  • Los vértices "fondo" son siempre dos aparte: A, C, E, ...
  • el "top" vértices son siempre dos separados: B, D, F , ...

Lleve la lista "inferior" y anexe el reverso de la lista "superior". (ACEFDB para el ejemplo)


O, más directamente, usando un índice basado en cero en lugar de letras:

// do "bottom" 
for (i = 0; i < N; i += 2) 
    addVertex(i) 

// do "top" 
largestOddNumberLessThanN = N % 2 == 0 ? N - 1 : N - 2; 
for (i = largestOddNumberLessThanN; i >= 0; i -= 2) 
    addVertex(i) 
Cuestiones relacionadas