让我通过一个例子来具体说明:
下面的小代码画了一段螺旋线(比较丑)
\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
% axes
\coordinate (O) at (0,0,0);
\coordinate (X) at (3,0,0);
\coordinate (Y) at (0,3,0);
\coordinate (Z) at (0,0,3);
\def\scl{3.29} % steps
\foreach \t in {0,1,...,360}
{
\draw[line width=1pt,color=red, opacity=0.4, dashed]
({cos(\t)}, {sin(\t)}, {\scl*\t/360})--({cos(\t+7)},{sin(\t +7)},
{\scl*(\t+7)/360});
}
% draw axes
\draw[-latex] (O) -- (X) node[anchor=west] {$X$};
\draw[-latex] (O) -- (Y) node[anchor=west] {$Y$};
\draw[-latex] (O) -- (Z) node[anchor=west] {$Z$};
\end{tikzpicture}
\end{document}
有没有办法将点保存在内存中并调用一些“pgfplots”指令来绘制它们?
让我澄清一下,我不想绘制螺旋线。我想绘制任何没有方程的东西,但它是我在 TiKz 中创建的一组点。
谢谢。
我发现我对此没有讲清楚,所以让我补充一些额外的信息。请查看以下链接三维球体中 A 点和 B 点之间的圆弧
最后一个图(截至目前)是一个有 5 个弧的球体。我在 TiKz 中计算了这些弧,计算它们的代码在帖子中。由于每个点都是用“node[]”绘制的,因此在我的计算机上需要 30 多秒才能处理。像这样的图通常需要 1 到 2 秒。原因是代码太高级,速度很慢。此外,我没有太多的筹码。我可以定义颜色和点密度,仅此而已,我想调用一个 TiKz 函数,在其中我可以定义许多属性。谢谢。
总之我想知道两个事实:
- 是否有像 C++(或 C)代码中的“数组”或“指针”?我可以在其中存储一组点?
- TiKz 中是否有一个函数可以从内存中读取一组点并以 3D 形式绘制它们?
谢谢。
答案1
我找到了一个解决方案。该解决方案的灵感来自另一篇 StackExchange 帖子。
主要思想是使用函数“\pgfplotfunction”
以下是一段代码:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usepackage{pgfplots}
\usetikzlibrary{shapes}
\tdplotsetmaincoords{60}{110}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}[tdplot_main_coords]
\node [cylinder,rotate=90,draw,aspect=2,minimum width=2cm,minimum height=3.5cm](C){};
\begin{scope}[color=black, dashed]
\pgfplothandlerlineto
\pgfplotfunction{\t}{-90,-89,...,15}
{\pgfpointxyz {cos(\t)}{sin(\t)}{-0.25+\t/360}}
\pgfusepath{stroke}
\end{scope}
\begin{scope}[color=red]
\pgfplothandlerlineto
\pgfplotfunction{\t}{15,16,...,110}
{\pgfpointxyz {cos(\t)}{sin(\t)}{-0.25+\t/360}}
\pgfusepath{stroke}
\end{scope}
\begin{scope}[color=red, dashed]
\pgfplothandlerlineto
\pgfplotfunction{\t}{110,111,...,303}
{\pgfpointxyz {cos(\t)}{sin(\t)}{-0.25+\t/360}}
\pgfusepath{stroke}
\end{scope}
\begin{scope}[color=red]
\pgfplothandlerlineto
\pgfplotfunction{\t}{303,304,...,340}
{\pgfpointxyz {cos(\t)}{sin(\t)}{-0.25+\t/360}}
\pgfusepath{stroke}
\end{scope}
\begin{scope}[color=black, dashed]
\pgfplothandlerlineto
\pgfplotfunction{\t}{340,341,...,370}
{\pgfpointxyz {cos(\t)}{sin(\t)}{-0.25+\t/360}}
\pgfusepath{stroke}
\end{scope}
\def\ang{340}
\pgfmathsetmacro\bx{cos(\ang)}
\pgfmathsetmacro\by{sin(\ang)}
\pgfmathsetmacro\bz{-0.24+ \ang/360}
\coordinate (B) at (\bx,\by,\bz);
\draw[fill] (0.9922,0.25,-0.2) circle [x=1cm,y=1cm,radius=0.045]node[below]{$A$};
\draw[fill] (B) circle [x=1cm,y=1cm,radius=0.045]node[below]{$B$};
\end{tikzpicture}
\end{document}
这是由此得出的图表。