4.3.4 Objetos ND-Transform

Onde – no contexto de visualização NDimensional – uma matriz simples (N+1)x(N+1) é esperada – como no campo INST ntransform, ou a ND-xform* (veja comandos GCL: a Linguagem de Comandos do Geomview) – use um objeto ntransform.

ntransform são matrizes de transformação NLinhas x NColunas onde usualmente NLinhas = N+1 no contexto de objetos N-dimensionais e visualização. A componente homogênea de uma ntransform situa-se na coluna zero (em oposição a objetos transform comuns onde a componente homogênea situa-se na coluna três). Objetos ntransform trabalham sobre pontos de qualquer dimensão: se um ponto é para ser transformado através de um objeto ntransform e a dimensão do ponto não coincide com o número de linhas do objeto ntransform, então ou o ponto está implicitamente preenchido com zeros para coincidir com NLinhas ou a matriz está implicitamente preenchida com unidades abaixo de sua diagonal principal (e zeros em todas as outras posições) de forma que a matriz irá trabalhar como a matriz identidade sobre as dimensões excedentes do ponto de entrada.

A sintaxe para um objeto ntransform é

<ntransform> ::= 
  [ "{" ]             (abertura de chave, geralmente necessária para
                       tornar o fim do objeto claramente explicitado.)

   [ "ntransform" ]    (palavra chave opcional; desnecessária se o tipo
                       for determinado pelo contexto, o que
                       comumente ocorre.)

   [ "define" <nome> ]
                       (define uma transformação chamada <nome>,
                       escolhendo seus valores do material adiante)

     NLinhas NColunas
                       (número de linhas e colunas da matriz,
                       tipicamente N+1 N+1, mas qualquer dimensão
                       é possível)
     <NLinhas x NColunas números em ponto flutuante>
                       (interpretados como uma transformação homogênea
                       NLinhas x NColunas fornecida linha por linha,
                       pretensamente a ser aplicada a um vetor linha
                       multiplicado à ESQUERDA, de forma que e.g.
                       translações Euclideanas aparecem na linha mais
                       acima -- em oposição a objetos de
                       transformação comuns onde as
                       translações aparecem na linha mais inferior)
   | 
      "<" <nomedearquivo>  (significando: leia a transformação daquele
                       arquivo)
   |
      ":" <nome>      (significando: use a variável <nome>,
                      definida em algum lugar; se não for definida o
                      valor inicial é a transformação identidade)

 [ "}" ]             (correspondente fechamento de chave)

O conjunto deve ser delimitado entre { chaves }. Chaves não são necessariamente essenciais, de forma que e.g. dois inteiros – NLinhas NColunas – seguidos por um array composto de NLinhas x NColunas números em ponto flutuante independentes pode mas não precisa ter chaves.

Alguns exemplos, em contextos onde eles possivelmente podem ser usados:

# Exemplo 1: Um comando GCL para definir uma transformação 6x6 chamada
# "fred", uma mera translação por meio do vetor -3 0 1 1 0. Essa
# transformação é significativa para um espaço pentadimensional, com uma componente
# homogênea um índice zero.

(read ntransform { ntransform  define fred
         6 6
         1 -3 0 1 1 0
         0  1 0 0 0 0
         0  0 1 0 0 0
         0  0 0 1 0 0
         0  0 0 0 1 0
         0  0 0 0 0 1
    }
)
# Exemplo 2: Escolhe o ND-xform de um objeto -- um geométrico ou um grupo de
# cameras. Fornecendo a definição acima, o ND-xform escolhido coloca o objeto em (-3 0 1 1
# 0) no espaço pentadimensional.

(ND-xform-set focus : fred)

# ou

(ND-xform-set g1 : fred)