
Я играюсь с пересечениями, чтобы нарисовать иллюстрацию для лекции по оптике. Однако у меня возникло несколько проблем, как показывает следующий пример:
%!TEX encoding = UTF-8 Unicode
%!TEX program = lualatex
\documentclass[11pt,a4paper,fleqn,pdftex]{report}
\usepackage[dvipsnames, table]{xcolor}
\usepackage[utf8]{luainputenc}
\usepackage[latin,english]{babel}
\usepackage{tikz}
\usetikzlibrary{patterns}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{figure}[!h]
\centering
\begin{tikzpicture}
\coordinate (M2) at (0,3);
\def\angleM{10}
% >>>>>>>>>>>>>>>>
\draw[color=Red, thick] (M2) -- (intersection cs: first line={(M2)--++(90 - \angleM:-8)}, second line={(45:-4)--(45:4)}) circle (2pt);
\draw[color=Red, thick] (intersection cs: first line={(M2)--++(90 - \angleM:-8)}, second line={(45:-4)--(45:4)}) circle (2pt) -- (M2);
% <<<<<<<<<<<<<<<<
\draw[thick] (M2) ++(1,0) -- ++(-2,0) node[left]{$M_2$};
\fill[pattern=north east lines] (M2) ++(1,0) rectangle ++(-2,0.2);
\draw[very thick] (45:-2) -- (45:2);
\end{tikzpicture}
\end{figure}
\end{document}
В этом примере две линии между % >>>>>…
и % <<<<…
должны рисовать одинаковые линии, но этого не происходит, как вы можете видеть здесь:
Хотя инструкции почти одинаковы (разница только в направлении рисования), линии не перекрываются так, как должны. Что можно сделать, чтобы этого избежать?
решение1
Кажется, это проблема округления. Эта проблема и та, что обсуждалась вTikZ не вычисляет пересечениепредполагают, что существуют некоторые проблемы с системой координат пересечения (на самом деле, руководство PGF не упоминает об этом и приводит только пример ее использования).
В любом случае, в качестве обходного пути вы можете загрузить intersections
библиотеку и затем сделать
\path
[name path=line1] (M2) -- ++(90 - \angleM:-8)
[name path=line2] (45:-4) -- (45:4);
\draw[Red,thick,name intersections={of=line1 and line2}]
(intersection-1) circle (2pt) -- (M2);
это немного дольше, чем использование intersection cs
, но вас не будут беспокоить разные результаты, возникающие из-за проблем округления. Полный пример, демонстрирующий оба подхода бок о бок:
%!TEX encoding = UTF-8 Unicode
%!TEX program = lualatex
\documentclass[11pt,a4paper,fleqn,pdftex]{report}
\usepackage[dvipsnames, table]{xcolor}
\usepackage[utf8]{luainputenc}
\usepackage[latin,english]{babel}
\usepackage{tikz}
\usetikzlibrary{patterns}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[baseline]
\coordinate (M2) at (0,3);
\def\angleM{10}
% >>>>>>>>>>>>>>>>
\draw[color=Red, thick] (M2) -- (intersection cs: first line={(M2)--++(90 - \angleM:-8)}, second line={(45:-4)--(45:4)}) circle (2pt);
\draw[color=Red, thick] (intersection cs: first line={(M2)--++(90 - \angleM:-8)}, second line={(45:-4)--(45:4)}) circle (2pt) -- (M2);
% <<<<<<<<<<<<<<<<
\draw[thick] (M2) ++(1,0) -- ++(-2,0) node[left]{$M_2$};
\fill[pattern=north east lines] (M2) ++(1,0) rectangle ++(-2,0.2);
\draw[very thick] (45:-2) -- (45:2);
\end{tikzpicture}\qquad
%
\begin{tikzpicture}[baseline]
\coordinate (M2) at (0,3);
\def\angleM{10}
\path
[name path=line1] (M2) -- ++(90 - \angleM:-8)
[name path=line2] (45:-4) -- (45:4);
\draw[Red,thick,name intersections={of=line1 and line2}]
(intersection-1) circle (2pt) -- (M2);
\draw[thick] (M2) ++(1,0) -- ++(-2,0) node[left]{$M_2$};
\fill[pattern=north east lines] (M2) ++(1,0) rectangle ++(-2,0.2);
\draw[very thick] (45:-2) -- (45:2);
\end{tikzpicture}
\end{document}