# plot3d

esboço 3d de uma superfície

## Seqüência de Chamamento

    plot3d(x,y,z,[theta,alpha,leg,flag,ebox])
                plot3d(x,y,z,<opt_args>)

                plot3d(xf,yf,zf,[theta,alpha,leg,flag,ebox])
                plot3d(xf,yf,zf,<opt_args>)

                plot3d(xf,yf,list(zf,colors),[theta,alpha,leg,flag,ebox])
                plot3d(xf,yf,list(zf,colors),<opt_args>)

## Parâmetros

x,y

  vetores linhas de tamanhos n1 e n2 (coordenadas dos eixos x e y). Estas coordenadas devem ser monótonas.

z

  matriz de tamanho (n1,n2). `z(i,j)` é o valor da superfície no ponto (x(i),y(j)).

xf,yf,zf

  matrizes de tamanho (nf,n). Elas definem as facetas usadas para desenhar a superfície. Há `n` facetas. Cada faceta `i` é definida por um polígono com `nf` pontos. As coordenadas dos eixos x, y e z dos pontos da i-ésima faceta são dados respectivamente por `xf(:,i)`, `yf(:,i)` e `zf(:,i)`.

colors

  um vetor de tamanho n fornecendo as cores de cada faceta ou uma matriz de tamanho (nf,n) fornecendo a cor próxima a cada borda da faceta (a cor da faceta é interpolada).

<opt_args>

  representa uma seqüência de sentenças `key1=value1, key2=value2` ,... onde `key1`, `key2,...` pode ser um dos seguintes: theta, alpha , leg, flag, ebox (ver definições abaixo).

theta, alpha

  valores reais de dados em graus, as coordenadas esféricas de observação do ponto.

leg

  string definindo os rótulos para cada eixo com @ como um separador de campos, por exemplo "X@Y@Z".

flag

  um vetor real de tamanho três. `flag=[mode,type,box]`.

  mode

    um inteiro (cor da superfície).

    mode>0

      a superfície é pintada com a cor `"mode"` ; a borda da faceta é desenhada com o estilo e linha e cor correntes.

    mode=0:

      uma malha da superfície é desenhada.

    mode<0:

      a superfície é pintada com a cor `"-mode"` ; a borda da faceta não é desenhada.

      Note que o tratamento de cor da superfície pode ser feito utilizando-se as opções `color_mode` e `color_flag` através das propriedades da entidade superfície (ver surface_properties).

  type

    um inteiro (tipo de escala).

    type=0:

      o esboço é feito utilizando-se a escala 3d corrente (definida por uma chamada anterior a `param3d`, `plot3d`, `contour` ou `plot3d1`).

    type=1:

      re-escala automaticamente caixas 3d com relção de aspecto extrema, as fronteiras são especificadas pelo valor do argumento opcional `ebox`.

    type=2:

      re-escala automaticamente caixas 3d com relção de aspecto extrema, as fronteiras são computadas utilizando-se dados fornecidos.

    type=3:

      fronteiras 3d isométricas com fronteiras da caixa dadas por `ebox`, de modo semelhante a `type=1`.

    type=4:

      fronteiras 3d isométricas derivadas dos dados, de modo semelhante a `type=2`.

    type=5:

      fronteiras 3d isométricas expandidas com fronteiras fornecidas por `ebox`, de modo semelhante a `type=1`.

    type=6:

      fronteiras 3d isométricas expandidas derivadas dos dados, de modo semelhante a `type=2`.

      Note que as fronteiras dos eixos podem ser customizadas através das propriedades da entidade de eixos (ver axes_properties).

  box

    um inteiro (moldura ao redor do esboço).

    box=0:

      nada é desenhado ao redor do esboço.

    box=1:

      não implementado (é como box=0).

    box=2:

      apenas os eixos atrás da superfície são desenhados.

    box=3:

      uma caixa cercando a superfície é desenhada e legendas são adicionadas.

    box=4:

      uma caixa cercando a superfície é desenhada e legendas e eixos são adicionados.

      Note que o aspecto dos eixos pode ser customizado através das propriedades da entidade de eixos (ver axes_properties).

ebox

  especifica as fronteiras do esboço através do vetor `[xmin,xmax,ymin,ymax,zmin,zmax]`. Este argumento é utilizado junto com `type` em `flag`, se este for ajustado para `1`, `3` ou `5` (volte acima para ver o comportamento correspondente). Se `flag` estiver faltando, `ebox` não é levado em conta.

  Note que, quando especificado, o argumento `ebox` age no campo `data_bounds` que também pode ser ajustado através das propriedades da entidade de eixos (ver axes_properties).

## Descrição

`plot3d(x,y,z,[theta,alpha,leg,flag,ebox])` desenha a superfície parametrizada `z=f(x,y)`.

`plot3d(xf,yf,zf,[theta,alpha,leg ,flag,ebox])` desenha uma superfície definida por um conjunto de facetas. Você pode desenhar esboços multiplos substituindo `xf`, `yf` e `zf` por múltiplas matrizes montadas por linhas como `[xf1 xf2 ...]`, `[yf1 yf2 ...]` e`[zf1 zf2 ...]`. Note que os dados também podem ser ajustados ou recebidos através das propriedades da entidade superfície (ver surface_properties).

Você pode fornecer uma cor específica para cada faceta utilizando `list(zf,colors)` ao invés de `zf`, onde `colors` é um vetor de tamanho `n`. Se `colors(i)` for positivo, fornece a cor da faceta `i` e a borda da faceta é desenhada utilizando-se o estilo de linha e cor correntes. Se `colors(i)` for negativo, o identificador de cor `-colors(i)` é utilizado e a borda da faceta não é desenhada.

Também é possível obter cores interpoladas para as facetas. Para este tipo de cor, o argumento deve ser uma matriz nf x n fornecendo as cores próximas a cada borda da faceta de cada faceta. Neste caso, valores positivos para cores significam que as bordas não seram desenhadas. Note que as cores também podem ser ajustadas através das propriedades da entidade Surface (superfície) (via `tlist` affectations) e editadas utilizando-se a opção `color_flag` (ver surface_properties).

Os arugumentos opcionais `theta, alpha, leg ,flag, ebox` ,podem ser passados por uma seqüência de argumentos `key1=value1, key2=value2`, ... Neste caso, a ordem não tem significado especial. Note que todos estes argumentos, exceto `flag` podem ser customizados através de propriedades da entidade de eixos (ver axes_properties). Como descrito anteriormente, a opção `flag` lida com as propriedades da entidade superfície para `mode` (ver surface_properties) e as propriedades de eixos (Axes) para `type` e `box` (ver axes_properties).

Você pode utilizar a função `genfac3d` para computar facetas de quatro lados da superfície `z=f(x,y)`. `eval3dp` também pode ser utilizado.

Entre com o comando `plot3d()` para visualizar uma demonstração.

## Exemplos

    // esboço simples utilizando z=f(x,y)
    t=[0:0.3:2*%pi]';
    z=sin(t)*cos(t');
    plot3d(t,t,z)
    // o mesmo esboço utilizando facetas computadas por genfac3d
    [xx,yy,zz]=genfac3d(t,t,z);
    clf()
    plot3d(xx,yy,zz)
    // esboços múltiplos
    clf()
    plot3d([xx xx],[yy yy],[zz 4+zz])
    // esboços múltiplos utilizando-se cores
    clf()
    plot3d([xx xx],[yy yy],list([zz zz+4],[4*ones(1,400) 5*ones(1,400)]))
    // esboço simples utilizando ponto de observação e legendas
    clf()
    plot3d(1:10,1:20,10*rand(10,20),alpha=35,theta=45,flag=[2,2,3])
    // esboço de uma esfera utilizando utilizando facetas computadas por eval3dp
    deff("[x,y,z]=sph(alp,tet)",["x=r*cos(alp).*cos(tet)+orig(1)*ones(tet)";..
         "y=r*cos(alp).*sin(tet)+orig(2)*ones(tet)";..
         "z=r*sin(alp)+orig(3)*ones(tet)"]);
    r=1; orig=[0 0 0];
    [xx,yy,zz]=eval3dp(sph,linspace(-%pi/2,%pi/2,40),linspace(0,%pi*2,20));
    clf();plot3d(xx,yy,zz)
    clf();
    f=gcf();
    f.color_map = hotcolormap(128);
    r=0.3;orig=[1.5 0 0];
    [xx1,yy1,zz1]=eval3dp(sph,linspace(-%pi/2,%pi/2,40),linspace(0,%pi*2,20));
    cc=(xx+zz+2)*32;cc1=(xx1-orig(1)+zz1/r+2)*32;
    clf();plot3d1([xx xx1],[yy yy1],list([zz,zz1],[cc cc1]),theta=70,alpha=80,flag=[5,6,3])

    //operações disponíveis apenas no novo modo de gráficos
    delete(gcf());
    t=[0:0.3:2*%pi]'; z=sin(t)*cos(t');
    [xx,yy,zz]=genfac3d(t,t,z);
    plot3d([xx xx],[yy yy],list([zz zz+4],[4*ones(1,400) 5*ones(1,400)]))
    e=gce();
    f=e.data;
    TL = tlist(["3d" "x" "y" "z" "color"],f.x,f.y,f.z,6*rand(f.z)); // matriz de cores aleatória
    e.data = TL;
    TL2 = tlist(["3d" "x" "y" "z" "color"],f.x,f.y,f.z,4*rand(1,800)); // vetor de cores aleatório
    e.data = TL2;
    TL3 = tlist(["3d" "x" "y" "z" "color"],f.x,f.y,f.z,[20*ones(1,400) 6*ones(1,400)]);
    e.data = TL3;
    TL4 = tlist(["3d" "x" "y" "z"],f.x,f.y,f.z); // nenhuma cor
    e.data = TL4;
    e.color_flag=1 // índice de cor proporcional à altitude (coordenada z)
    e.color_flag=2; // de volta ao modo padrão
    e.color_flag= 3; // modo de gradação interpolada (baseada na cor azul padrão)
    clf()
    plot3d([xx xx],[yy yy],list([zz zz+4],[4*ones(1,400) 5*ones(1,400)]))
    h=gce(); //obtendo manipulador da entidade corrente (aqui é a superfície)
    a=gca(); //obtendo eixos correntes
    a.rotation_angles=[40,70];
    a.grid=[1 1 1]; //criando grides
    a.data_bounds=[-6,0,-1;6,6,5];
    a.axes_visible="off"; //os eixo estão escondidos
    a.axes_bounds=[.2 0 1 1];
    h.color_flag=1; //colorindo de acordo com z
    h.color_mode=-2;  //removendo as bordas das facetas ajustando color_mode para a cor branca
    h.color_flag=2; //colorindo de acordo com as cores fornecidas
    h.color_mode = -1; // colocando de volta as bordas das facetas ajustando color_mode de volta para preto
    f=gcf();//obtendo o manipulador da figura raiz
    f.color_map=hotcolormap(512);
    c=[1:400,1:400];
    TL.color = [c;c+1;c+2;c+3];
    h.data = TL;
    h.color_flag=3; // modo de gradação interpolada

We can use the plot3d function to plot a set of patches (triangular, quadrangular, etc).

    // The plot3d function to draw patches:
    // patch(x,y,[z])
    // patch(x,y,[list(z,c)])
    // The size of x : number of points in the patches x number of patches
    // y and z have the same sizes as x
    // c:
    // - a vector of size number of patches: the color of the patches
    // - a matrix of size number of points in the patches x number of
    //   patches: the color of each points of each patches

    // Example 1: a set of triangular patches

    x = [0 0;
         0 1;
         1 1];

    y = [1 1;
         2 2;
         2 1];

    z = [1 1;
         1 1;
         1 1];

    tcolor = [2 3]';

    subplot(2,2,1);
    plot3d(x,y,list(z,tcolor));
    xtitle('A triangle set of patches');

    // Example 2: a mixture of triangular and quadrangular patches

    xquad = [5, 0;
             10,0;
             15,5;
             10,5];

    yquad = [15,0;
             20,10;
             15,15;
             10,5];

    zquad = ones(4,2);

    xtri = [ 0,10,10, 5, 0;
            10,20,20, 5, 0;
            20,20,15,10,10];

    ytri = [ 0,10,20, 5,10;
            10,20,20,15,20;
             0, 0,15,10,20];

    ztri = zeros(3,5);

    subplot(2,2,3);
    plot3d(xquad,yquad,zquad);
    plot3d(xtri,ytri,ztri);
    xtitle('Mixing triangle and quadrangle set of patches');

    // Example 3: some rabbits

    rabxtri = [ 5,  5, 2.5,  7.5, 10;
                5, 15, 5,   10,   10;
               15, 15, 5,   10,   15];

    rabytri = [10, 10, 9.5,  2.5, 0;
               20, 10, 12,   5,   5;
               10   0   7    0    0];
    rabztri = [0,0,0,0,0;
               0,0,0,0,0;
               0,0,0,0,0];

    rabtricolor_byface = [2 2 2 2 2];

    rabtricolor = [2,2,2,2,2;
                   3,3,3,3,3;
                   4,4,4,4,4];

    rabxquad = [0, 1;
                0, 6;
                5,11;
                5, 6];

    rabyquad = [18,23;
                23,28;
                23,28;
                18,23];

    rabzquad = [1,1;
                1,1;
                1,1;
                1,1];

    rabquadcolor_byface = [2 2];

    rabquadcolor = [2,2;
                    3,3;
                    4,4;
                    5,5];

    subplot(2,2,2);
    plot3d(rabxtri, rabytri, list(rabztri,rabtricolor));
    plot3d(rabxquad,rabyquad,list(rabzquad,rabquadcolor));
    h = gcf();
    h.children(1).background = 1;
    xtitle('A psychedelic rabbit set of patches');

    subplot(2,2,4);
    plot3d(rabxtri, rabytri, list(rabztri,rabtricolor_byface));
    plot3d(rabxquad,rabyquad,list(rabzquad,rabquadcolor_byface));
    h = gcf();
    h.children(1).background = 1;
    xtitle('A standard rabbit set of patches');

We can also use the plot3d function to plot a set of patches using vertex and faces.

    // Vertex / Faces example: 3D example

    // The vertex list contains the list of unique points composing each patch
    // The points common to 2 patches are not repeated in the vertex list

    vertex = [0 1 1;
              0 2 2;
              1 2 3;
              1 1 4];

    // The face list indicates which points are composing the patch.
    face = [1 2 3;
            1 3 4];

    tcolor = [2 3]';

    // The formula used to translate the vertex / face representation into x, y, z lists

    xvf = matrix(vertex(face,1),size(face,1),length(vertex(face,1))/size(face,1))';
    yvf = matrix(vertex(face,2),size(face,1),length(vertex(face,1))/size(face,1))';
    zvf = matrix(vertex(face,3),size(face,1),length(vertex(face,1))/size(face,1))';

    scf();
    subplot(2,1,1);
    plot3d(xvf,yvf,list(zvf,tcolor));
    xtitle('A triangle set of patches - vertex / face mode - 3d');

    // 2D test
    // We use the 3D representation with a 0 Z values and then switch to 2D representation

    // Vertex / Faces example: 3D example

    // The vertex list contains the list of unique points composing each patch
    // The points common to 2 patches are not repeated in the vertex list

    vertex = [0 1;
              0 2;
              1 2;
              1 1];

    // The face list indicates which points are composing the patch.
    face = [1 2 3;
            1 3 4];

    // The formula used to translate the vertex / face representation into x, y, z lists

    xvf = matrix(vertex(face,1),size(face,1),length(vertex(face,1))/size(face,1))';
    yvf = matrix(vertex(face,2),size(face,1),length(vertex(face,1))/size(face,1))';
    zvf = matrix(zeros(vertex(face,2)),size(face,1),length(vertex(face,1))/size(face,1))';

    subplot(2,1,2);
    plot3d(xvf,yvf,list(zvf,tcolor));
    xtitle('A triangle set of patches - vertex / face mode - 2D');
    a = gca();
    a.view = '2d';

How to set manually some ticks

    plot3d();
    h = gca();
    h.x_ticks = tlist(['ticks','locations','labels'],[-2,-1,0,1,2],['-2','-1','0','1','2']);
    h.y_ticks = tlist(['ticks','locations','labels'],[-4,-3-2,-1,0,1,2,3,4],['-4','-3','-2','-1','0','1','2','3','4']);
    h.z_ticks = tlist(['ticks','locations','labels'],[-1,0,1],['Point 1','Point 2','Point 3']);

## Ver Também

- eval3dp
- genfac3d
- geom3d
- param3d
- plot3d1
- clf
- gca
- gcf
- xdel
- delete
- axes_properties