Graphics demos: remove warnings in Bezier demos
[scilab.git] / scilab / modules / graphics / demos / bezier / Macros.sci
1 //
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) INRIA
4 //
5 // This file is distributed under the same license as the Scilab package.
6 //
7
8 function [X,Y]=field(x,y)
9     // x and y are two vectors defining a grid
10     // X and Y are two matrices which gives the grid point coordinates
11     //-------------------------------------------------------------
12     [rx,cx]=size(x);
13     [ry,cy]=size(y);
14     if rx<>1, write(%io(2),"x must be a row vector");return;end;
15     if ry<>1, write(%io(2),"y must be a row vector");return;end;
16     X=x.*.ones(cy,1);
17     Y=y'.*.ones(1,cx);
18 endfunction
19
20 function [z]=dup(x,n)
21     // utility
22     // x is a vector this function returns [x,x,x,x...] or [x;x;x;x;..]
23     // depending on x
24     [nr,nc]=size(x)
25     if nr==1 then
26         y=ones(n,1);
27         z= x.*.y ;
28     else
29         if nc<>1 then
30             error("dup : x must be a vector");
31         else
32             y=ones(1,n);
33             z= x.*.y ;
34         end
35     end
36 endfunction
37
38
39 function [z] = bezier(p,t)
40     //comment : Computes a  Bezier curves.
41     //For a test try:
42     //beziertest; bezier3dtest; nurbstest; beziersurftest; c1test;
43     //Uses the following functions:
44     //bezier, bezier3d, nurbs, beziersurface
45     //endcomment
46     //reset();
47     // Evaluate sum p_i B_{i,n}(t) the easy and direct way.
48     // p must be a k x n+1 matrix (n+1) points, dimension k.
49     n=size(p,"c")-1;// i=nonzeros(t~=1);
50     t1=(1-t); t1z= find(t1==0.0); t1(t1z)= ones(t1z);
51     T=dup(t./t1,n)';
52     b=[((1-t').^n),(T.*dup((n-(1:n)+1)./(1:n),size(t,"c")))];
53     b=cumprod(b,"c");
54     if (size(t1z,"c")>0); b(t1z,:)= dup([ 0*ones(1,n),1],size(t1z,"c")); end;
55     z=p*b';
56 endfunction
57
58
59 function bezier3d (p)
60     // Shows a 3D Bezier curve and its polygon
61     t=linspace(0,1,300);
62     s=bezier(p,t);
63     dh=xget("dashes");
64     xset("dashes",3)
65     param3d(p(1,:),p(2,:),p(3,:),34,45)
66     xset("dashes",4);
67     param3d(s(1,:),s(2,:),s(3,:),34,45,"x@y@z",[0,0])
68     xset("dashes",dh);
69     xtitle("A 3d polygon and its Bezier curve");
70     current_axe = gca();current_axe.title.font_size = 3;
71 endfunction
72
73
74 function [X,Y,Z]=beziersurface (x,y,z,n)
75     // Compute a Bezier surface. Return {bx,by,bz}.
76     [lhs,rhs]=argn(0);
77     if rhs <= 3 ; n=20;end
78     t=linspace(0,1,n);
79     n=size(x,"r")-1; // i=nonzeros(t~=1);
80     t1=(1-t); t1z= find(t1==0.0); t1(t1z)= ones(t1z);
81     T=dup(t./t1,n)';
82     b1=[((1-t').^n),(T.*dup((n-(1:n)+1)./(1:n),size(t,"c")))];
83     b1=cumprod(b1,"c");
84     if (size(t1z,"c")>0);
85         b1(t1z,:)= dup([ 0*ones(1,n),1],size(t1z,"c"));
86     end
87     n=size(x,"c")-1; // i=nonzeros(t~=1);
88     t1=(1-t); t1z= find(t1==0.0); t1(t1z)= ones(t1z);
89     T=dup(t./t1,n)';
90     b2=[((1-t').^n),(T.*dup((n-(1:n)+1)./(1:n),size(t,"c")))];
91     b2=cumprod(b2,"c");
92     if (size(t1z,"c")>0);
93         b2(t1z,:)= dup([ 0*ones(1,n),1],size(t1z,"c"));
94     end
95     X=b1*x*b2';Y=b1*y*b2';Z=b1*z*b2';
96 endfunction