1

I am trying to find a general method to find the points A and B automatically of this picture. I can not get it. I must calculate by hand. enter image description here

\documentclass[tikz,border=3.14mm]{standalone}
    \usepackage{fouriernc}
    \usepackage{tikz}
    \usepackage{tkz-euclide}
    \usetkzobj{all}
    \usepackage{tikz-3dplot}
    \usetikzlibrary{calc,backgrounds}
    \begin{document}
    \tdplotsetmaincoords{60}{110}
    \begin{tikzpicture}
    [scale=1,tdplot_main_coords]
    \path
    coordinate (O) at (0,0,0)
    coordinate (T) at  (0,0,3)
    coordinate (B) at  (3,{-sqrt(7)},0)
    coordinate (A) at  (0,4,0);
    \draw[thick, dashed] (O) -- (A) node[midway,sloped,below] {$r$};
    \draw[thick, dashed] (T) -- (A) node[midway,right] {$R$};
    \draw[thick, dashed] (T) -- (O) node[midway,left] {$d$};
    \foreach \v/\position in {T/above,O/below,A/below,B/below} {
        \draw[draw =black, fill=black] (\v) circle (1.2pt) node [\position=0.2mm] {$\v$};
    }
    \begin{scope}[tdplot_screen_coords, on background layer]
    \pgfmathsetmacro{\R}{5}%
    \pgfmathsetmacro{\r}{4}%
    \fill[ball color=cyan!50, opacity=1.0] (T) circle (\R);
    \end{scope}
    \tkzMarkRightAngle[size = 0.3](T,O,A);
    \draw [thick] (B) arc (318.5:450:4);
    \draw [thick, dashed] (A) arc (90:318.5:4);
    \end{tikzpicture}
    \end{document}

Is there a way to find the point A and B automatically?

  • The range for the visible angle has been worked out in tex.stackexchange.com/questions/46850/… and similar posts. This allows you to determine the range for the solid arc, and thus the coordinates A and B. Alternatively you can load pgfplots and its library fillbetween and just draw the "correct" intersection segment solid. – user121799 Aug 11 at 9:48
  • Thank you very much. I shall try. – minhthien_2016 Aug 11 at 11:42
2

AFAIK the first post working out the critical values that distinguish the stretches on the foreside from those on the backside was this. (To all who are interested: this is what I mean with "giving credit". Even though the following will use different formulae and macros, it was nice for me to see a post in which the derivation is explained and which I can use to compare my results. I personally feel one should always add these "references" because then Alain Matthes answer has many links and users have simple way of looking for related posts. Personally I just feel that Alain deserves credit for that.) These things were done in different coordinates than those tikz-3dplot, but the analogous expressions in the tikz-3dplot conventions were put down in this answer. With those, you can switch to an xy plane and all you need to say is

 \draw[thick] ({alpha1(\tdplotmaintheta,\tdplotmainphi,{atan(4/5)})}:4)
      coordinate (A)
      arc({alpha1(\tdplotmaintheta,\tdplotmainphi,{atan(4/5)})}:
      {alpha2(\tdplotmaintheta,\tdplotmainphi,{atan(4/5)})}:4) coordinate(B);

Here, alpha1 and alpha2 are the critical phi values that determine where the path makes transitions from the fore- to the backside and thus fix the locations of A and B analytically.

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{fouriernc}
\usepackage{tikz-3dplot}
\usetikzlibrary{backgrounds}
\begin{document}
\tdplotsetmaincoords{60}{110}
\begin{tikzpicture}[scale=1,tdplot_main_coords,declare function={R=5;
 alpha1(\th,\ph,\b)=\ph-asin(cot(\th)*tan(\b));%
 alpha2(\th,\ph,\b)=-180+\ph+asin(cot(\th)*tan(\b));%
 beta1(\th,\ph,\a)=90+atan(cot(\th)/sin(\a-\ph));%
 beta2(\th,\ph,\a)=270+atan(cot(\th)/sin(\a-\ph));%
}]
 \path
 coordinate (O) at (0,0,0)
 coordinate (T) at  (0,0,3);
 \begin{scope}[tdplot_screen_coords, on background layer]
 \fill[ball color=cyan!50, opacity=1.0] (T) circle (R);
 \end{scope}
 \begin{scope}[canvas is xy plane at z={3-sqrt(5^2-4^2)}]
  \draw[thick,dashed] circle[radius=4cm];
  \draw[thick] ({alpha1(\tdplotmaintheta,\tdplotmainphi,{atan(4/5)})}:4)
  coordinate (A)
  arc({alpha1(\tdplotmaintheta,\tdplotmainphi,{atan(4/5)})}:
  {alpha2(\tdplotmaintheta,\tdplotmainphi,{atan(4/5)})}:4) coordinate(B);
 \end{scope}
 \begin{scope}[on background layer]
  \draw[thick, dashed] (O) -- (A) node[midway,sloped,below] {$r$};
 \draw[thick, dashed] (T) -- (A) node[midway,right] {$R$};
 \draw[thick, dashed] (T) -- (O) node[midway,left] {$d$};
 \foreach \v/\position in {T/above,O/below,A/below,B/below} {
     \draw[draw =black, fill=black] (\v) circle (1.2pt) node [\position=0.2mm] {$\v$};
 }
 \end{scope}
\end{tikzpicture}
\end{document}

enter image description here

If you compare this very carefully to your output, then you see that there is a tiny discrepancy in the location of A. This could be a numerical issue, or one of use made a mistake.

  • 1
    Yes. Your answer is correct the point A. In my code, I put the point A by my hand. – minhthien_2016 Aug 12 at 2:16
  • Please for me ask some options in your code: 1) How about the numbers \a and \b; 2) what is {atan(4/5)}. I can change into {atan(\r/\R)}? – minhthien_2016 Aug 12 at 2:47
  • 1
    @minhthien_2016 Instead of \R this code uses R, which is set in declare function. I do not know what \a and \b are in this code. You could just set \pgfmathsetmacro{\r}{sqrt(R^2-3^2)} and then replace 4/5 by \r/R or something like this. The value 3 is the z coordinate of T, the center of the ball, and \begin{scope}[canvas is xy plane at z={3-sqrt(5^2-4^2)}] is just to say that I draw in the plane at z=0 but 0. – user121799 Aug 12 at 2:59
  • Thank you very much. – minhthien_2016 Aug 12 at 3:03
  • If the center of circle not at O(0,0), e.g at C(1,2) How can I use your code? – minhthien_2016 Aug 12 at 3:49

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.