我想显示这个圆的半径。半径的正确结果是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)
得到。这可用于从平方根中提取平方。 2
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}