我正在尝试使用patch table with point meta
问题中的“同一平面上的面片具有相同的阴影”但我得到的是同一平面上的三角形,但色调强度不同。首先,我使用 Mathematica 处理数据以获取一组点的色调。
在 Mathematica 中:
R21 = {{0, 0, 0}, {0, 0, 0.436694}, {0, 0.436694, 0.436694}, {0,
0.5822, 0.2911}, {0, 0.873387, 0}, {0.291187, 0.5822,
0.2911}, {0.436694, 0.436694, 0.436694}, {0.873387, 0,
0}, {0.873387, 0, 0.436694}};
R = ConvexHullMesh[R21]
现在我计算图形中每个三角形的顶点列表,并在最后一列显示其颜色:
lookuptable =
AssociationThread[Range[MeshCellCount[R, 0]],
Flatten[Nearest[R21 -> Automatic, MeshCoordinates[R]]]];
faces = Partition[
Lookup[lookuptable,
Flatten[MeshCells[R, 2, "Multicells" -> True][[1, 1]]]], 3];
closedfaces = Join[faces, faces[[All, {1}]], 2] - 1;
lsttriangles = {};
Do[x = R21[[closedfaces[[i, 1]] + 1]] - R21[[closedfaces[[i, 2]] + 1]];
y = R21[[closedfaces[[i, 1]] + 1]] -
R21[[closedfaces[[i, 3]] + 1]];
z = Cross[x, y];
AppendTo[lsttriangles,
Join[Take[closedfaces[[i]], 3], {Abs[z.{1, 2, 3}/Sqrt[z.z]]}]], {i,
1, Length[closedfaces]}];
其中lsttriangles
包含具有强度颜色数据的图形顶点列表。
使用这些数据,我可以用以下代码绘制图形:
\begin{tikzpicture}
\begin{axis}[view/v=25,view/h=126,xlabel=$a_1$,ylabel=$a_2$,zlabel=$a_3$,
% colormap/greenyellow,
colormap={darkblue}{color(1)=(blue!80!black!90) color(2)=(blue!80!black!70) color(3)=(blue!80!black!50) color(4)=(blue!80!black!30)},
xmin=0,xmax=1,ymin=0,ymax=1,zmin=0,zmax=1, grid=major]
\addplot3[%xmin=0,xmax=1,
opacity=0,
fill opacity=1,
table/row sep=\\,
patch,
patch type=polygon,
vertex count=3,
patch table with point meta={%
% pt1 pt2 pt3 pt4 pt5 cdata
0 4 7 3. \\
7 8 1 2. \\
8 6 2 3. \\
6 4 2 3.53553 \\
8 7 6 2.12132 \\
7 4 6 2.12132 \\
4 0 2 1. \\
0 7 1 2. \\
0 1 2 1. \\
1 8 2 3. \\
}
]
table {
x y z \\
0 0 0 \\
0 0 0.436694 \\
0 0.436694 0.436694 \\
0 0.5822 0.2911 \\
0 0.873387 0 \\
0.291187 0.5822 0.2911 \\
0.436694 0.436694 0.436694 \\
0.873387 0 0 \\
0.873387 0 0.436694 \\
};
\end{axis}
\end{tikzpicture}
然而,结果却用不同的颜色对同一平面进行着色:
如何才能使同一平面上的三角形颜色相同?使用 Mathematica 绘制凸包的点可以从中看到InputForm[R]
。我对这些点尝试了相同的过程,结果在图中具有类似的效果。
答案1
我认为问题在某种程度上出在 Mathematica 方面。你得到了一个多余的三角形:7 8 1 2.
。如果我删除它,我会得到
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{patchplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view/v=25,view/h=126,xlabel=$a_1$,ylabel=$a_2$,zlabel=$a_3$,
% colormap/greenyellow,
colormap={darkblue}{color(1)=(blue!80!black!90) color(2)=(blue!80!black!70) color(3)=(blue!80!black!50) color(4)=(blue!80!black!30)},
xmin=0,xmax=1,ymin=0,ymax=1,zmin=0,zmax=1, grid=major]
\addplot3[%xmin=0,xmax=1,
opacity=0,
fill opacity=1,
table/row sep=\\,
patch,
patch type=polygon,
vertex count=3,
patch table with point meta={%
% pt1 pt2 pt3 pt4 pt5 cdata
0 4 7 3. \\
8 6 2 3. \\
6 4 2 3.53553 \\
8 7 6 2.12132 \\
7 4 6 2.12132 \\
4 0 2 1. \\
0 7 1 2. \\
0 1 2 1. \\
1 8 2 3. \\
}
]
table {
x y z \\
0 0 0 \\
0 0 0.436694 \\
0 0.436694 0.436694 \\
0 0.5822 0.2911 \\
0 0.873387 0 \\
0.291187 0.5822 0.2911 \\
0.436694 0.436694 0.436694 \\
0.873387 0 0 \\
0.873387 0 0.436694 \\
};
% removed
% 7 8 1 2. \\
% \addplot3[%xmin=0,xmax=1,
% opacity=1,
% table/row sep=\\,nodes near coords/.append style={color=red},
% only marks,nodes near coords=\coordindex
% ]
% table {
% x y z\\
% 0 0 0 \\
% 0 0 0.436694 \\
% 0 0.436694 0.436694 \\
% 0 0.5822 0.2911 \\
% 0 0.873387 0 \\
% 0.291187 0.5822 0.2911 \\
% 0.436694 0.436694 0.436694 \\
% 0.873387 0 0 \\
% 0.873387 0 0.436694 \\
% };
\end{axis}
\end{tikzpicture}
\end{document}
您可以通过恢复三角形、恢复注释掉的\addplot
并设置来进行自我调试fill opacity=0.6,
。这暗示了罪魁祸首。
原则上,pgfplots 应该隐藏它,但我猜测由于它的所有角都在一些可见的边缘上,所以 pgfplots 决定保留它。