Как найти пересечения с эллипсами в PGF / TikZ

Я пытаюсь отобразить сферу в PGF / TikZ, чтобы проиллюстрировать идею больших кругов.

Код моего текущего результата:

\begin{tikzpicture}

\tikzfading[name=fade right,
left color=transparent!20,
right color=transparent!90]

\tikzfading[name=fade out,
inner color=transparent!100,
outer color=transparent!10]

\tikzfading[name=fade right gc,
left color=transparent!0,
right color=transparent!70]

\draw [<->, dashed] (0,-5) -- (0,5); % y-axis
\draw [->, dashed] (0, 0) -- (20:5); % x-axis
\draw [->, dashed] (0, 0) -- (200:5); % x-axis
\draw [->, dashed] (0, 0) -- (340:5); % z-axis
\draw [->, dashed] (0, 0) -- (160:5); % z-axis

\fill [color=cyan, opacity=0.15, path fading=fade out] (0,0) circle (4cm); % bounding circle
\fill [color=cyan, opacity=0.25, path fading=fade right, fading angle=90] (0,0) ellipse (4cm and 1cm); % x-y-axis area

% great circle 1
\draw [rotate=-40, color=red, path fading=fade right gc, fading angle=40] (0,0) ellipse (4cm and 1cm);

% great circle 2
\draw[rotate=5, color=red, path fading=fade right gc, fading angle=5] (0,0) ellipse (1.5cm and 4cm);

\end{tikzpicture}

Как я

  1. найти две точки пересечения двух красных эллипсов (обозначенных как большой круг 1 и 2),
  2. найти точку пересечения прямой (начинающейся в центре (0,0)) с эллипсом, и
  3. разместить там маленький кружок или прямоугольник?

Поместить маленький круг или прямоугольник не проблема. Большое тебе спасибо!


person user327684    schedule 10.05.2010    source источник


Ответы (1)


Ознакомьтесь с разделом 4.1.4. из руководства TikZ и PGF под названием «Пересечение кругов». Вам необходимо использовать библиотеку intersections, которая позволяет использовать ключ name intersections, как в \path [name intersections={of=path 1 and path 2}] ;. Чтобы использовать это, вам нужно использовать клавишу name path, как в \draw [name path = y axis, <->, dashed] (0,-5) -- (0,5) ; % y-axis. Доступ к перекресткам, кажется, зависит от версии; в моей локальной копии руководства есть инструкции, отличные от той, с которой я вас связал. Однако, по крайней мере, в моей версии, вы затем получаете доступ к перекресткам с помощью (intersection-1), (intersection-2) и т. Д. Чтобы получить круги на каждом перекрестке в вашем примере, я бы изменил ваш код, чтобы он выглядел следующим образом:

\begin{tikzpicture}
  \tikzfading[ name        = fade right
             , left color  = transparent!20
             , right color = transparent!90 ]

  \tikzfading[name         = fade out
             , inner color = transparent!100
             , outer color = transparent!10 ]

  \tikzfading[name         = fade right gc
             , left color  = transparent!0
             , right color = transparent!70]

  \draw [name path = y  axis, <->, dashed] (0,-5) -- (0,5)   ; % y-axis
  \draw [name path = x- axis,  ->, dashed] (0, 0) -- (20:5)  ; % x-axis
  \draw [name path = x+ axis,  ->, dashed] (0, 0) -- (200:5) ; % x-axis
  \draw [name path = z+ axis,  ->, dashed] (0, 0) -- (340:5) ; % z-axis
  \draw [name path = z- axis,  ->, dashed] (0, 0) -- (160:5) ; % z-axis

  % bounding circle
  \fill [color=cyan, opacity=0.15, path fading=fade out]
        (0,0) circle (4cm) ;

  % x-y-axis area
  \fill [color=cyan, opacity=0.25, path fading=fade right, fading angle=90]
        (0,0) ellipse (4cm and 1cm);

  % great circle 1
  \draw [ name path    = great circle 1
        , rotate       = -40
        , color        = red
        , path fading  = fade right gc
        , fading angle = 40]
        (0,0) ellipse (4cm and 1cm);

  % great circle 2
  \draw [ name path    = great circle 2
        , rotate       = 5
        , color        = red
        , path fading  = fade right gc
        , fading angle = 5]
        (0,0) ellipse (1.5cm and 4cm);

  % Intersections
  \path [name intersections={of=great circle 1 and great circle 2}] ;
  \foreach \i in {1,...,4}
    \fill [color=red] (intersection-\i) circle (2pt) ;

  \path [name intersections={of=y axis and great circle 1}] ;
  \fill (intersection-1) circle (2pt) ;
  \fill (intersection-2) circle (2pt) ;
  \path [name intersections={of=y axis and great circle 2}] ;
  \fill (intersection-1) circle (2pt) ;
  \fill (intersection-2) circle (2pt) ;

  \foreach \a in {x,z} {
    \foreach \ss in {+,-} {
      \def\s.{\ss} % Otherwise the space in `\a\s axis` would get gobbled.
      \path [name intersections={of=\a\s. axis and great circle 1}] ;
      \fill (intersection-1) circle (2pt) ;
      \path [name intersections={of=\a\s. axis and great circle 2}] ;
      \fill (intersection-1) circle (2pt) ;
    }
  }
\end{tikzpicture}

Помимо переформатирования (чтобы избежать горизонтальной полосы прокрутки), все, что я изменил в вашем существующем коде, - это добавить клавишу name path к вашим осям и большим кругам. Затем я добавил код пересечения, который должен быть относительно понятным. Не забудьте сначала \usetikzlibrary{intersections}, и все должно работать.

person Antal Spector-Zabusky    schedule 10.05.2010
comment
Спасибо за подробный ответ. Насколько я понимаю, мне нужна последняя версия для разработчиков из CVS, поскольку пересечение не включено в обычный pgf-2.00.tar.gz. Поскольку у меня возникли проблемы с установкой, я вернусь, как только это сработает. - person user327684; 11.05.2010
comment
Это (второе сообщение = первый ответ) latex-community.org/ forum / viewtopic.php? f = 45 & t = 5687 может быть полезен для многих других работающих MikTex. - person user327684; 11.05.2010
comment
Отлично работает! Большое спасибо! - person user327684; 11.05.2010