perm filename TEST1.SAI[GEM,BGB]3 blob sn#049889 filedate 1973-09-28 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "TEST1"
C00004 00003	α IRON TRIANGLE - CAMERA LOCUS SOLVER
C00005 00004	ITG SUBR LSCAM (ITG I,K,J)
C00006 00005	REAL ARRAY XCAM,YCAM,ZCAM[1:40]		α CAMERA LOCUS SOLUTIONS
C00007 00006	α IF THE SOLUTION IS IN THE BALL PARK...
C00008 00007	SUBR CAMINIT
C00011 00008	SUBR TRANSFORM
C00013 00009	α MAIN LOOP
C00014 ENDMK
C⊗;
BEGIN "TEST1"
	REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
	REQUIRE "DPYIII[SYS,BGB]" SOURCE_FILE;
	REQUIRE "SAITRG[SYS,BGB]" SOURCE_FILE;
	SAFE ITG ARRAY DPYBUF[0:999];

α CAMERA;
	REAL PAN,TILT,SWING;
	REAL CX,CY,CZ;
	REAL IX,IY,IZ;
	REAL JX,JY,JZ;
	REAL KX,KY,KZ;
	REAL SX,SY,FOCAL,MAG;	α RASTER SCALES;
	REAL LDX,LDY,PDX,PDY;	α LOGICAL AND PHYSICAL RASTERS;
	REAL ROWPA,COLPA;	α PRINCIPLE AXIS LOCUS IN PP;

α THREE INCH CUBE;

	PRELOAD_WITH 0,3,3,3,0,0;SAFE REAL ARRAY XWC[1:6];
	PRELOAD_WITH 0,0,0,3,3,3;SAFE REAL ARRAY YWC[1:6];
	PRELOAD_WITH 0,0,3,3,3,0;SAFE REAL ARRAY ZWC[1:6];
	PRELOAD_WITH '216,'176,'122,'105,'124,'200;SAFE ITG ARRAY ROW[1:6];
	PRELOAD_WITH '220,'247,'251,'210,'160,'160;SAFE ITG ARRAY COL[1:6];

	SAFE REAL ARRAY XPP,YPP,ZPP,XDC,YDC[1:6];
	SAFE REAL ARRAY XXPP,YYPP,XXDC,YYDC[1:6];
	SAFE REAL ARRAY XCC,YCC,ZCC[1:6];

α IRON TRIANGLE - CAMERA LOCUS SOLVER;

	REAL ARRAY P1,P2,P3,COSANG[1:3],V[1:10,1:3];
	REQUIRE "LS1V3P.REL" LOAD_MODULE;
	EXTERNAL ITG PROCEDURE LS1V3P(REAL ARRAY V,P1,P2,P3,COSANG);

REAL SUBR DOTVEC(ITG I,J);
BEGIN "DOTVEC"
	REAL X1,Y1,Z1,X2,Y2,Z2,R1,R2,ZCOS;
	X1 ← XCC[I]; Y1 ← YCC[I]; Z1 ← ZCC[I];
	X2 ← XCC[J]; Y2 ← YCC[J]; Z2 ← ZCC[J];
	R1 ← SQRT(X1*X1 + Y1*Y1 + Z1*Z1);
	R2 ← SQRT(X2*X2 + Y2*Y2 + Z2*Z2);
	ZCOS←(X1*X2 + Y1*Y2 + Z1*Z2)  /  (R1*R2);
	RETURN(ZCOS);
END "DOTVEC";

ITG SUBR LSCAM (ITG I,K,J);
BEGIN "LSCAM"
	ITG M,N; REAL C1,C2,C3;

α IRON TRIANGLE - KNOWN WORLD LOCI;
	P1[1]←XWC[I]; P2[1]←XWC[J]; P3[1]←XWC[K];
	P1[2]←YWC[I]; P2[2]←YWC[J]; P3[2]←YWC[K];
	P1[3]←ZWC[I]; P2[3]←ZWC[J]; P3[3]←ZWC[K];

α IRON TRIPOD - KNOW ANGLES BETWEEN  CAMERA RAYS;
	C1←COSANG[1] ← DOTVEC(J,K);
	C2←COSANG[2] ← DOTVEC(I,K);
	C3←COSANG[3] ← DOTVEC(I,J);
	IF ABS(C1-C2)≤1@-3 ∨ ABS(C2-C3)≤1@-3 ∨ ABS(C3-C1)≤1@-3 THEN RETURN(0);

α THROW THE SHIT AT THE FAN;
	M ← LS1V3P(V,P1,P2,P3,COSANG);
	RETURN(M);
END "LSCAM";
REAL ARRAY XCAM,YCAM,ZCAM[1:40];		α CAMERA LOCUS SOLUTIONS;
SUBR CAMLS1;
BEGIN "CAMLS1"
	REAL X,Y,Z,XSUM,YSUM,ZSUM,DEL;
	REAL XCCC,YCCC,ZCCC;
	ITG I,J,K,M,N,CNT;
	CNT ← 0;XSUM←YSUM←ZSUM←0;
	DPYSET(DPYBUF);
α FOR ALL COMBINATIONS OF THREE POINTS OF THE SIX POINTS;
	FOR I←1 TIL 4 DO
	FOR J←I+1 TIL 5 DO
	FOR K←J+1 TIL 6 DO
BEGIN "TRIANGLES"
	M ← LSCAM(I,J,K);
	FOR  N←1 TIL M DO
BEGIN "SOLUTIONS"
	X ← V[N,1];	Y ← V[N,2];	Z ← V[N,3];
	DEL ← SQRT((X-CX)↑2 + (Y-CY)↑2 + (Z-CZ)↑2);

α IF THE SOLUTION IS IN THE BALL PARK...;
	IF DEL≤ 12 THEN
BEGIN "GOOD"
	CNT ← CNT+1;
	XSUM←XSUM+X;	YSUM←YSUM+Y;	ZSUM←ZSUM+Z;
	XCAM[CNT]←X;	YCAM[CNT]←Y;	ZCAM[CNT]←Z;
	X ← X-CX;	Y ← Y-CY;	Z ← Z-CZ;
	XCCC ← X*IX + Y*IY + Z*IZ;
	YCCC ← X*JX + Y*JY + Z*JZ;
	ZCCC ← X*KX + Y*KY + Z*KZ;
	AIVECT(-200,0);AVECT(15*XCCC-200,15*YCCC);
	AIVECT(+200,0);AVECT(15*XCCC+200,15*ZCCC);
	DPYOUT(1);
	OUTSTR(9&CVG(XCCC)&9&CVG(YCCC)&9&CVG(ZCCC)&↓);INCHRW;
END "GOOD";
END "SOLUTIONS";
END "TRIANGLES";
	OUTSTR(9&CVG(XSUM/CNT)&9&CVG(YSUM/CNT)&9&CVG(ZSUM/CNT)&↓);
END "CAMLS1";
SUBR CAMINIT;
BEGIN "CAMINIT"
	REAL RR;
	REAL C_PAN,S_PAN,C_TILT,S_TILT,C_SWING,S_SWING;

	CX ← -28.5;	CY ← -19;	CZ ← +17.4;
	PAN ← -π/4;	TILT ← 60*π/180; MAG ← 32/9;

	FOCAL ← 25;
	PDX ← 10.6;	LDX ← 288;
	PDY ←  8.6;	LDY ← 216;

	SX ← -FOCAL*LDX/PDX;
	SY ← -FOCAL*LDY/PDY;

	C_PAN ← COS(PAN); S_PAN ← SIN(PAN);
	C_TILT ← COS(TILT); S_TILT ← SIN(TILT);
	C_SWING ← COS(SWING); S_SWING ← SIN(SWING);

	IX ←  C_PAN*C_SWING - S_PAN*C_TILT*S_SWING;
	IY ←  S_PAN*C_SWING + C_PAN*C_TILT*S_SWING;
	IZ ←  S_TILT*S_SWING;

	JX ← -C_PAN*S_SWING - S_PAN*C_TILT*C_SWING;
	JY ← -S_PAN*S_SWING + C_PAN*C_TILT*C_SWING;
	JZ ←  S_TILT*C_SWING;

	KX ←  S_PAN*S_TILT;
	KY ← -C_PAN*S_TILT;
	KZ ←       C_TILT;
END "CAMINIT";
SUBR TRANSFORM;
BEGIN "TRANSFORM"
	ITG I;
FOR I←1 TIL 6 DO
BEGIN
	REAL X,Y,Z;
α WC → CC WORLD LOCII;
	X ← XWC[I] - CX;Y ← YWC[I] - CY;Z ← ZWC[I] - CZ;
	XCC[I] ← X*IX + Y*IY + Z*IZ;
	YCC[I] ← X*JX + Y*JY + Z*JZ;
	ZCC[I] ← X*KX + Y*KY + Z*KZ;
α CC → PP;
 	XPP[I] ← SX * XCC[I] / ZCC[I];
	YPP[I] ← SY * YCC[I] / ZCC[I];
α PP → RC;
α	ROW[I] ← 108 - YPP[I];
α	COL[I] ← XPP[I] + 144;
α RC → PP;
α	XPP[I] ← COL[I] - 144;
α	YPP[I] ← 108 - ROW[I];
α PP → CC IMAGE PLANE LOCII;
	XCC[I] ← (COL[I]-COLPA)*PDX;
	YCC[I] ← (ROWPA-ROW[I])*PDY;
	ZCC[I] ← -FOCAL;
α PP → DC;
	XDC[I] ← MAG * XPP[I];
	YDC[I] ← MAG * YPP[I];
 	XXDC[I] ← MAG * (COL[I]-144);
 	YYDC[I] ← MAG * (108-ROW[I]);
END;
END "TRANSFORM";

SUBR SHOW;
BEGIN "SHOW"
	ITG I;
	DPYSET(DPYBUF);
	AIVECT(-511,-384);
	AVECT(+511,-384);
	AVECT(+511,+384);
	AVECT(-511,+384);
	AVECT(-511,-384);

	AIVECT(XDC[6],YDC[6]);
	FOR I←1 TIL 6 DO AVECT(XDC[I],YDC[I]);
	AIVECT(XXDC[6],YYDC[6]);
	FOR I←1 TIL 6 DO AVECT(XXDC[I],YYDC[I]);
	DPYOUT(1);
END "SHOW";

α MAIN LOOP;
	CAMINIT;
	TRANSFORM;
	SHOW;INCHRW;

	CAMLS1;

	WHILE TRUE DO IF INCHRW="X" THEN DONE;
END "TEST1";