Как мне точно показать радиус этой окружности?

Как мне точно показать радиус этой окружности?

Я хочу показать радиус этого круга. Правильный результат радиуса — 7/sqrt(3). Мой код.

\documentclass[border = 1mm]{standalone} 
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{intersections,calc,backgrounds,fpu} 
\newcommand{\PgfmathsetmacroFPU}[2]{\begingroup%
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathsetmacro{#1}{#2}%
\pgfmathsmuggle#1\endgroup}
\begin{document}
\tdplotsetmaincoords{70}{80}
\begin{tikzpicture}[tdplot_main_coords,line join = round, line cap = round]
    \pgfmathsetmacro{\a}{5} 
    \pgfmathsetmacro{\b}{7} 
    \pgfmathsetmacro{\c}{8} 
    \PgfmathsetmacroFPU{\myr}{{sqrt(-
     pow(\a,2) *pow(\b,2)* pow(\c,2)/ (pow(\a,4)  + pow(\b,4)  + pow(\c,4)- 2
     *pow(\a,2) *pow(\b,2)  - 2*pow(\c,2) *pow(\b,2)-2*pow(\c,2) *pow(\a,2) ))}}

    \coordinate (A) at (0,0,0);
    \coordinate (B) at (\c,0,0);
    \coordinate (C) at  ({(pow(\b,2) + pow(\c,2) - pow(\a,2))/(2*\c)},{sqrt((\a+\b-\c) *(\a-\b+\c) *(-\a+\b+\c)* (\a+\b+\c))/(2*\c)},0);
    \coordinate (T) at  (\c/2, {\c* (\a*\a + \b*\b - \c*\c)/(2*sqrt((\a+\b-\c) *(\a-\b+\c)* (-\a+\b+\c)* (\a+\b+\c)))},0);
    \foreach \point/\position in {A/left,B/below,C/right,T/below}
    {
        \fill (\point) circle (1.8pt);
        \node[\position=3pt] at (\point) {$\point$};
    }
    \begin{scope}[canvas is xy plane at z=0]
    \draw[thick] (T) circle (\myr); 
    \end{scope}
 \pgfmathparse{\myr}
 \pgfmathresult
\end{tikzpicture}
   \end{document}

Я пытался

\pgfmathparse{\myr}
 \pgfmathresult

Я не могу получить результат. Как мне получить результат автоматически (не вручную)?

решение1

В pgf есть только очень ограниченная поддержка обнаружения дробей и т. д., и как только дело доходит до квадратных корней, я думаю, вам придется делать некоторые вещи вручную. (Справедливости ради, системы компьютерной алгебры также не очень хороши в обнаружении таких выражений, но если вы используете их для разбора выражений, то вы можете получить точный результат. Однако LaTeX не является такой уж системой компьютерной алгебры.) Вы можете использовать клавиши

\pgfkeys{/pgf/number format/.cd,frac, frac denom=3,frac whole=false}

чтобы получить

\documentclass[border = 1mm]{standalone} 
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usetikzlibrary{intersections,calc,backgrounds,fpu} 
\newcommand{\PgfmathsetmacroFPU}[2]{\begingroup%
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathsetmacro{#1}{#2}%
\pgfmathsmuggle#1\endgroup}
\begin{document}
\tdplotsetmaincoords{70}{80}
\begin{tikzpicture}[tdplot_main_coords,line join = round, line cap = round]
    \pgfmathsetmacro{\a}{5} 
    \pgfmathsetmacro{\b}{7} 
    \pgfmathsetmacro{\c}{8} 
    \PgfmathsetmacroFPU{\myr}{{sqrt(-
     pow(\a,2) *pow(\b,2)* pow(\c,2)/ (pow(\a,4)  + pow(\b,4)  + pow(\c,4)- 2
     *pow(\a,2) *pow(\b,2)  - 2*pow(\c,2) *pow(\b,2)-2*pow(\c,2) *pow(\a,2) ))}}

    \coordinate (A) at (0,0,0);
    \coordinate (B) at (\c,0,0);
    \coordinate (C) at  ({(pow(\b,2) + pow(\c,2) - pow(\a,2))/(2*\c)},{sqrt((\a+\b-\c) *(\a-\b+\c) *(-\a+\b+\c)* (\a+\b+\c))/(2*\c)},0);
    \coordinate (T) at  (\c/2, {\c* (\a*\a + \b*\b - \c*\c)/(2*sqrt((\a+\b-\c) *(\a-\b+\c)* (-\a+\b+\c)* (\a+\b+\c)))},0);
    \foreach \point/\position in {A/left,B/below,C/right,T/below}
    {
        \fill (\point) circle (1.8pt);
        \node[\position=3pt] at (\point) {$\point$};
    }
    \begin{scope}[canvas is xy plane at z=0]
    \draw[thick] (T) circle (\myr); 
    \end{scope}
 \draw (T)  -- (C) node[midway,sloped,fill=white] {%
 \pgfmathparse{\myr/sqrt(3)}%
 \pgfkeys{/pgf/number format/.cd,frac, frac denom=3,frac whole=false}%  
 $\pgfmathprintnumber{\pgfmathresult}\cdot\sqrt{3}\,$cm};
\end{tikzpicture}
\end{document}

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

Конечно, можно сделать лучше, но, насколько мне известно, процедуры для выполнения требуемой целочисленной арифметики еще не реализованы в pgf(и есть небольшая вероятность, что для них нет настоящего пакета). Главное препятствие заключается в том, что gcd, который очень полезен для сокращения общих множителей в дробях, еще не работает с fpu. С другой стороны, вам fpuздесь нужно , потому что числа очень большие. Поэтому я добавил вариант gcd(называемый gcdFPU) и ряд других процедур, таких как , integerpowerкоторый позволяет определить степень множителя в целом числе. Например, integerpower(12,2)yields 2since 12=2^2 times something that is not divisible by 2. Это можно использовать для извлечения квадратов из квадратного корня.

\documentclass[tikz,border=1mm]{standalone} 
\usepackage{tikz-3dplot}
\usetikzlibrary{fpu} 
\newcounter{ifactor}
\newcommand{\PgfmathsetmacroFPU}[2]{\begingroup%
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathsetmacro{#1}{#2}%
\pgfmathsmuggle#1\endgroup}
\newcommand{\PgfmathtruncatemacroFPU}[2]{\begingroup%
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathtruncatemacro{#1}{round(#2)}%
\pgfmathsmuggle#1\endgroup}
% the following functions are based on 
% * https://tex.stackexchange.com/a/177109 (digitcount,digitsum,lastdigit)
% * https://tex.stackexchange.com/a/501895 (memberQ)
% or new in the sense that they were developed on the basis of the existing
% pgf functions
\makeatletter
\newcount\c@Digits
\newcount\c@Powers
\pgfmathdeclarefunction{digitcount}{1}{%
  \begingroup%
  \global\c@Digits=0
  \expandafter\DigitCount@i#1\@nil%
  \pgfmathparse{int(\the\c@Digits)}%
  \pgfmathsmuggle\pgfmathresult\endgroup}
% \def\GroupDigits#1{%
%   \global\c@Digits=0
%   \expandafter\DigitCount@i#1\@nil%
%   \pgfmathparse{int(\the\c@Digits)}}
\def\DigitCount@i#1#2\@nil{%
  \advance\c@Digits by \@ne
  \ifx\relax#2\relax\else\DigitCount@i#2\@nil\fi
}
\pgfmathdeclarefunction{digitsum}{1}{%
  \begingroup%
  \global\c@Digits=0
  \expandafter\DigitSum@i#1\@nil%
  \pgfmathparse{int(\the\c@Digits)}%
    \pgfmathsmuggle\pgfmathresult\endgroup}
% \def\DigitSum#1{%
%   \global\c@Digits=0
%   \expandafter\DigitSum@i#1\@nil%
%   \pgfmathparse{int(\the\c@Digits)}}
\def\DigitSum@i#1#2\@nil{%
  \advance\c@Digits by #1
  \ifx\relax#2\relax\else\DigitSum@i#2\@nil\fi
}
\pgfmathdeclarefunction{lastdigit}{1}{%
  \begingroup%
    \global\c@Digits=0
    \expandafter\LastDigit@i#1\@nil%
    \pgfmathparse{int(\the\c@Digits)}%
    \pgfmathsmuggle\pgfmathresult\endgroup}
% \def\LastDigit#1{%
%   \global\c@Digits=0
%   \expandafter\LastDigit@i#1\@nil%
%   \pgfmathparse{int(\the\c@Digits)}}
\def\LastDigit@i#1#2\@nil{%
  \c@Digits=#1
  \ifx\relax#2\relax\else\LastDigit@i#2\@nil\fi
}
\pgfmathdeclarefunction{integerpower}{2}{%
  \begingroup%
    \global\c@Powers=0%
    \pgfmathtruncatemacro{\pgfutil@tmpa}{#1}%
    \loop\pgfmathtruncatemacro{\itest}{gcd(\pgfutil@tmpa,#2)}%0
    \ifnum\itest>1\relax%
    \advance\c@Powers by \@ne%
    \pgfmathtruncatemacro{\pgfutil@tmpa}{\pgfutil@tmpa/#2}%
    \repeat%
    \pgfmathparse{int(\the\c@Powers)}%
    \pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{integerpower2}{1}{% works with large numbers
  \begingroup%
    \pgfkeys{/pgf/fpu=false}%
    \global\c@Powers=0%
    \PgfmathtruncatemacroFPU{\pgfutil@tmpa}{#1}%
    \loop%
    \pgfmathtruncatemacro{\pgfutil@tmpb}{lastdigit(\pgfutil@tmpa)}%
    \pgfmathtruncatemacro{\itest}{iseven(\pgfutil@tmpb)}%
    \ifnum\itest=1%
    \advance\c@Powers by \@ne%
    \PgfmathtruncatemacroFPU{\pgfutil@tmpa}{\pgfutil@tmpa/2}%
    \repeat%
    \pgfmathparse{int(\the\c@Powers)}%
    \pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{integerpower3}{1}{% works with large numbers
  \begingroup%
    \pgfkeys{/pgf/fpu=false}%
    \global\c@Powers=0%
    \PgfmathtruncatemacroFPU{\pgfutil@tmpa}{#1}%
    \loop%
    \pgfmathtruncatemacro{\itest}{divby3(\pgfutil@tmpa)}%
    \ifnum\itest=1%
    \advance\c@Powers by \@ne%
    \PgfmathtruncatemacroFPU{\pgfutil@tmpa}{\pgfutil@tmpa/3}%
    \repeat%
    \pgfmathparse{int(\the\c@Powers)}%
    \pgfmathsmuggle\pgfmathresult\endgroup} 
\pgfmathdeclarefunction{memberQ}{2}{%
  \begingroup%
    \edef\pgfutil@tmpb{0}%
    \edef\pgfutil@tmpa{#2}%
    \expandafter\pgfmath@member@i\pgfutil@firstofone#1\pgfmath@token@stop
    \edef\pgfmathresult{\pgfutil@tmpb}%
    \pgfmath@smuggleone\pgfmathresult%
  \endgroup}
\def\pgfmath@member@i#1{%
    \ifx\pgfmath@token@stop#1%
    \else
      \ifnum#1=\pgfutil@tmpa\relax%
      \gdef\pgfutil@tmpb{1}%
      \fi%
      \expandafter\pgfmath@member@i
    \fi} 
\pgfmathdeclarefunction{isevenFPU}{1}{%
  \begingroup%
  \pgfmathparse{iseven(lastdigit(#1))}%
    \pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{isoddFPU}{1}{%
  \begingroup%
  \pgfmathparse{isodd(lastdigit(#1))}%
    \pgfmathsmuggle\pgfmathresult\endgroup}        
\pgfmathdeclarefunction{divby3}{1}{%
  \begingroup%
  \pgfmathparse{memberQ({3,6,9},digitsum(digitsum(#1)))}%
  \pgfmathsmuggle\pgfmathresult\endgroup}   
\pgfmathdeclarefunction{gcdFPU}{2}{%
  \begingroup
    \pgfkeys{/pgf/fpu=false}%
    \pgfmathcontinuelooptrue
    \PgfmathtruncatemacroFPU{\pgfutil@tmpa}{#1}%
    \PgfmathtruncatemacroFPU{\pgfutil@tmpb}{#2}%
    \PgfmathtruncatemacroFPU{\itest}{ifthenelse(\pgfutil@tmpa==0,1,0)}%
    \ifnum\itest=1\relax
      \pgfmathcontinueloopfalse
      \PgfmathtruncatemacroFPU{\pgfutil@tmpa}{\pgfutil@tmpb}%
    \fi%
    \PgfmathtruncatemacroFPU{\itest}{ifthenelse(\pgfutil@tmpb==0,1,0)}%
    \ifnum\itest=1\relax
      \pgfmathcontinueloopfalse
      \PgfmathtruncatemacroFPU{\pgfutil@tmpb}{\pgfutil@tmpa}%
    \fi%
    \PgfmathtruncatemacroFPU{\pgfutil@tmpa}{abs(\pgfutil@tmpa)}%
    \PgfmathtruncatemacroFPU{\pgfutil@tmpb}{abs(\pgfutil@tmpb)}%
    \loop
      \ifpgfmathcontinueloop%
      \PgfmathtruncatemacroFPU{\itest}{ifthenelse(\pgfutil@tmpa==\pgfutil@tmpb,1,0)}%
      \ifnum\itest=1\relax
        \pgfmathcontinueloopfalse
      \else
        \PgfmathtruncatemacroFPU{\itest}{ifthenelse(\pgfutil@tmpa>\pgfutil@tmpb,1,0)}%
        \ifnum\itest=1\relax
          \PgfmathtruncatemacroFPU{\pgfutil@tmpa}{\pgfutil@tmpa-\pgfutil@tmpb}%
        \else
          \PgfmathtruncatemacroFPU{\pgfutil@tmpb}{\pgfutil@tmpb-\pgfutil@tmpa}%
        \fi
      \fi
    \repeat
    \PgfmathtruncatemacroFPU\pgfmathresult{\pgfutil@tmpa}%
    \pgfmathsmuggle\pgfmathresult\endgroup}
\pgfmathdeclarefunction{factorinteger}{1}{%
\begingroup% not yet done
\endgroup
}  
\makeatother

\newcommand{\Pgfmathfraction}[3]{\begingroup%
\pgfmathtruncatemacro{\mynumerator}{#2/gcd(#2,#3)}%
\pgfmathtruncatemacro{\mydenominator}{#3/gcd(#2,#3)}%
\pgfmathsmuggle#1\endgroup}
\begin{document}
\tdplotsetmaincoords{70}{80}
\foreach \a/\b/\c in {3/4/5,6/7/8,5/7/8}
{\begin{tikzpicture}[tdplot_main_coords,line join = round, line cap = round,
declare function={numerator(\a,\b,\c)=pow(\a,2) *pow(\b,2)* pow(\c,2);
denominator(\a,\b,\c)=-pow(\a,4)  - pow(\b,4)  - pow(\c,4)+% 
2*pow(\a,2) *pow(\b,2)+2*pow(\c,2) *pow(\b,2)+2*pow(\c,2)*pow(\a,2);}]
 \begin{scope}[local bounding box=elli]
    \PgfmathtruncatemacroFPU{\mynumerator}{numerator(\a,\b,\c)}
    \PgfmathtruncatemacroFPU{\mydenominator}{denominator(\a,\b,\c)}
    \PgfmathtruncatemacroFPU{\mygcd}{gcdFPU(\mynumerator,\mydenominator)}
    \message{numerator=\mynumerator,denominator=\mydenominator,gcd=\mygcd^^J}
    \PgfmathtruncatemacroFPU{\newnumerator}{\mynumerator/\mygcd}
    \PgfmathtruncatemacroFPU{\newdenominator}{\mydenominator/\mygcd}
    \message{new numerator=\newnumerator,new denominator=\newdenominator^^J}
    \pgfmathtruncatemacro{\myprenum}{1}
    \pgfmathtruncatemacro{\mypreden}{1}
    \foreach \Prime in {2,3,5,7,11,13,17}
    {\pgfmathtruncatemacro{\myint}{integerpower(\newnumerator,\Prime)}
     \ifnum\myint>1
      \pgfmathtruncatemacro{\myint}{2*int(\myint/2)}
      \PgfmathtruncatemacroFPU{\newnumerator}{\newnumerator/pow(\Prime,\myint)}
      \xdef\newnumerator{\newnumerator}
      \pgfmathtruncatemacro{\myprenum}{\myprenum*pow(\Prime,\myint/2)}
      \xdef\myprenum{\myprenum}
     \fi
    \pgfmathtruncatemacro{\myint}{integerpower(\newdenominator,\Prime)}
     \ifnum\myint>0
      \pgfmathtruncatemacro{\myint}{2*int(\myint/2)}
      \PgfmathtruncatemacroFPU{\newdenominator}{\newdenominator/pow(\Prime,\myint)}
      \xdef\newdenominator{\newdenominator}
      \pgfmathtruncatemacro{\mypreden}{\mypreden*pow(\Prime,\myint/2)}
      \xdef\mypreden{\mypreden}
     \fi
    }
    \message{new numerator=\newnumerator, pre num=\myprenum,new
    denominator=\newdenominator, pre den=\mypreden^^J}
    \pgfmathsetmacro{\myr}{(\myprenum/\mypreden)*sqrt(\newnumerator/\newdenominator)}
    \coordinate (A) at (0,0,0);
    \coordinate (B) at (\c,0,0);
    \coordinate (C) at  ({(pow(\b,2) + pow(\c,2) - pow(\a,2))/(2*\c)},{sqrt((\a+\b-\c) *(\a-\b+\c) *(-\a+\b+\c)* (\a+\b+\c))/(2*\c)},0);
    \coordinate (T) at  (\c/2, {\c* (\a*\a + \b*\b - \c*\c)/(2*sqrt((\a+\b-\c) *(\a-\b+\c)* (-\a+\b+\c)* (\a+\b+\c)))},0);
    \foreach \point/\position in {A/left,B/below,C/right,T/below}
    {
        \fill (\point) circle (1.8pt);
        \node[\position=3pt] at (\point) {$\point$};
    }
    \begin{scope}[canvas is xy plane at z=0]
    \draw[thick] (T) circle (\myr); 
    \end{scope}
 \draw (T)  -- (C) node[midway,sloped,fill=white] {%
 $\displaystyle\ifnum\mypreden=1
  \myprenum
 \else
  \frac{\myprenum}{\mypreden}
 \fi
 \ifnum\newdenominator=1
  \ifnum\newnumerator=1
  \else
   \cdot\sqrt{\newnumerator}
  \fi
 \else 
  \ifnum\newnumerator=1
   \cdot\frac{1}{\sqrt{\newdenominator}}
  \else
   \cdot\sqrt{\frac{\newnumerator}{\newdenominator}}
  \fi
 \fi\,$cm};
 \end{scope}
 \node[above] at (elli.north){$a=\a,b=\b,c=\c$};
\end{tikzpicture}}
\end{document}

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

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