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
|
// 08.08.12
// 09.10.31
// 09.11.12
function Out=Invperspt(varargin)
global FocusPoint EyePoint;
Eps=10^(-4);
Fk=varargin($);
NFk=Numptcrv(Fk)
Tmp=varargin(1);
if type(Tmp)==1 & length(Tmp)==1
Ph=varargin(1);
Fh=varargin(2);
else
Fh=Projpers(Fk);
if NFk>2
Tmp1=Nearestpt(Tmp,Fh);
Ph=Tmp1(2);
else
Ah=Ptcrv(1,Fh); Bh=Ptcrv(2,Fh);
V1=Tmp-Ah; V2=Bh-Ah;
Tmp1=Crossprod(V1,V2);
if abs(Tmp1)>Eps
disp('Not on the line');
Out=[];
return;
else
Ph=Dotprod(V1,V2)/norm(V2)^2+1; // 09.11.12
end;
end;
end;
if NFk>2
N=Trunc(Ph);
S0=Ph-N;
if Ph>Numptcrv(Fh)-Eps
Out=list(Ptend(Fk),Numptcrv(Fh));
return;
end;
else
N=1;
S0=Ph-1; // 09.11.12
end;
Ak=Ptcrv(N,Fk); Bk=Ptcrv(N+1,Fk);
Ah=Ptcrv(N,Fh); Bh=Ptcrv(N+1,Fh);
Ph=(1-S0)*Ah+S0*Bh;
Phc=Cancoordpers([Ph,0]);
Ahc=Cancoordpers([Ah,0]);
Bhc=Cancoordpers([Bh,0]);
Vp=Phc-EyePoint;
Va=Ak-EyePoint;
AB=Bk-Ak;
Cp=Crossprod(Vp,AB);
Nmr=Crossprod(Va,Vp);
Mx=max(abs(Cp));
if abs(Cp(1))==Mx
T2=Nmr(1)/Cp(1);
elseif abs(Cp(2))==Mx
T2=Nmr(2)/Cp(2);
else
T2=Nmr(3)/Cp(3);
end;
Pk=(1-T2)*Ak+T2*Bk;
Out=list(Pk,N+T2);
endfunction
|