|
POV-Ray ofrece varias directivas del lenguaje nuevas, que pueden usarse para implementar el análisis condicional de varias secciones de tu escena. Ello es especialmente útil para describir el movimiento en tus animaciones, pero tiene muchos otros usos. También
está disponible #while
, una directiva de bucle condicional. Puedes anidar hasta 200 niveles de directivas condicionales.
La directiva condicional más simple es la tradicional #if
. Su sintaxis es la siguiente:
DIRECTIVA_IF: #if ( Cond ) TOKENS... [#else TOKENS...] #end
Los TOKENS consisten en cualquier número de sentencias, identificadores o expresiones de POV-Ray, y Cond es una expresión de coma flotante que se interpreta como un valor
booleano. Los paréntesis son necesarios. La directiva #end
es también necesaria al final. Un valor de 0.0 es considerado falso, mientras que cualquier otro valor distinto de
0 se considera cierto.
Nota: los números muy pequeños, de alrededor de 1e-10, se consideran 0 en caso de errores de redondeo.
Si la condición Cond es cierta, el primer grupo de tokens se analiza normalmente y se salta el segundo. Si es falsa, se salta el primero y se analiza el segundo. Por ejemplo, en el siguiente código:
#declare usar_caja=1; #if (usar_caja) box { 0, 1 } #else sphere { 0, 1 } #end
se usa la caja, mientras que se ignora la esfera. Cambiando el valor de usar_caja
a 0
se omite la caja,
usándose la esfera. La directiva #else
y el segundo grupo de tokens es opcional. Por ejemplo:
#declare usar_caja=1; #if (usar_caja) box { 0, 1 } #end
Cambiando el valor de usar_caja
a 0
, haremos que se omita la caja en el
análisis de la escena.
Al principio del capítulo "Directivas del lenguaje", se dijo que "Estas directivas pueden aparecer en casi cualquier parte de una escena...". El siguiente es un ejemplo de uno de los casos en que no funcionan, ya que el analizador se confunde.
#if( #if(yes) yes #end ) #end
Las directivas #ifdef
e #ifndef
son similares a la directiva #if
, salvo en que se usan para determinar si un identificador ha sido ya declarado.
DIRECTIVA_IFDEF: #ifdef ( IDENTIFICADOR ) TOKENS... [#else TOKENS...] #end DIRECTIVA_IFNDEF: #ifndef ( IDENTIFICADOR ) TOKENS... [#else TOKENS...] #end
Si el IDENTIFICADOR existe, se analiza el primer grupo de tokens, y se salta el segundo. Si no existe, el primer grupo se salta y se analiza el segundo. Ello es especialmente útil para reemplazar ítems no definidos con valores por defecto. Por ejemplo:
#ifdef (Algo) // esta sección se analiza // si el identificador "Algo" // estaba ya declarado object{Algo} // invoca el identificador #else // esta sección se analiza // si el identificador "Algo" // no estaba definido box{<0,0,0>,<1,1,1>} // valor por defecto #end // Fin de la parte condicional
La directiva #ifndef
trabaja al contrario. El primer grupo se analiza si el identificador no estaba definido. Como con la directiva #if
, la cláusula #else
es opcional y la directiva #end
es necesaria.
Las directivas #ifdef
e #ifndef
pueden usarse para determinar si un elemento
específico de una matriz ha sido ya asignado:
#declare MiMatriz=array[10] //#declare MiMatriz[0]=7; #ifdef(MiMatriz[0]) #debug "El primer elemento está asignado.\n" #else #debug "El primer elemento no está asignado.\n" #end
La directiva #switch
es una instrucción condicional todavía
más útil. Su sintaxis es la siguiente:
DIRECTIVA_SWITCH: #switch ( Valor_de_comparacion ) CLAUSULA_SWITCH... [#else TOKENS...] #end CLAUSULA_SWITCH: #case( Valor_del_caso ) TOKENS... [#break] | #range( Valor_bajo , Valor_alto ) TOKENS... [#break]
Los TOKENS son cualquier número de sentencias o identificadores de POV-Ray, y Valor_de_comparacion es una expresión de coma flotante. Los paréntesis son obligatorios, así como la directiva #end
. La CLAUSULA_SWITCH puede ser de dos tipos. En la variedad #case
, el valor coma flotante Valor_de_condicion se compara con el valor de coma flotante Valor_del_caso. Si son iguales, la condición es cierta.
Nota: los valores que se diferencien menos de 1e-10 se consideran iguales en caso de errores de redondeo.
En la variedad #range
, Valor_bajo
y Valor_alto son valores coma flotante separados por una coma y encerrados entre paréntesis. Si
Valor_bajo<=Valor_de_comparacion y Valor_de_comparacion<=Valor_alto
entonces la condición es cierta.
En ambas variedades, si la cláusula de la condición es cierta, los tokens de
ésta son analizados normalmente hasta que se encuentra una directiva #break
,
#else
o #end
. Si la condición es falsa, POV-Ray salta hasta que se encuentra el siguiente #case
o
#range
.
Puede haber cualquier número de cláusulas #case
o #range
, en el orden que desees. Si una cláusula se evalúa como cierta pero no se encuentra ninguna directiva
#break
, el análisis continúa hasta el siguiente
#case
o #range
, evaluándose esta cláusula condicional. Si se encuentra un #break
mientras se analiza una sección de tokens, se
saltará inmediatamente hasta la directiva #end
, sin procesar las siguientes secciones, incluso aunque alguna de ellas hubiera satisfecho su condición.
Opcionalmente, puede existir una cláusula #else
final. Los tokens que contenga son únicamente ejecutados si ninguna cláusula anterior era cierta.
Por ejemplo:
#switch (VALOR) #case (PRUEBA_1) // Esta sección se analiza si VALOR=PRUEBA_1 #break // fin del primer caso #case (PRUEBA_2) // Esta sección se analiza si VALOR=PRUEBA_2 #break // fin del segundo caso #range (BAJO_1,ALTO_1) // Esta sección se analiza si (VALOR>=BAJO_1)&(VALOR<=ALTO_1) #break // fin del tercer caso #range (BAJO_2,ALTO_2) // Esta sección se analiza si (VALOR>=BAJO_2)&(VALOR<=ALTO_2) #break // fin del cuarto caso #else // Esta sección se analiza si ningún otro caso o rango fuera cierto #end // fin de la parte condicional
La directiva #while
permite construir un bucle que, por ejemplo, facilita el posicionamiento de múltiples objetos siguiendo un patrón, aunque puede servir para muchos
más usos.
DIRECTIVA_WHILE: #while ( Cond ) TOKENS... #end
Los TOKENS son cualquier número de sentencias, identificadores o marcas de puntuación de POV-Ray, y que constituyen el cuerpo del bucle. La directiva
#while
va seguida de una expresión de coma flotante que se evalúa a un valor
booleano. Un valor de 0.0 se considera falso, mientras que cualquier valor distinto de
0 es considerado como cierto.
Nota: los valores extremadamente pequeños, alrededor de 1e-10, son considerados como 0 en caso de errores de redondeo.
Los paréntesis encerrando la expresión son obligatorios. Si la condición es cierta, se
continúa el análisis de la escena normalmente, hasta que se encuentre la directiva #end
. En ese punto, el fin del bucle, POV-Ray vuelve a la directiva
#while
y evalúa de nuevo la condición. El bucle continúa así hasta que la condición deje de ser cierta. Cuando la condición es falsa, se
continúa con el análisis de la escena a partir de la directiva
#end
.
Nota: es posible que la condición sea falsa la primera vez y que el cuerpo del bucle se ignore totalmente. El usuario es responsable de cambiar lo que sea necesario dentro del cuerpo del bucle para que la condición deje de ser cierta en algún momento.
Véase el siguiente ejemplo de bucle construido correctamente:
#declare Contador=0; #while (Contador < 5) object { MiObjeto translate x*3*Contador } #declare Contador=Contador+1; #end
Este ejemplo sitúa cinco copias de MiObjeto
en una fila, espaciadas cada tres unidades en el eje x.
|