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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
// 08.09.13
// 08.10.17
// 09.05.27
// 09.12.31 (gsort)
function Out=Partitionseg(varargin)
global PARTITIONPT OTHERPARTITION;
Nargs=length(varargin);
Fig=varargin(1);
GL=varargin(2); N=3;
Eps0=10^(-5);
Eps=0.05;
if Nargs>2
Eps=varargin(3);
end;
Eps2=0.2;
if Nargs>3
Eps2=varargin(4);
end;
if Nargs>4
Ns=varargin(5);
Other=Mixop(Ns,OTHERPARTITION);
else
Ns=1;
Other=[];
OTHERPARTITION=[];
for N=1:Mixlength(GL)
OTHERPARTITION=Mixadd(OTHERPARTITION,[]);
end;
end;
Npt=size(Fig,1);
ParL=[1,Npt,Other];
for N=Ns:Mixlength(GL)
G=Mixop(N,GL);
if Fig==G
KouL=IntersectselfPp(Fig,Eps,Eps2);
else
KouL=IntersectcrvsPp(Fig,G,Eps,Eps2);
Tmp=Nearestpt(Ptstart(Fig),G);
Tmp1=Mixop(1,Tmp);
Tmp2=Mixop(2,Tmp);
Tmp3=Mixop(3,Tmp);
if Tmp3>Eps0 & Tmp3<Eps
Tmp1=Mix(Tmp1,1,floor(Tmp2));
KouL=Mixadd(KouL,Tmp1);
end;
Tmp=Nearestpt(Ptend(Fig),G);
Tmp1=Mixop(1,Tmp);
Tmp2=Mixop(2,Tmp);
Tmp3=Mixop(3,Tmp);
if Tmp3>Eps0 & Tmp3<Eps
Tmp1=Mix(Tmp1,Numptcrv(Fig),floor(Tmp2));
KouL=Mixadd(KouL,Tmp1);
end;
end;
for I=1:Mixlength(KouL)
Tmp=Mixop(I,KouL);
P=Mixop(1,Tmp);
S=Mixop(2,Tmp);
ParL=[ParL,S];
K=Mixop(3,Tmp);
S=ParamonCurve(P,K,G);
Tmp=Mixop(N,OTHERPARTITION);
Tmp1=gsort([Tmp,S]);
Tmp1=Tmp1(length(Tmp1):-1:1);
Tmp2=[];
for J=1:Mixlength(OTHERPARTITION)
Tmp3=Mixop(J,OTHERPARTITION);
if J~=N
Tmp2=Mixadd(Tmp2,Tmp3);
else
Tmp2=Mixadd(Tmp2,Tmp1);
end;
end;
OTHERPARTITION=Tmp2;
end;
end;
ParL=gsort(ParL);
ParL=ParL(length(ParL):-1:1);
ParL(1)=1;
Out=[ParL(1)];
P=PointonCurve(ParL(1),Fig);
PARTITIONPT=Mix(P);
for I=1:length(ParL)
Tmp=ParL(I);
P=PointonCurve(Tmp,Fig);
Tmp1=Out(length(Out));
Q=PointonCurve(Tmp1,Fig);
if norm(P-Q)>Eps
Out=[Out,Tmp];
// P=PointonCurve(Tmp,Fig);
PARTITIONPT=Mixadd(PARTITIONPT,P);
end;
end;
if Out(length(Out))~=Npt
Out=[Out(1:length(Out)-1),Npt];
end;
if length(Out)==1 Out=[1,Npt]; end;
endfunction;
|