正如标题所暗示的,如果使用该选项,我正在尝试使用tikz-3dplot
与命令包中当前默认配色方案不同的配色方案。\tdplotsphericalsurfaceplot
parametricfill
这是一个具有两种颜色的 MWE,我希望使用它来代替现在使用的颜色。为什么要使用两种颜色?因为我使用了一个颜色函数,它简单地将我的参数空间划分为两个区域:colorFunc(\t)=ifthenelse(\t<pi/2,0,1);
\documentclass{article}
\usepackage{tikz,tikz-3dplot}
\definecolor{color1}{RGB}{ 86, 180, 233} % Skyblue
\definecolor{color2}{RGB}{230, 159, 0} % Orange
\begin{document}
\tdplotsetmaincoords{70}{135}
\begin{tikzpicture}[scale=1,line join=bevel,tdplot_main_coords,
fill opacity=1,
declare function={ colorFunc(\t)=ifthenelse(\t<pi/2,0,1);}]
\pgfsetlinewidth{.1pt}
\tdplotsphericalsurfaceplot[parametricfill]{64}{32}%
{1.3*(1/8*sqrt(5/pi)*(1+3*cos(2*\tdplottheta)))}%
{black}%
{colorFunc(\tdplottheta*2)}%
{\draw[color=black,thick,->] (0,0,0) -- (1,0,0) node[anchor=north east]{$x$};}%
{\draw[color=black,thick,->] (0,0,0) -- (0,1,0) node[anchor=north west]{$y$};}%
{\draw[color=black,thick,->] (0,0,0) -- (0,0,1) node[anchor=south]{$z$};}%
\end{tikzpicture}
\end{document}
注意:也许可以以某种方式计算我的两种颜色的颜色坐标并将它们设置在我的中colorFunc
。但是,似乎绘图范围已重新缩放,因此无论我输入哪些值,colorFunc
生成的绘图始终相同,即colorFunc(\t)=ifthenelse(\t<pi/2,0,pi*2/3);
产生相同的绘图。
答案1
看起来你已经可以自定义颜色了。我不太清楚你的问题是什么。所以我只想解释一下一切。
第 6 个参数是什么\tdplotsphericalsurfaceplot
?
(我说的是你填写的空白colorFunc(\tdplottheta*2)
)
此空白允许您填写基于 、 和 的数学表达式,\tdplotr
并\tdplottheta
返回\tdplotphi
实数。直观地说,如果您的表达式返回60
,则使用颜色 HSB(60,1,1),即纯黄色。同样,如果您的表达式返回300
,则使用 HSB(300,1,1),即紫色。
从技术上讲,你的表情被放入
\pgfmathsetmacro{\colorarg}{#5}
(确实如此,#5
但不是#6
因为,好吧,我们稍后会看到)
因此,您可以编写 PGF 数学引擎接受的所有内容。在最极端的情况下,您可以传递random(0,360)
。
为什么即使我的表达式返回一个常数,我也会得到两种颜色?
如果图包含负半径,事情就会变得很奇怪。在你的例子中,cos
有时是负的 -1,产生油炸圈饼图表的一部分。在下图中,我将其写3
为表达式。所以通常情况下它应该是HSB(3,0,0)
,一种红色。但是油炸圈饼现在呈青色?
答案是tikz-3dplot
假设用户使用\tdplotphi
表达式。由于点 (-r,θ,φ) 与点 (r,θ+180,-φ) 重合,因此当半径为负时,表达式tikz-3dplot
会增加。180
为了解决这个问题,请确保你的图始终为正半径,或者确保你的表达式满足
func(-r,θ,φ) = func(r,θ+180,-φ)+180 (mod 360)
例如 func(-r,θ,φ) = 5θ + φ^2/90
我想要完全访问颜色
重新定义\tdplotdosurfaceplot
。此命令用于绘制单个矩形。(其第 5 个参数是\tdplotsphericalsurfaceplot
的第 6 个参数。)因此它有点长,并且包含丑陋的细节。所以请关注\ifthenelse{\equal{#6}{parametricfill}}
部分
\renewcommand\tdplotdosurfaceplot[6]{
\pgfmathsetmacro{\nextphi}{\curphi + \tdplotsuperfudge*\viewphistep}
\begin{scope}[opacity=1]
\tdplotcheckdiff{\nextphi}{360}{\origviewphistep}{#2}{}
\tdplotcheckdiff{\nextphi}{0}{\origviewphistep}{#2}{}
\tdplotcheckdiff{\nextphi}{90}{\origviewphistep}{#3}{}
\tdplotcheckdiff{\nextphi}{450}{\origviewphistep}{#3}{}
\end{scope}
\foreach \curtheta in{\viewthetastart,\viewthetainc,...,\viewthetaend}{
\pgfmathsetmacro{\curlongitude}{90 - \curphi}
\pgfmathsetmacro{\curlatitude}{90 - \curtheta}
\ifthenelse{\equal{\leftright}{-1.0}}{\pgfmathsetmacro{\curphi}{\curphi - \origviewphistep}}{}
\pgfmathsetmacro{\tdplottheta}{mod(\curtheta,360)}
\pgfmathsetmacro{\tdplotphi}{mod(\curphi,360)}
\pgfmathparse{\tdplotphi < 0}
\ifthenelse{\equal{\pgfmathresult}{1}}{\pgfmathsetmacro{\tdplotphi}{\tdplotphi + 360}}{}
\pgfmathparse{\tdplottheta > \tdplotuppertheta}
\pgfmathsetmacro{\logictest}{1 - \pgfmathresult}
\pgfmathparse{\tdplottheta < \tdplotlowertheta}
\pgfmathsetmacro{\logictest}{\logictest * (1 - \pgfmathresult)}
\pgfmathsetmacro{\tdplottheta}{\tdplottheta + \viewthetastep}
\pgfmathparse{\tdplottheta > \tdplotuppertheta}
\pgfmathsetmacro{\logictest}{\logictest * (1 - \pgfmathresult)}
\pgfmathparse{\tdplottheta < \tdplotlowertheta}
\pgfmathsetmacro{\logictest}{\logictest * (1 - \pgfmathresult)}
\pgfmathparse{\tdplotphi > \tdplotupperphi}
\pgfmathsetmacro{\logictest}{\logictest * (1 - \pgfmathresult)}
\pgfmathparse{\tdplotphi < \tdplotlowerphi}
\pgfmathsetmacro{\logictest}{\logictest * (1 - \pgfmathresult)}
\pgfmathsetmacro{\tdplotphi}{\tdplotphi + \viewphistep}
\pgfmathparse{\tdplotphi < 0}
\ifthenelse{\equal{\pgfmathresult}{1}}{\pgfmathsetmacro{\tdplotphi}{\tdplotphi + 360}}{}%
\pgfmathparse{\tdplotphi > \tdplotupperphi}
\pgfmathsetmacro{\logictest}{\logictest * (1 - \pgfmathresult)}
\pgfmathparse{\tdplotphi < \tdplotlowerphi}
\pgfmathsetmacro{\logictest}{\logictest * (1 - \pgfmathresult)}
\pgfmathsetmacro{\tdplottheta}{\curtheta}
\pgfmathsetmacro{\tdplotphi}{\curphi}
%%%%%%% not important ↑↑↑↑↑↑
%%%%%%% yes important ↓↓↓↓↓↓
\ifthenelse{\equal{#6}{parametricfill}}{
\pgfmathsetmacro{\radius}{#1}
\pgfmathsetmacro\x{\radius*sin(\tdplottheta)*cos(\tdplotphi)}
\pgfmathsetmacro\y{\radius*sin(\tdplottheta)*sin(\tdplotphi)}
\pgfmathsetmacro\z{\radius*cos(\tdplottheta)}
\pgfmathsetmacro\r{(\x+.4)}
\pgfmathsetmacro\g{(\y+.4)}
\pgfmathsetmacro\b{(\z+.8)/2}
\definecolor{tdplotfillcolor}{rgb}{\r,\g,\b}
\color{tdplotfillcolor}
}{}
\pgfsetstrokeopacity{0}
%%%%%%% yes important ↑↑↑↑↑↑
%%%%%%% not important ↓↓↓↓↓↓
\ifthenelse{\equal{\leftright}{-1.0}}{\pgfmathsetmacro{\curphi}{\curphi + \origviewphistep}}{}
\ifthenelse{\equal{\logictest}{1.0}}{%
\pgfmathsetmacro{\radius}{abs(#1)}
\pgfpathmoveto{\pgfpointspherical{\curlongitude}{\curlatitude}{\radius}}
\pgfmathsetmacro{\tdplotphi}{\curphi + \viewphistep}
\pgfmathsetmacro{\radius}{abs(#1)}
\pgfpathlineto{\pgfpointspherical{\curlongitude - \viewphistep}{\curlatitude}{\radius}}
\pgfmathsetmacro{\tdplottheta}{\curtheta + \viewthetastep}
\pgfmathsetmacro{\radius}{abs(#1)}
\pgfpathlineto{\pgfpointspherical{\curlongitude - \viewphistep}{\curlatitude - \viewthetastep}{\radius}}
\pgfmathsetmacro{\tdplotphi}{\curphi}
\pgfmathsetmacro{\radius}{abs(#1)}
\pgfpathlineto{\pgfpointspherical{\curlongitude}{\curlatitude - \viewthetastep}{\radius}}
\pgfpathclose
\pgfusepath{fill,stroke}
}{}
}
}