
ここから平面上の点の投影座標を見つけるコマンドはありますか?答えが得られました。calc ライブラリが更新され、その更新が CTAN に届くずっと前に更新されたことは知っています。この方程式にもっと簡単な答えがあることを願っています。
答え1
アップデート: さらなる開発実験的な3dtools ライブラリこの話はまだ最終話ではないと思います。
\documentclass[border=3mm,12pt,tikz]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{3dtools}
\tikzset{3d projection of point/.style args={(#1,#2,#3) on plane through (#4,#5,#6)
with normal (#7,#8,#9)}{
/utils/exec={\pgfmathsetmacro{\myprefactor}{(#7*(#1-#4)%
+#8*(#2-#5)+#9*(#3-#6))%
/(#7*#7+#8*#8+#9*#9)}
\pgfmathsetmacro{\myx}{#1-\myprefactor*#7}
\pgfmathsetmacro{\myy}{#2-\myprefactor*#8}
\pgfmathsetmacro{\myz}{#3-\myprefactor*#9}},
insert path={%
({\myx},{\myy},{\myz})}},% symbolic version
symbolic 3d projection of point/.style args={#1 on plane through #2
with normal #3}{insert path={let \p1=(#1),\p2=(#2),\p3=(#3) in
[3d projection of point/.expanded=\coord1 on plane through \coord2 with normal \coord3]}}}
\begin{document}
\tdplotsetmaincoords{70}{110}
\begin{tikzpicture}[tdplot_main_coords,scale=1.5]
\pgfmathsetmacro\a{4}
\pgfmathsetmacro\b{3}
\pgfmathsetmacro\c{4}
% define the coordinates (note: \coordinate (A) at (0,0,0) does *NOT* work)
\path (0,0,0) coordinate(A)
(\a,0,0) coordinate (B)
(0,\b,0) coordinate (C)
(0,0,\c) coordinate (S)
[overlay,3d coordinate={(n)=(C)-(B)x(S)-(B)}];
% do the projection
\path[symbolic 3d projection of point={A on plane through S with
normal n}] coordinate (H);
% draw various parts
\draw[dashed,thick] (A) -- (B) (A) -- (C) (S)--(A) --(H) ;
\draw[thick] (S) -- (B) -- (C) -- cycle;
\foreach \point/\position in {A/left,B/left,C/below,S/above,H/above}
{
\fill (\point) circle (1.5pt);
\node[\position=3pt] at (\point) {$\point$};
}
\end{tikzpicture}
\end{document}
これはアップグレードですが、進化し続けるこの物語の最終的な結論ではないでしょう。ここでのパーサーを使用すると、シンボリック座標を扱うことができます。コードは複数の定義があるため長いですが、いつかライブラリに組み込めることを願っています。これらのトリックは、Henri Menke による最近のコミット、そして使用されているここ残念ながら、このバージョンでは、記号座標と明示的な座標を混在させることはできません。記号座標は次のように使用できます。
\path[symbolic 3d projection of point={A on plane through S with
normal n}] coordinate (H);
法線はn
記号座標から計算することができ、次のように表される。
n = (C-B) x (S-B)
そして計算は次のように行われます
\lincomb(CB)=1*(C)+(-1)*(B);
\lincomb(SB)=1*(S)+(-1)*(B);
\vecprod(n)=(CB)x(SB);
つまり、まず線形結合を形成しC-B
、S-B
それからそれらのベクトル積を計算する必要があります。ネストされた解析では、解析の専門家がこれを調べる必要があります。
\documentclass[border=3mm,12pt,tikz]{standalone}
\usepackage{tikz-3dplot}
% allows us to do linear combinations
\def\lincomb#1=#2*#3+#4*#5;{%
\path[overlay] let \p1=#3,\p2=#5 in
({(#2)*(xcomp3\coord1)+(#4)*(xcomp3\coord2)},%
{(#2)*(ycomp3\coord1)+(#4)*(ycomp3\coord2)},%
{(#2)*(zcomp3\coord1)+(#4)*(zcomp3\coord2)}) coordinate #1;}
\def\vecprod#1=#2x#3;{%
\path[overlay] let \p1=#2,\p2=#3 in
({vpx({\coord1},{\coord2})},%
{vpy({\coord1},{\coord2})},%
{vpz({\coord1},{\coord2})}) coordinate #1;}
\pgfmathdeclarefunction{xcomp3}{3}{% x component of a 3-vector
\begingroup%
\pgfmathparse{#1}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{ycomp3}{3}{% y component of a 3-vector
\begingroup%
\pgfmathparse{#2}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{zcomp3}{3}{% z component of a 3-vector
\begingroup%
\pgfmathparse{#3}%
\pgfmathsmuggle\pgfmathresult\endgroup}
% vector product auxiliary functions
\newcommand{\vpauxx}[6]{(#2)*(#6)-(#3)*(#5)}
\newcommand{\vpauxy}[6]{(#4)*(#3)-(#1)*(#6)}
\newcommand{\vpauxz}[6]{(#1)*(#5)-(#2)*(#4)}
% vector product pgf functions
\pgfmathdeclarefunction{vpx}{2}{% x component of vector product
\begingroup%
\pgfmathparse{\vpauxx#1#2}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{vpy}{2}{% y component of vector product
\begingroup%
\pgfmathparse{\vpauxy#1#2}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{vpz}{2}{% z component of vector product
\begingroup%
\pgfmathparse{\vpauxz#1#2}%
\pgfmathsmuggle\pgfmathresult\endgroup}
% original version of projection (works with symbolic coordinates)
\tikzset{3d projection of point/.style args={(#1,#2,#3) on plane through (#4,#5,#6)
with normal (#7,#8,#9)}{
/utils/exec={\pgfmathsetmacro{\myprefactor}{(#7*(#1-#4)%
+#8*(#2-#5)+#9*(#3-#6))%
/(#7*#7+#8*#8+#9*#9)}
\pgfmathsetmacro{\myx}{#1-\myprefactor*#7}
\pgfmathsetmacro{\myy}{#2-\myprefactor*#8}
\pgfmathsetmacro{\myz}{#3-\myprefactor*#9}},
insert path={%
({\myx},{\myy},{\myz})}},% symbolic version
symbolic 3d projection of point/.style args={#1 on plane through #2
with normal #3}{insert path={let \p1=(#1),\p2=(#2),\p3=(#3) in
[3d projection of point/.expanded=\coord1 on plane through \coord2 with normal \coord3]}}}
\begin{document}
\tdplotsetmaincoords{70}{110}
\begin{tikzpicture}[tdplot_main_coords,scale=1.5]
\pgfmathsetmacro\a{4}
\pgfmathsetmacro\b{3}
\pgfmathsetmacro\c{4}
% define the coordinates (note: \coordinate (A) at (0,0,0) does *NOT* work)
\path (0,0,0) coordinate(A)
(\a,0,0) coordinate (B)
(0,\b,0) coordinate (C)
(0,0,\c) coordinate (S);
\lincomb(C-B)=1*(C)+(-1)*(B);
\lincomb(S-B)=1*(S)+(-1)*(B);
% compute the normal n
\vecprod(n)=(C-B)x(S-B);
% do the projection
\path[symbolic 3d projection of point={A on plane through S with
normal n}] coordinate (H);
% draw various parts
\draw[dashed,thick] (A) -- (B) (A) -- (C) (S)--(A) --(H) ;
\draw[thick] (S) -- (B) -- (C) -- cycle;
\foreach \point/\position in {A/left,B/left,C/below,S/above,H/above}
{
\fill (\point) circle (1.5pt);
\node[\position=3pt] at (\point) {$\point$};
}
\end{tikzpicture}
\end{document}
これらのパーサーを使用すると、射影を直接計算することもできます。 の射影から を減算する必要があります。A
これは直接実行できます (もちろん、同じ出力が生成されます)。A-S
n
H = A - (((A-S).(n))/((n).(n))) * n
\documentclass[border=3mm,12pt,tikz]{standalone}
\usepackage{tikz-3dplot}
% allows us to do linear combinations
\def\lincomb#1=#2*#3+#4*#5;{%
\path[overlay] let \p1=#3,\p2=#5 in
({(#2)*(xcomp3\coord1)+(#4)*(xcomp3\coord2)},%
{(#2)*(ycomp3\coord1)+(#4)*(ycomp3\coord2)},%
{(#2)*(zcomp3\coord1)+(#4)*(zcomp3\coord2)}) coordinate #1;}
% vector product
\def\vecprod#1=#2x#3;{%
\path[overlay] let \p1=#2,\p2=#3 in
({vpx({\coord1},{\coord2})},%
{vpy({\coord1},{\coord2})},%
{vpz({\coord1},{\coord2})}) coordinate #1;}
% scalar product
\makeatletter
\def\scalprod#1=#2.#3;{%
\path[overlay] let \p1=#2,\p2=#3 in
\pgfextra{\pgfmathsetmacro\pgfutil@tmpa{scalarproduct({\coord1},{\coord2})}
\xdef\pgfutil@tmpa{\pgfutil@tmpa}};%
\edef#1{\pgfutil@tmpa}}%
\makeatother
\newcommand{\spaux}[6]{(#1)*(#4)+(#2)*(#5)+(#3)*(#6)}
\pgfmathdeclarefunction{scalarproduct}{2}{% scalar product of two 3-vectors
\begingroup%
\pgfmathparse{\spaux#1#2}%
\pgfmathsmuggle\pgfmathresult\endgroup}
% projections
\pgfmathdeclarefunction{xcomp3}{3}{% x component of a 3-vector
\begingroup%
\pgfmathparse{#1}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{ycomp3}{3}{% y component of a 3-vector
\begingroup%
\pgfmathparse{#2}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{zcomp3}{3}{% z component of a 3-vector
\begingroup%
\pgfmathparse{#3}%
\pgfmathsmuggle\pgfmathresult\endgroup}
% vector product auxiliary functions
\newcommand{\vpauxx}[6]{(#2)*(#6)-(#3)*(#5)}
\newcommand{\vpauxy}[6]{(#4)*(#3)-(#1)*(#6)}
\newcommand{\vpauxz}[6]{(#1)*(#5)-(#2)*(#4)}
% vector product pgf functions
\pgfmathdeclarefunction{vpx}{2}{% x component of vector product
\begingroup%
\pgfmathparse{\vpauxx#1#2}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{vpy}{2}{% y component of vector product
\begingroup%
\pgfmathparse{\vpauxy#1#2}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{vpz}{2}{% z component of vector product
\begingroup%
\pgfmathparse{\vpauxz#1#2}%
\pgfmathsmuggle\pgfmathresult\endgroup}
\begin{document}
\tdplotsetmaincoords{70}{110}
\begin{tikzpicture}[tdplot_main_coords,scale=1.5]
\pgfmathsetmacro\a{4}
\pgfmathsetmacro\b{3}
\pgfmathsetmacro\c{4}
% define the coordinates (note: \coordinate (A) at (0,0,0) does *NOT* work)
\path (0,0,0) coordinate(A)
(\a,0,0) coordinate (B)
(0,\b,0) coordinate (C)
(0,0,\c) coordinate (S);
\lincomb(C-B)=1*(C)+(-1)*(B);
\lincomb(S-B)=1*(S)+(-1)*(B);
\lincomb(A-S)=1*(A)+(-1)*(S);
% compute the normal n
\vecprod(n)=(C-B)x(S-B);
% projection of (A-S) on n
\scalprod\mysp=(A-S).(n);
% square of n
\scalprod\myln=(n).(n);
% H = A - (((A-S).(n))/((n).(n))) * n
\lincomb(H)=1*(A)+{(-1*(\mysp)/\myln)}*(n);
% draw various parts
\draw[dashed,thick] (A) -- (B) (A) -- (C) (S)--(A) --(H) ;
\draw[thick] (S) -- (B) -- (C) -- cycle;
\foreach \point/\position in {A/left,B/left,C/below,S/above,H/above}
{
\fill (\point) circle (1.5pt);
\node[\position=3pt] at (\point) {$\point$};
}
\end{tikzpicture}
\end{document}
答え2
planeproject
これは、Asymptote のモジュールのコマンドを使用して簡単に実行できますthree
。
// http://asymptote.ualberta.ca/
unitsize(1cm);
import three;
currentprojection=orthographic(2,4,1,zoom=.8);
triple A=(3,0,0), B=(0,6,0), C=(0,0,4);
path3 base=A--B--C--cycle;
triple H=planeproject(base,normal(base))*O;
draw(O--A^^O--B^^O--C,dashed);
draw(O--H,red);
draw(base);
dot("$A$",A,W);
dot("$B$",B,E);
dot("$C$",C,N);
dot("$O$",O,NE);
dot("$H$",H,SW,red);