summaryrefslogtreecommitdiff
path: root/texmf-dist/scripts/ketpic/ketlib/ketpic2escifiles6/Invperspt.sci
blob: c2c353556f4698ad715beff9765aaffa355a0a56 (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
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