Wie kann man die Schnittpunkte zwischen zwei Kreisen identifizieren und den Überlappungsbereich einfärben?

Wie kann man die Schnittpunkte zwischen zwei Kreisen identifizieren und den Überlappungsbereich einfärben?
\documentclass[12pt]{article}
\usepackage{geometry} 
\usepackage[T1]{fontenc}    
\usepackage[latin1]{inputenc}   
\usepackage[brazil]{babel} 
\usepackage{tikz}               
\begin{center}
\begin{document}
\begin{tikzpicture}
\draw[ultra thick](0,0) circle [radius=1];
\draw[ultra thick](1.5,0.5) circle [radius=1.5];
\end{tikzpicture}
\end{center}
\end{document}

Bildbeschreibung hier eingeben

Antwort1

Das tkz-euclidePaket bietet Ihnen ein Makro \tkzInterCCzum Berechnen der Schnittpunkte von zwei Kreisen. Die Zeile gibt also \tkzInterCC[R](A,1 cm)(B,1.5 cm) \tkzGetPoints{M1}{N1}an, dass der Radius des Kreises mit dem Mittelpunkt bei Aund dem Radius 1 cm und der Kreis mit dem Mittelpunkt bei Bund dem Radius 1,5 cm die Schnittpunkte finden. Das Makro \tkzGetPoints{M1}{N1}benennt die Schnittpunkte als M1und N1.

\documentclass{standalone}
\usepackage{tikz}
\usepackage{tkz-euclide}
\usetkzobj{all}%IMPORTANT--recognizes points, lines, circles, etc
\begin{document}
\begin{tikzpicture}[scale=1]
\tkzDefPoint(0,0){A}  %center of circle 1
\tkzDefPoint(1.5,0.5){B}  %center of circle 2
\tkzInterCC[R](A,1 cm)(B,1.5 cm) \tkzGetPoints{M1}{N1} %get the intersection
% of circles centered at A with radius 1 and B with radius 1.5 and store as M1, N1
\begin{scope}
\tkzClipCircle(A,M1)
\tkzFillCircle[color=green!50,opacity=.5](B,M1)
\end{scope}
\tkzDrawCircle[R](A,1.cm) %draw circle 1 centered at A with radius 1
\tkzDrawCircle[R](B,1.5cm) %draw circle 2 centered at B with radius 1
\tkzDrawPoints[color=orange, fill=orange](M1,N1)%Draw points
\end{tikzpicture}
\end{document}

Ich finde es sinnvoll, die Kreise nach dem Schnittbereich zu zeichnen (Reihenfolge zählt). Die Ausgabe in Gummi wird unten angezeigt:

Bildbeschreibung hier eingeben

Antwort2

Wie im Kommentar erwähnt, benötigen Sie die Schnittpunkte nicht, um den Überlappungsbereich auszufüllen. Wenn Sie sie jedoch benötigen, können Sie die Schnittpunktbibliothek verwenden, um sie zu finden. Der folgende Code zeigt ein Beispiel dafür.

\documentclass[12pt]{article}
\usepackage{geometry}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[brazil]{babel}
\usepackage{tikz}
\usetikzlibrary{intersections}

\def\rayona{1}
\def\rayonb{1.5}
\def\interangle{90}

\begin{document}
\begin{tikzpicture}

% define first center
\coordinate (centera) at (0,0);

% Calculate second center based on radius and where is first intersection
\draw (centera) ++ (\interangle:\rayona) ++ (\interangle-90:\rayonb) coordinate (centerb);

% fill in first
\begin{scope}
\clip (centera) circle (\rayona);
\fill[black!15] (centerb) circle (\rayonb);
\end{scope}

% then draw the circles
\draw[ultra thick,name path=circlea] (centera) circle (\rayona);
\draw[ultra thick,name path=circleb] (centerb) circle (\rayonb);

%find intersections
\draw[name intersections = {of = circlea and circleb}] (intersection-1) node[red] {$\times$} node[above left]{Inter1} (intersection-2) node[red] {$\times$} node[below right]{Inter2};
\end{tikzpicture}
\end{document}

Ich habe auch versucht, dies ohne die Intersections-Bibliothek zu tun. Die erste Intersection befindet sich auf dem Weg zum zweiten Zentrum. Ich habe versucht, die zweite zu finden, indem ich

\draw (centera) ++ ({\pgfmathparse{\interangle-2*atan{\rayonb/\rayona}}\pgfmathresult}:\rayona) coordinate (inter2);

aber Latex gibt mir einen unvollständigen \iffalse-Fehler. Weiß jemand, wie man das behebt?


Bearbeitenhabe meine Antwort gefundenHierDas \pgfmathparse muss entfernt werden, damit eine andere Lösung ohne die Intersections-Bibliothek möglich ist.

\documentclass[12pt]{article}
\usepackage{geometry}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[brazil]{babel}
\usepackage{tikz}

\def\rayona{1}
\def\rayonb{1.5}
\def\interangle{90}

\begin{document}
\begin{tikzpicture}

% define first center
\coordinate (centera) at (0,0);

% Calculate second center based on radius and where is first intersection and define the first intersection
\draw (centera) ++ (\interangle:\rayona) coordinate (inter1) ++ (\interangle-90:\rayonb) coordinate (centerb);

% fill in first
\begin{scope}
\clip (centera) circle (\rayona);
\fill[black!15] (centerb) circle (\rayonb);
\end{scope}

% then draw the circles
\draw[ultra thick] (centera) circle (\rayona);
\draw[ultra thick] (centerb) circle (\rayonb);

%calculate the position of the second intersection
\draw (centera) ++ ({\interangle-2*atan{\rayonb/\rayona}}:\rayona) coordinate (inter2);;

% Use intersection
\draw (inter1) node[red] {$\times$} node[above left] {Inter1};
\draw (inter2) node[red] {$\times$} node[below right] {Inter2};
\end{tikzpicture}
\end{document}

Antwort3

Wie von Alain erwähnt, intersectionsist die Bibliothek möglicherweise die richtige Wahl zum Suchen der Schnittpunkte.

Wenn es Ihnen nichts ausmacht, dass der Rest Ihrer Kreise mit der Hintergrundfarbe gefüllt wird, können Sie die Schnittpunkte der Kreise mit diesem Einzeiler füllen:

\path[fill=yellow, postaction={fill=white, even odd rule, draw}] (0,0) circle (2) (2,.3) circle (3);

Füllen Sie zunächst den gesamten Pfad (Vereinigung beider Kreise) mit Ihrer Hervorhebungsfarbe und postactionzeichnen Sie dann (mit ) den Rest (symmetrische Differenz) mit Ihrer Hintergrundfarbe neu, indem Sie verwenden even odd rule.

verwandte Informationen