Есть ли более простой ответ, чтобы найти проекцию точки на плоскость?

Есть ли более простой ответ, чтобы найти проекцию точки на плоскость?

ОтсюдаЕсть ли команда для нахождения координат проекции точки на плоскость?, я получил ответ. Я знаю, что библиотека calc обновилась и задолго до обновления 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} 

Это обновление, но, вероятно, не последнее слово в этой развивающейся истории. С помощью парсеров здесь вы можете работать с символическими координатами. Код длинный, потому что в нем есть несколько определений, которые, как мы надеемся, когда-нибудь попадут в библиотеку. Эти трюки стали возможными благодарянедавнее достижение Анри Менке, и были использованыздесь. К сожалению, в этой версии вы не можете смешивать символические и явные координаты. Теперь вы можете использовать символические координаты, например

\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модуля threeAsymptote.

введите описание изображения здесь

// 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);

Связанный контент