You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.5 KiB
111 lines
3.5 KiB
% Copyright 2019 by Max Snippe
|
|
%
|
|
% This file may be distributed and/or modified
|
|
%
|
|
% 1. under the LaTeX Project Public License and/or
|
|
% 2. under the GNU Public License.
|
|
%
|
|
% See the file doc/generic/pgf/licenses/LICENSE for more details.
|
|
|
|
\ProvidesFileRCS{tikzlibraryperspective.code.tex}
|
|
|
|
% Initialize affine transformation matrix for perspective view
|
|
% [aa ab ac 0]
|
|
% [ba bb bc 0]
|
|
% [ca cb cc 0]
|
|
% [da db dc 1]
|
|
\pgfmathsetmacro\pgf@H@tpp@aa{+1}
|
|
\pgfmathsetmacro\pgf@H@tpp@ab{+0}
|
|
\pgfmathsetmacro\pgf@H@tpp@ac{+0}
|
|
\pgfmathsetmacro\pgf@H@tpp@ba{+0}
|
|
\pgfmathsetmacro\pgf@H@tpp@bb{+1}
|
|
\pgfmathsetmacro\pgf@H@tpp@bc{+0}
|
|
\pgfmathsetmacro\pgf@H@tpp@ca{+0}
|
|
\pgfmathsetmacro\pgf@H@tpp@cb{+0}
|
|
\pgfmathsetmacro\pgf@H@tpp@cc{+1}
|
|
\pgfmathsetmacro\pgf@H@tpp@da{+0}
|
|
\pgfmathsetmacro\pgf@H@tpp@db{+0}
|
|
\pgfmathsetmacro\pgf@H@tpp@dc{+0}
|
|
|
|
\def\pgfpointperspectivexyz#1#2#3{%
|
|
\pgfmathsetmacro\pgf@pp@w%
|
|
{ \pgf@H@tpp@da*(#1) + \pgf@H@tpp@db*(#2) + \pgf@H@tpp@dc*(#3) + 1}
|
|
\pgfmathsetmacro\pgf@pp@x%
|
|
{(\pgf@H@tpp@aa*(#1) + \pgf@H@tpp@ab*(#2) + \pgf@H@tpp@ac*(#3))/\pgf@pp@w}
|
|
\pgfmathsetmacro\pgf@pp@y%
|
|
{(\pgf@H@tpp@ba*(#1) + \pgf@H@tpp@bb*(#2) + \pgf@H@tpp@bc*(#3))/\pgf@pp@w}
|
|
\pgfmathsetmacro\pgf@pp@z%
|
|
{(\pgf@H@tpp@ca*(#1) + \pgf@H@tpp@cb*(#2) + \pgf@H@tpp@cc*(#3))/\pgf@pp@w}
|
|
%
|
|
\pgf@x=\pgf@pp@x\pgf@xx%
|
|
\advance\pgf@x by \pgf@pp@y\pgf@yx%
|
|
\advance\pgf@x by \pgf@pp@z\pgf@zx%
|
|
\pgf@y=\pgf@pp@x\pgf@xy%
|
|
\advance\pgf@y by \pgf@pp@y\pgf@yy%
|
|
\advance\pgf@y by \pgf@pp@z\pgf@zy}
|
|
|
|
\tikzdeclarecoordinatesystem{three point perspective}
|
|
{%
|
|
\tikzset{cs/.cd,x=0,y=0,z=0,#1}%
|
|
\pgfpointperspectivexyz{\tikz@cs@x}{\tikz@cs@y}{\tikz@cs@z}
|
|
}
|
|
\tikzaliascoordinatesystem{tpp}{three point perspective}
|
|
|
|
\pgfkeys{
|
|
/perspective/.cd,
|
|
p/.code args={(#1,#2,#3)}{
|
|
\pgfmathparse{ifthenelse(#1,int(1),int(0))}
|
|
\ifnum\pgfmathresult=0\else
|
|
\pgfmathsetmacro\pgf@H@tpp@ba{#2/#1}
|
|
\pgfmathsetmacro\pgf@H@tpp@ca{#3/#1}
|
|
\pgfmathsetmacro\pgf@H@tpp@da{ 1/#1}
|
|
\fi
|
|
},
|
|
q/.code args={(#1,#2,#3)}{
|
|
\pgfmathparse{ifthenelse(#2,int(1),int(0))}
|
|
\ifnum\pgfmathresult=0\else
|
|
\pgfmathsetmacro\pgf@H@tpp@ab{#1/#2}
|
|
\pgfmathsetmacro\pgf@H@tpp@cb{#3/#2}
|
|
\pgfmathsetmacro\pgf@H@tpp@db{ 1/#2}
|
|
\fi
|
|
},
|
|
r/.code args={(#1,#2,#3)}{
|
|
\pgfmathparse{ifthenelse(#3,int(1),int(0))}
|
|
\ifnum\pgfmathresult=0\else
|
|
\pgfmathsetmacro\pgf@H@tpp@ac{#1/#3}
|
|
\pgfmathsetmacro\pgf@H@tpp@bc{#2/#3}
|
|
\pgfmathsetmacro\pgf@H@tpp@dc{ 1/#3}
|
|
\fi
|
|
},
|
|
}
|
|
|
|
\tikzset{
|
|
perspective/.append code={\pgfkeys{/perspective/.cd,#1}},
|
|
perspective/.default={
|
|
p={(10,0,0)},
|
|
q={(0,10,0)},
|
|
r={(0,0,20)}},
|
|
}
|
|
|
|
\tikzset{
|
|
3d view/.code 2 args={
|
|
% Set elevation and azimuth angles
|
|
\pgfmathsetmacro\pgf@view@az{#1}
|
|
\pgfmathsetmacro\pgf@view@el{#2}
|
|
% Calculate projections of rotation matrix
|
|
\pgfmathsetmacro\pgf@xvec@x{cos(\pgf@view@az)}
|
|
\pgfmathsetmacro\pgf@xvec@y{-sin(\pgf@view@az)*sin(\pgf@view@el)}
|
|
\pgfmathsetmacro\pgf@yvec@x{sin(\pgf@view@az)}
|
|
\pgfmathsetmacro\pgf@yvec@y{cos(\pgf@view@az)*sin(\pgf@view@el)}
|
|
\pgfmathsetmacro\pgf@zvec@x{+0}
|
|
\pgfmathsetmacro\pgf@zvec@y{cos(\pgf@view@el)}
|
|
% Set base vectors
|
|
\pgfsetxvec{\pgfpoint{\pgf@xvec@x cm}{\pgf@xvec@y cm}}
|
|
\pgfsetyvec{\pgfpoint{\pgf@yvec@x cm}{\pgf@yvec@y cm}}
|
|
\pgfsetzvec{\pgfpoint{\pgf@zvec@x cm}{\pgf@zvec@y cm}}
|
|
},
|
|
3d view/.default={-30}{15},
|
|
isometric view/.style={3d view={-45}{atan(1/sqrt(2))}},
|
|
}
|
|
|
|
\endinput
|
|
|