summaryrefslogtreecommitdiff
path: root/modules/graphics/macros/secto3d.sci
blob: b73b90b41b13f1d9af4ebc7a557593f5514dc379 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) 1991 - INRIA - Serge Steer
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt

function [m,x]=secto3d(seclist,npas)
    //Etant donnee une surface 3D decrite par une liste (seclist) de sections
    // dans le plan  (x,z),  [m [,x]]=secto3d(seclist [,npas]) retourne une
    // matrice m  contenant une discretisation reguliere de la surface:
    //   la i-ieme ligne de la matrice m correspond a la i-ieme section,
    //   la j-ieme colonne de m  correspondant a l'abscisse x(j).
    //Chaque section seclist(i) est decrite par une matrice a 2 lignes,
    // correspondants respectivement aux coordonnees selon l'axe des x et des z.
    //%methode
    // Il est tout d'abord calcule les bornes extremales xmin,xmax sur
    // l'axe des x pour l'ensemble des sections, l'intervalle [xmin,xmax]
    // est ensuite decoupe en npas egaux, chaque section est ensuite interpolee
    // lineairement en chaque point de cette discretisation.
    //
    // si npas est omis il est par defaut pris egal au nombre de sections.
    //%autre syntaxe
    // [m]=secto3d(seclist ,x) dans ce cas le vecteur x sera pris comme decoupage
    // de l'axe des x pour l'ensemble des sections
    //%voir aussi
    // la macro plot3d
    //!


    [lhs,rhs]=argn(0)

    if and(argn(2)<>[1 2]) then
        error(msprintf(gettext("%s: Wrong number of input argument(s): %d or %d expected.\n"), "secto3d", 1, 2));
    end

    n=size(seclist)
    //
    if rhs<2 then npas=n,end
    if prod(size(npas))==1 then
        sec=seclist(1);sec=sec(1,:)
        xmax=max(sec);xmin=min(sec)
        for k=2:n
            sec=seclist(k);sec=sec(1,:)
            xmax=max(xmax,max(sec))
            xmin=min(xmin,min(sec))
        end
        pas=(xmax-xmin)/npas
        x=[xmin-pas xmin:pas:xmax xmax+pas]
    else
        x=npas
    end
    nx=prod(size(x))
    m(n,nx)=0;
    for k=1:n
        sec=seclist(k)
        [ms,ns]=size(sec)
        sec=[[x(1);sec(2,1)],sec,[x(nx);sec(2,ns)]]
        m(k,:)=interpln(sec,x);
    end
endfunction