FUNCTION getBigAngle(v1,vo,v2:VECTOR):REAL; VAR angle1,angle0,angle00:REAL; voo:VECTOR; co1,co0:REAL; BEGIN co1:=DotProduct(v1,v2)/(Norm(v1)*Norm(v2)); angle1:=ArcCos(co1); IF (co1<=(-1)) THEN angle1:=PI; IF (co1>=1) THEN angle1:=0; co0:=DotProduct(vo,v2)/(Norm(vo)*Norm(v2)); angle0:=ArcCos(co0); IF (co0<=(-1)) THEN angle0:=PI; IF (co0>=1) THEN angle0:=0; IF(angle0=PI/2.0) THEN BEGIN getBigAngle:=PI; END ELSE IF (angle0PI/2.0) THEN getBigAngle:=(pi*2.0)-angle1; END; PROCEDURE ThreePoint2Param(pa,pb,pc :VECTOR; VAR vOrt,vU,vV:VECTOR); BEGIN vOrt:=pa; vU:=pb-pa; vV:=pc-pa; END; PROCEDURE Param2Koordinate(vOrt,vU,vV :VECTOR; VAR vN:VECTOR; VAR valD:REAL); BEGIN vN:=CrossProduct(vU,vV); valD:=(-1.0)*DotProduct(vN,vOrt); END; PROCEDURE ThreePoint2Koordinate(pa,pb,pc :VECTOR; VAR vN:VECTOR; VAR valD:REAL); BEGIN Param2Koordinate(pa,pb-pa,pc-pa,vN,valD); END; PROCEDURE GetCutLine(vNA:VECTOR; dA:REAL; vNB:VECTOR; dB:REAL; VAR lineOrt,lineDir:VECTOR); VAR f:REAL; xdef,ydef,zdef:BOOLEAN; {x0,y0,z0:INTEGER;} BEGIN x0:=0; y0:=0; z0:=0; xDef:=false; yDef:=false; zDef:=false; IF(vNA.x=0) THEN x0:=x0+1; IF(vNA.y=0) THEN y0:=y0+1; IF(vNA.z=0) THEN z0:=z0+1; IF(vNB.x=0) THEN x0:=x0+1; IF(vNB.y=0) THEN y0:=y0+1; IF(vNB.z=0) THEN z0:=z0+1; IF(vNA.x=0)AND(vNA.z=0)THEN BEGIN lineDir.y:=0; lineOrt.y:=-dA/vna.y; yDef:=true; END ELSE IF(vNB.x=0)AND(vNB.z=0)THEN BEGIN lineDir.y:=0; lineOrt.y:=-dB/vnb.y; yDef:=true; END; IF(vNA.x=0)AND(vNA.y=0)THEN BEGIN lineDir.z:=0; lineOrt.z:=-dA/vna.z; zDef:=true; END ELSE IF(vNB.x=0)AND(vNB.y=0)THEN BEGIN lineDir.z:=0; lineOrt.z:=-dB/vnb.z; zDef:=true; END; IF(vNA.y=0)AND(vNA.z=0)THEN BEGIN lineDir.x:=0; lineOrt.x:=-dA/vna.x; xDef:=true; END ELSE IF(vNB.y=0)AND(vNB.z=0)THEN BEGIN lineDir.x:=0; lineOrt.x:=-dB/vnb.x; xDef:=true; END; IF(x0>=y0)AND(x0>=z0)AND(xDef=false) THEN BEGIN lineDir.x:=1; lineOrt.x:=0; IF(yDef=false) THEN BEGIN IF(vNB.z<>0)THEN BEGIN f:=vNA.z/vNB.z; lineDir.y:=((vNB.x*f)-vNA.x)/(vNA.y-(vNB.y*f)); lineOrt.y:=((dB*f)-dA)/(vNA.y-(vNB.y*f)); END ELSE BEGIN f:=vNB.z/vNA.z; lineDir.y:=((vNA.x*f)-vNB.x)/(vNB.y-(vNA.y*f)); lineOrt.y:=((dA*f)-dB)/(vNB.y-(vNA.y*f)); END; END; IF(zDef=false) THEN BEGIN IF(vNB.y<>0)THEN BEGIN f:=vNA.y/vNB.y; lineDir.z:=((vNB.x*f)-vNA.x)/(vNA.z-(vNB.z*f)); lineOrt.z:=((dB*f)-dA)/(vNA.z-(vNB.z*f)); END ELSE BEGIN f:=vNB.y/vNA.y; lineDir.z:=((vNA.x*f)-vNB.x)/(vNB.z-(vNA.z*f)); lineOrt.z:=((dA*f)-dB)/(vNB.z-(vNA.z*f)); END; END; END ELSE IF(y0>=x0)AND(y0>=z0)AND(yDef=false) THEN BEGIN lineDir.y:=1; lineOrt.y:=0; IF(xDef=false) THEN BEGIN IF(vNB.z<>0)THEN BEGIN f:=vNA.z/vNB.z; lineDir.x:=((vNB.y*f)-vNA.y)/(vNA.x-(vNB.x*f)); lineOrt.x:=((dB*f)-dA)/(vNA.x-(vNB.x*f)); END ELSE BEGIN f:=vNB.z/vNA.z; lineDir.x:=((vNA.y*f)-vNB.y)/(vNB.x-(vNA.x*f)); lineOrt.x:=((dA*f)-dB)/(vNB.x-(vNA.x*f)); END; END; IF(zDef=false) THEN BEGIN IF(vNB.x<>0)THEN BEGIN f:=vNA.x/vNB.x; lineDir.z:=((vNB.y*f)-vNA.y)/(vNA.z-(vNB.z*f)); lineOrt.z:=((dB*f)-dA)/(vNA.z-(vNB.z*f)); END ELSE BEGIN f:=vNB.x/vNA.x; lineDir.z:=((vNA.y*f)-vNB.y)/(vNB.z-(vNA.z*f)); lineOrt.z:=((dA*f)-dB)/(vNB.z-(vNA.z*f)); END; END; END ELSE BEGIN lineDir.z:=1; lineOrt.z:=0; IF(xDef=false) THEN BEGIN IF(vNB.y<>0) THEN BEGIN f:=vNA.y/vNB.y; lineDir.x:=((vNB.z*f)-vNA.z)/(vNA.x-(vNB.x*f)); lineOrt.x:=((dB*f)-dA)/(vNA.x-(vNB.x*f)); END ELSE BEGIN f:=vNB.y/vNA.y; lineDir.x:=((vNA.z*f)-vNB.z)/(vNB.x-(vNA.x*f)); lineOrt.x:=((dA*f)-dB)/(vNB.x-(vNA.x*f)); END; END; IF(yDef=false)THEN BEGIN IF(vNB.y<>0) THEN BEGIN f:=vNA.x/vNB.x; lineDir.y:=((vNB.z*f)-vNA.z)/(vNA.y-(vNB.y*f)); lineOrt.y:=((dB*f)-dA)/(vNA.y-(vNB.y*f)); END ELSE BEGIN f:=vNB.x/vNA.x; lineDir.y:=((vNA.z*f)-vNB.z)/(vNB.y-(vNA.y*f)); lineOrt.y:=((dA*f)-dB)/(vNB.y-(vNA.y*f)); END; END; END; END; FUNCTION getProjectionOnLayer(inPoint,vN :VECTOR; d:REAL):VECTOR; VAR k:REAL; pPoint:VECTOR; BEGIN k:=(-1)*(DotProduct(vN,inPoint)+d)/DotProduct(vN,vN); pPoint:=inPoint+(k*vN); getProjectionOnLayer:=pPoint; END;