Wie kann ich den Radius dieses Kreises genau anzeigen?

Wie kann ich den Radius dieses Kreises genau anzeigen?

Ich möchte den Radius dieses Kreises anzeigen. Das korrekte Ergebnis des Radius ist 7/sqrt(3). Mein Code.

\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}

Ich habe es versucht

\pgfmathparse{\myr}
 \pgfmathresult

Ich kann das Ergebnis nicht abrufen. Wie kann ich das Ergebnis automatisch (nicht manuell) abrufen?

Antwort1

Es gibt nur sehr begrenzte Unterstützung für die Brucherkennung und so weiter in pgf, und sobald Quadratwurzeln im Spiel sind, müssen Sie meiner Meinung nach einige Dinge von Hand erledigen. (Um fair zu sein, Computeralgebrasysteme sind auch nicht besonders gut darin, solche Ausdrücke zu erkennen, aber wenn Sie diese zum Parsen der Ausdrücke verwenden, können Sie genaue Ergebnisse erzielen. LaTeX ist jedoch kein solches Computeralgebrasystem.) Sie können die Tasten

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

erhalten

\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}

Bildbeschreibung hier eingeben

Natürlich kann man das noch besser machen, aber meines Wissens sind die Routinen für die erforderliche Ganzzahlarithmetik noch nicht in implementiert pgf(und es besteht eine geringe Wahrscheinlichkeit, dass es dafür kein richtiges Paket gibt). Das Haupthindernis besteht darin, dass gcd, das sehr nützlich ist, um gemeinsame Faktoren in Brüchen zu streichen, noch nicht mit funktioniert fpu. Andererseits benötigt man fpuhier, weil die Zahlen so groß sind. Daher habe ich eine Variante von gcd(genannt gcdFPU) und eine Anzahl anderer Routinen hinzugefügt, wie beispielsweise , integerpowermit der sich die Potenz eines Faktors in einer Ganzzahl bestimmen lässt. Beispielsweise integerpower(12,2)ergibt , 2da 12=2^2 times something that is not divisible by 2. Dies kann verwendet werden, um Quadrate aus der Quadratwurzel zu ziehen.

\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}

Bildbeschreibung hier eingeben

verwandte Informationen