goLaTeX - Mein LaTeX-Forum

Mein LaTeX-Forum


Login  | Registrieren
Forum
      Option
[Erweitert]
  • Diese Seite weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

jedes zweite oder x-te Element einer Foreach-Schleife wählen

 

Elbflorentiner
Forum-Anfänger
Forum-Anfänger

Beiträge: 12
Anmeldedatum: 05.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2017, 16:42     Titel: jedes zweite oder x-te Element einer Foreach-Schleife wählen
  Antworten mit Zitat      
Hallo,

ich möchte mit TIKZ eine 3D-Zeichnung einer Kugelanordnung erstellen. Dies ist mir auch gelungen. Nun möchte ich jedoch nur jedes zweite Element der Foreach-Schleife wählen, um die Kugeln abwechseln verschiedenfarbig darstellen zu können. Bisher brachte mir die Recherche keine Lösung.

Ich möchte, das TIKZ nur jede zweite Kugel zeichnet, d. h. dass in der ersten Reihe folgendes Muster (1=Kugel) liegt: 1,0,1,0,1,0. Für Reihe zwei dann 0,1,0,1,0,1 usw.

Mein Minimalbespiel:
Code • Öffne in Overleaf

\documentclass[]{standalone}
\usepackage[utf8
]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{tikz}
\usetikzlibrary{3d}

\begin{document}
\begin{tikzpicture}[x={(-0.5cm,-0.5cm)},y={(1cm,0cm)}, z={(0cm,1cm)}]
\draw[->, >=latex] (0,0,0) -- (7,0,0) node[left]{x};
\draw[->, >=latex] (0,0,0) -- (0,7,0) node[below]{y};
\draw[->, >=latex] (0,0,0) -- (0,0,7) node[left]{z};
%%Kugeln
\foreach \x in {1,...,6}
\foreach \y in {1,...,6}
\foreach \z in {1,...,6}
\draw [ball color = gray!40] (\x,\y,\z) circle (0.5cm);

%%obere Fläche
\begin{scope}[canvas is xy plane at z=6]
  % x-axis
  \draw[fill = gray!60, opacity = 0.4] (0,0) -- (6,0) -- (6,6) -- (0,6) -- cycle;  
\end{scope}
%%vordere Fläche
\begin{scope}[canvas is yz plane at x=6]
  % x-axis
  \draw[fill = gray!40, opacity = 0.4] (0,0) -- (6,0) -- (6,6) -- (0,6) -- cycle;  
\end{scope}
\end{tikzpicture}
\end{document}
 


Über Tips und Hinweise freue ich mich sehr.

Elmar
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2017, 18:40     Titel:
  Antworten mit Zitat      
Verstehe ich nicht ganz. Meinst du so:
Code • Öffne in Overleaf
\foreach \x in {1,3,5}
\foreach \y in {2,4,6}
\foreach \z in {1,3,5}
\draw [ball color = gray!40] (\x,\y,\z) circle (0.5cm);

u_fischer
Forum-Meister
Forum-Meister

Beiträge: 3555
Anmeldedatum: 22.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2017, 20:37     Titel:
  Antworten mit Zitat      
Ich weiß, nach welchem System du die Farben wechseln willst, aber du kannst natürlich innerhalb der Schleife z.B. durch eine Liste wandern:

Code • Öffne in Overleaf

\documentclass[]{standalone}
\usepackage[utf8
]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{tikz}
\usetikzlibrary{3d}
\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N\g_colorlist_seq
\seq_set_from_clist:Nn\g_colorlist_seq{blue,red,green,yellow,brown}

\newcommand\currentballcolor{}

\NewDocumentCommand\getnextballcolor {
} {
 \seq_gpop_left:NN\g_colorlist_seq\currentballcolor
 \seq_gput_right:NV\g_colorlist_seq\currentballcolor
}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}[x={(-0.5cm,-0.5cm)},y={(1cm,0cm)}, z={(0cm,1cm)}]
\draw[->, >=latex] (0,0,0) -- (7,0,0) node[left]{x};
\draw[->, >=latex] (0,0,0) -- (0,7,0) node[below]{y};
\draw[->, >=latex] (0,0,0) -- (0,0,7) node[left]{z};
%%Kugeln
\foreach \x in {1,...,6}
\foreach \y in {1,...,6}
\foreach \z in {1,...,6}
{\getnextballcolor \draw [ball color = \currentballcolor] (\x,\y,\z) circle (0.5cm);}

%%obere Fläche
\begin{scope}[canvas is xy plane at z=6]
  % x-axis
  \draw[fill = gray!60, opacity = 0.4] (0,0) -- (6,0) -- (6,6) -- (0,6) -- cycle;
\end{scope}
%%vordere Fläche
\begin{scope}[canvas is yz plane at x=6]
  % x-axis
  \draw[fill = gray!40, opacity = 0.4] (0,0) -- (6,0) -- (6,6) -- (0,6) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}

 

_________________

Ulrike Fischer
www.troubleshooting-tex.de
Private Nachricht senden Benutzer-Profile anzeigen

Beinschuss
Forum-Meister
Forum-Meister

Beiträge: 769
Anmeldedatum: 02.10.12
Wohnort: NRW
Version: MiKTeX, Windows 10, TeXstudio
     Beitrag Verfasst am: 28.09.2017, 21:34     Titel:
  Antworten mit Zitat      
Ein interessantes Problem und ein gutes Beispiel, an dem ich etwas weiter gebastelt habe. Wie wäre es hiermit?
Code • Öffne in Overleaf
\documentclass[]{standalone}
\usepackage[utf8
]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{tikz}
\usetikzlibrary{3d}
\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N\g_colorlist_seq
\seq_set_from_clist:Nn\g_colorlist_seq{blue,red}
\seq_new:N\g_colorrb_seq
\seq_set_from_clist:Nn\g_colorrb_seq{red,blue}

\newcommand\currentballbr{}
\newcommand\currentballrb{
}

\NewDocumentCommand\getnextballbr {
} {
\seq_gpop_left:NN\g_colorlist_seq\currentballbr
\seq_gput_right:NV\g_colorlist_seq\currentballbr
}
\NewDocumentCommand\getnextballrb {} {
   \seq_gpop_left:NN\g_colorrb_seq\currentballrb
   \seq_gput_right:NV\g_colorrb_seq\currentballrb
}
 
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}[x={(-0.5cm,-0.5cm)},y={(1cm,0cm)}, z={(0cm,1cm)}]
\draw[->, >=latex] (0,0,0) -- (7,0,0) node[left]{x};
\draw[->, >=latex] (0,0,0) -- (0,7,0) node[below]{y};
\draw[->, >=latex] (0,0,0) -- (0,0,7) node[left]{z};
%%Kugeln
\foreach \x in {1,...,6}
\foreach \y in {1,...,6}
\foreach \z in {1,...,3}
{\getnextballbr \draw [ball color = \currentballbr] (\x,\y,\z) circle (0.5cm);}

\foreach \x in {1,...,6}
\foreach \y in {1,...,6}
\foreach \z in {4,...,6}
{\getnextballrb \draw [ball color = \currentballrb] (\x,\y,\z) circle (0.5cm);}

%%obere Fläche
\begin{scope}[canvas is xy plane at z=6]
% x-axis
\draw[fill = gray!60, opacity = 0.4] (0,0) -- (6,0) -- (6,6) -- (0,6) -- cycle;
\end{scope}
%%vordere Fläche
\begin{scope}[canvas is yz plane at x=6]
% x-axis
\draw[fill = gray!40, opacity = 0.4] (0,0) -- (6,0) -- (6,6) -- (0,6) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}
Private Nachricht senden Benutzer-Profile anzeigen

Beinschuss
Forum-Meister
Forum-Meister

Beiträge: 769
Anmeldedatum: 02.10.12
Wohnort: NRW
Version: MiKTeX, Windows 10, TeXstudio
     Beitrag Verfasst am: 28.09.2017, 22:57     Titel:
  Antworten mit Zitat      
Für einen Würfel mit ungerader Kantenlänge kann man meinen Vorschlag deutlich abspecken:
Code • Öffne in Overleaf
\documentclass[]{standalone}
\usepackage[utf8
]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{tikz}
\usetikzlibrary{3d}
\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N\g_colorlist_seq
\seq_set_from_clist:Nn\g_colorlist_seq{blue,red}

\newcommand\currentballbr{}

\NewDocumentCommand\getnextballbr {
} {
\seq_gpop_left:NN\g_colorlist_seq\currentballbr
\seq_gput_right:NV\g_colorlist_seq\currentballbr
}
\ExplSyntaxOff

\begin{document}
\begin{tikzpicture}[x={(-0.5cm,-0.5cm)},y={(1cm,0cm)}, z={(0cm,1cm)}]
\draw[->, >=latex] (0,0,0) -- (7,0,0) node[left]{x};
\draw[->, >=latex] (0,0,0) -- (0,7,0) node[below]{y};
\draw[->, >=latex] (0,0,0) -- (0,0,7) node[left]{z};
%%Kugeln
\foreach \x in {1,...,5}
\foreach \y in {1,...,5}
\foreach \z in {1,...,5}
{\getnextballbr \draw [ball color = \currentballbr] (\x,\y,\z) circle (0.5cm);}
\end{tikzpicture}
\end{document}


Bei gerader Kantenlänge jedoch ergibt sich hierbei nicht das gewünschte Muster.
Private Nachricht senden Benutzer-Profile anzeigen

Elbflorentiner
Forum-Anfänger
Forum-Anfänger

Beiträge: 12
Anmeldedatum: 05.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2017, 12:08     Titel:
  Antworten mit Zitat      
Wow, vielen Dank für eure Mühe.

Im Wesentlichen ist es der Workaround von Ulrike, der sämtliche meiner Fragen löst.

Toll. Very Happy
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden

cgnieder
Forum-Meister
Forum-Meister


Beiträge: 689
Anmeldedatum: 22.10.10
Wohnort: Herrenberg
Version: TeX Live 2016
     Beitrag Verfasst am: 29.09.2017, 14:59     Titel:
  Antworten mit Zitat      
Wenn es nur um zwei unterschiedliche Farben geht: das hier macht jede dritte Kugel rot, die restlichen weiß:

Code • Öffne in Overleaf
\foreach \x in {1,...,6}
\foreach \y in {1,...,6}
\foreach \z in {1,...,6}
\pgfmathparse{int(mod(\x+\y+\z,3))}% mod 3 => every third
\edef\mycolor{\ifnum\pgfmathresult=0 red\else white\fi}
\draw [ball color = \mycolor] (\x,\y,\z) circle (0.5cm);


Abwechselnd geht sogar noch einfacher:

Code • Öffne in Overleaf
\foreach \x in {1,...,6}
\foreach \y in {1,...,6}
\foreach \z in {1,...,6}
\draw [ball color = \ifodd\numexpr\x+\y+\z\relax red\else white\fi] (\x,\y,\z) circle (0.5cm);




test.png
 Beschreibung:

Download
 Dateiname:  test.png
 Dateigröße:  135.86 KB
 Heruntergeladen:  10 mal

_________________

Clemens
------------------------------
Paket auf CTANchemmacros · Paket auf CTANchemformula · Paket auf CTANleadsheets · Paket auf CTANtranslations · Paket auf CTANxsim.
Private Nachricht senden Benutzer-Profile anzeigen

Beinschuss
Forum-Meister
Forum-Meister

Beiträge: 769
Anmeldedatum: 02.10.12
Wohnort: NRW
Version: MiKTeX, Windows 10, TeXstudio
     Beitrag Verfasst am: 29.09.2017, 21:33     Titel:
  Antworten mit Zitat      
Das nenne ich mal eine sparsame, elegante und durchdachte Lösung des Problems. Alle Achtung!
Private Nachricht senden Benutzer-Profile anzeigen

Neues Thema eröffnen Neue Antwort erstellen



Options and Permissions
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen
.

goLaTeX ist Teil der goForen
goForen.de goMATLAB.de goLaTeX.de goPCB.de


  Impressum | FAQ | goLaTeX RSS Button RSS-Feed

Copyright © 2008 - 2017 goLaTeX.de