diff --git a/.gitignore b/.gitignore
index 039c83dc8..a26b3ba0e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,7 +25,7 @@ ChangeLog.orig
ChangeLog.rej
Documents/
Homepage/
-Test/
+#Test/
_Copies_/
_Database_/
build/
diff --git a/mathics/builtin/drawing/plot.py b/mathics/builtin/drawing/plot.py
index a44ca3e05..4f70138dc 100644
--- a/mathics/builtin/drawing/plot.py
+++ b/mathics/builtin/drawing/plot.py
@@ -22,7 +22,7 @@
from mathics.core.evaluation import Evaluation
from mathics.core.expression import Expression
from mathics.core.list import ListExpression
-from mathics.core.symbols import Symbol
+from mathics.core.symbols import Symbol, SymbolList
from mathics.core.systemsymbols import (
SymbolAll,
SymbolAutomatic,
@@ -413,14 +413,27 @@ class PlotOptions:
plot_points: list
maxdepth: int
- def __init__(self, builtin, range_exprs, options, dim, evaluation):
+ def __init__(self, builtin, functions, range_exprs, options, dim, evaluation):
def error(*args, **kwargs):
evaluation.message(builtin.get_name(), *args, **kwargs)
raise ValueError()
+ # convert functions to list of lists of exprs
+ def to_list(expr):
+ if isinstance(expr, Expression) and expr.head is SymbolList:
+ return [to_list(e) for e in expr.elements]
+ else:
+ return expr
+
+ functions = to_list(functions)
+ self.functions = functions if isinstance(functions, list) else [functions]
+
# plot ranges of the form {x,xmin,xmax} etc. (returns Symbol)
self.ranges = []
- for range_expr in range_exprs:
+ for i, range_expr in enumerate(range_exprs):
+ if isinstance(range_expr, Symbol) and hasattr(builtin, "default_ranges"):
+ self.ranges.append([range_expr, *builtin.default_ranges[i]])
+ continue
if not range_expr.has_form("List", 3):
error("invrange", range_expr)
if not isinstance(range_expr.elements[0], Symbol):
@@ -471,18 +484,25 @@ def error(*args, **kwargs):
self.exclusions = exclusions
# Mesh option (returns Symbol)
- mesh = builtin.get_option(options, "Mesh", evaluation)
- if mesh not in (SymbolNone, SymbolFull, SymbolAll):
+ mesh = builtin.get_option(options, "Mesh", evaluation).to_python(
+ preserve_symbols=True
+ )
+ if isinstance(mesh, (list, tuple)) and all(isinstance(m, int) for m in mesh):
+ self.mesh = mesh
+ elif mesh not in (SymbolNone, SymbolFull, SymbolAll):
evaluation.message("Mesh", "ilevels", mesh)
- mesh = SymbolFull
- self.mesh = mesh
+ self.mesh = SymbolFull
+ else:
+ self.mesh = mesh
# PlotPoints option (returns Symbol)
plot_points_option = builtin.get_option(options, "PlotPoints", evaluation)
pp = plot_points_option.to_python(preserve_symbols=True)
- npp = len(self.ranges)
- if builtin.get_name() in ("System`ComplexPlot3D", "System`ComplexPlot"):
- npp = 2
+ npp = (
+ builtin.num_plot_points
+ if hasattr(builtin, "num_plot_points")
+ else len(self.ranges)
+ )
if pp == SymbolNone:
pp = None
else:
diff --git a/mathics/builtin/drawing/plot_plot.py b/mathics/builtin/drawing/plot_plot.py
index 0ee93d302..4cb462f49 100644
--- a/mathics/builtin/drawing/plot_plot.py
+++ b/mathics/builtin/drawing/plot_plot.py
@@ -74,7 +74,9 @@ def eval(self, functions, ranges, evaluation: Evaluation, options: dict):
# parse options, bailing out if anything is wrong
try:
ranges = ranges.elements if ranges.head is SymbolSequence else [ranges]
- plot_options = plot.PlotOptions(self, ranges, options, 2, evaluation)
+ plot_options = plot.PlotOptions(
+ self, functions, ranges, options, 2, evaluation
+ )
except ValueError:
return None
@@ -84,10 +86,15 @@ def eval(self, functions, ranges, evaluation: Evaluation, options: dict):
apply_function = self.apply_function
if not plot.use_vectorized_plot:
apply_function = lru_cache(apply_function)
+ plot_options.apply_function = apply_function
- # additional options specific to this class
+ # TODO: PlotOptions has already regularized .functions to be a list
+ # (of lists) of functions, used by the _Plot3d builtins.
+ # But _Plot builtins still need to be reworked to use it,
+ # so we still use the old mechanism here.
plot_options.functions = self.get_functions_param(functions)
- plot_options.apply_function = apply_function
+
+ # additional options specific to this class
plot_options.use_log_scale = self.use_log_scale
plot_options.expect_list = self.expect_list
if plot_options.plot_points is None:
diff --git a/mathics/builtin/drawing/plot_plot3d.py b/mathics/builtin/drawing/plot_plot3d.py
index f89dda6b1..e34d787da 100644
--- a/mathics/builtin/drawing/plot_plot3d.py
+++ b/mathics/builtin/drawing/plot_plot3d.py
@@ -35,6 +35,7 @@ class _Plot3D(Builtin):
# Check for correct number of args
eval_error = Builtin.generic_argument_error
expected_args = 3
+ is_cartesian = True
messages = {
"invmaxrec": (
@@ -99,22 +100,27 @@ def eval(
try:
dim = 3 if self.graphics_class is Graphics3D else 2
ranges = ranges.elements if ranges.head is SymbolSequence else [ranges]
- plot_options = plot.PlotOptions(self, ranges, options, dim, evaluation)
+ plot_options = plot.PlotOptions(
+ self, functions, ranges, options, dim, evaluation
+ )
except ValueError:
return None
- # TODO: consult many_functions variable set by subclass and error
- # if many_functions is False but multiple are supplied
- if functions.has_form("List", None):
- plot_options.functions = functions.elements
- else:
- plot_options.functions = [functions]
-
- # supply default value
+ # supply default value for PlotPoints
if plot_options.plot_points is None:
- default_plot_points = (200, 200) if plot.use_vectorized_plot else (7, 7)
+ if isinstance(self, ParametricPlot3D) and len(plot_options.ranges) == 1:
+ # ParametricPlot3D with one independent variable generating a curve
+ default_plot_points = (1000,)
+ elif plot.use_vectorized_plot:
+ default_plot_points = (200, 200)
+ else:
+ default_plot_points = (7, 7)
plot_options.plot_points = default_plot_points
+ # supply apply_function which knows how to take the plot parameters
+ # and produce xs, ys, and zs
+ plot_options.apply_function = self.apply_function
+
# subclass must set eval_function and graphics_class
eval_function = plot.get_plot_eval_function(self.__class__)
with np.errstate(all="ignore"): # suppress numpy warnings
@@ -123,13 +129,16 @@ def eval(
return
# now we have a list of length dim
- # handle Automatic ~ {xmin,xmax} etc.
+ # handle Automatic ~ {xmin,xmax} etc., but only if is_cartesion: the independent variables are x and y
# TODO: dowstream consumers might be happier if we used data range where applicable
- for i, (pr, r) in enumerate(zip(plot_options.plot_range, plot_options.ranges)):
- # TODO: this treats Automatic and Full as the same, which isn't quite right
- if isinstance(pr, (str, Symbol)) and not isinstance(r[1], complex):
- # extract {xmin,xmax} from {x,xmin,xmax}
- plot_options.plot_range[i] = r[1:]
+ if self.is_cartesian:
+ for i, (pr, r) in enumerate(
+ zip(plot_options.plot_range, plot_options.ranges)
+ ):
+ # TODO: this treats Automatic and Full as the same, which isn't quite right
+ if isinstance(pr, (str, Symbol)) and not isinstance(r[1], complex):
+ # extract {xmin,xmax} from {x,xmin,xmax}
+ plot_options.plot_range[i] = r[1:]
# unpythonize and update PlotRange option
options[str(SymbolPlotRange)] = to_mathics_list(*plot_options.plot_range)
@@ -140,6 +149,10 @@ def eval(
)
return graphics_expr
+ def apply_function(self, function, names, us, vs):
+ parms = {str(names[0]): us, str(names[1]): vs}
+ return us, vs, function(**parms)
+
class ComplexPlot3D(_Plot3D):
"""
@@ -161,8 +174,13 @@ class ComplexPlot3D(_Plot3D):
options = _Plot3D.options3d | {"Mesh": "None"}
many_functions = True
+ num_plot_points = 2 # different from number of ranges
graphics_class = Graphics3D
+ def apply_function(self, function, names, us, vs):
+ parms = {str(names[0]): us + vs * 1j}
+ return us, vs, function(**parms)
+
class ComplexPlot(_Plot3D):
"""
@@ -184,8 +202,13 @@ class ComplexPlot(_Plot3D):
options = _Plot3D.options2d
many_functions = False
+ num_plot_points = 2 # different from number of ranges
graphics_class = Graphics
+ def apply_function(self, function, names, us, vs):
+ parms = {str(names[0]): us + vs * 1j}
+ return us, vs, function(**parms)
+
class ContourPlot(_Plot3D):
"""
@@ -244,6 +267,47 @@ class DensityPlot(_Plot3D):
graphics_class = Graphics
+class ParametricPlot3D(_Plot3D):
+ """
+ :Parametric equation: https://en.wikipedia.org/wiki/Parametric_equation
+ :WMA link: https://reference.wolfram.com/language/ref/ParametricPlot3D.html
+
+ - 'ParametricPlot3D'[${x(u,v), y(u,v), z(u,v)}$, {$u$, $u_{min}$, $u_{max}$}, {$v$, $v_{min}$, $v_{max}$}]
+
- creates a three-dimensional surface using the functions $x$, $y$, $z$ over the specified ranges for parameters $u$ and $v$.
+
+
- 'ParametricPlot3D'[${x(u), y(u), z(u)}$, {$u$, $u_{min}$, $u_{max}$}]
+
- creates a three-dimensional space curve using the functions $x$, $y$, $z$ over the specified range for parameter $u$.
+
+ See :Drawing Option and Option Values:
+ /doc/reference-of-built-in-symbols/graphics-and-drawing/drawing-options-and-option-values
+ for a list of Plot options.
+
+
+ >> ParametricPlot3D[{Sin[t] + 2 Sin[2 t], Cos[t] - 2 Cos[2 t], -Sin[3 t]}, {t, 0, 2 Pi}]
+ = ...
+
+ A function of a single parameter $t$ generates a trefoil knot.
+
+ >> ParametricPlot3D[{(2 + Cos[v]) Cos[u], (2 + Cos[v]) Sin[u], Sin[v]}, {u, 0, 2 Pi}, {v, 0, 2 Pi}]
+ = ...
+
+ A function of two parameters $u$ and $v$ generates a torus.
+
+ """
+
+ summary_text = "plot a parametric surface or curve in three dimensions"
+ expected_args = 3
+ options = _Plot3D.options3d
+
+ is_cartesian = False
+ many_functions = True
+ graphics_class = Graphics3D
+
+ def apply_function(self, functions, names, *parms):
+ parms = {str(n): p for n, p in zip(names, parms)}
+ return [f(**parms) for f in functions]
+
+
class Plot3D(_Plot3D):
"""
:WMA link: https://reference.wolfram.com/language/ref/Plot3D.html
@@ -279,3 +343,44 @@ class Plot3D(_Plot3D):
many_functions = True
graphics_class = Graphics3D
+
+
+class SphericalPlot3D(_Plot3D):
+ """
+ :Spherical coordinate system: https://en.wikipedia.org/wiki/Spherical_coordinate_system
+ :WMA link: https://reference.wolfram.com/language/ref/SphericalPlot3D.html
+
+ - 'SphericalPlot3D'[$r(theta, phi)$, {$theta$, $theta_{min}$, $theta_{max}$}, {$phi$, $phi_{min}$, $phi_{max}$}]
+
- creates a three-dimensional surface at radius $r(theta, phi)$ for spherical angles $theta$ and $phi$ over the specified ranges
+
+
- 'SphericalPlot3D'[$r(theta, phi)$, $theta$, $phi$]
+
- creates a three-dimensional surface at radius $r(theta, phi)$ for spherical angles $theta$ and $phi$
+ in the ranges $0 < theta < pi$ and $0 < phi < 2pi$ covering the entire sphere
+
+ See :Drawing Option and Option Values:
+ /doc/reference-of-built-in-symbols/graphics-and-drawing/drawing-options-and-option-values
+ for a list of Plot options.
+
+
+ >> SphericalPlot3D[1 + 0.4 Abs[SphericalHarmonicY[10, 4, theta, phi]], theta, phi]
+ = ...
+
+ Spherical harmonics are the canonical use case for spherical plots.
+
+
+ """
+
+ summary_text = "produce a surface plot functions spherical angles theta and phi"
+ expected_args = 3
+ options = _Plot3D.options3d | {"BoxRatios": "{1,1,1}"}
+
+ is_cartesian = False
+ many_functions = True
+ graphics_class = Graphics3D
+ default_ranges = [[0, np.pi], [0, 2 * np.pi]]
+
+ def apply_function(self, function, names, θ, φ):
+ parms = {names[0]: θ, names[1]: φ}
+ r = function(**parms)
+ x, y, z = r * np.sin(θ) * np.cos(φ), r * np.sin(θ) * np.sin(φ), r * np.cos(θ)
+ return x, y, z
diff --git a/mathics/core/systemsymbols.py b/mathics/core/systemsymbols.py
index 81f9efc19..f1bb74fca 100644
--- a/mathics/core/systemsymbols.py
+++ b/mathics/core/systemsymbols.py
@@ -26,6 +26,7 @@
SymbolAborted = Symbol("System`$Aborted")
SymbolAbs = Symbol("System`Abs")
SymbolAbsoluteTime = Symbol("AbsoluteTime")
+SymbolAbsoluteThickness = Symbol("System`AbsoluteThickness")
SymbolAccuracy = Symbol("System`Accuracy")
SymbolAlignmentPoint = Symbol("System`AlignmentPoint")
SymbolAll = Symbol("System`All")
diff --git a/mathics/core/util.py b/mathics/core/util.py
index ed9fd3628..4cf650b69 100644
--- a/mathics/core/util.py
+++ b/mathics/core/util.py
@@ -134,7 +134,10 @@ def print_expression_tree(
if file is None:
file = sys.stdout
- if isinstance(expr, Symbol):
+ if isinstance(expr, (tuple, list)):
+ for e in expr:
+ print_expression_tree(e, indent, marker, file, approximate)
+ elif isinstance(expr, Symbol):
print(f"{indent}{marker(expr)}{expr}", file=file)
elif not hasattr(expr, "elements"):
if isinstance(expr, MachineReal) and approximate:
diff --git a/mathics/eval/drawing/plot3d.py b/mathics/eval/drawing/plot3d.py
index 512460881..c603902bc 100644
--- a/mathics/eval/drawing/plot3d.py
+++ b/mathics/eval/drawing/plot3d.py
@@ -513,3 +513,17 @@ def eval_ContourPlot(
evaluation: Evaluation,
):
return None
+
+
+def eval_ParametricPlot3D(
+ plot_options,
+ evaluation: Evaluation,
+):
+ return None
+
+
+def eval_SphericalPlot3D(
+ plot_options,
+ evaluation: Evaluation,
+):
+ return None
diff --git a/mathics/eval/drawing/plot3d_vectorized.py b/mathics/eval/drawing/plot3d_vectorized.py
index 34b50ab1d..0074eb7dd 100644
--- a/mathics/eval/drawing/plot3d_vectorized.py
+++ b/mathics/eval/drawing/plot3d_vectorized.py
@@ -8,11 +8,11 @@
import numpy as np
from mathics.builtin.colors.color_internals import convert_color
-from mathics.core.convert.lambdify import lambdify_compile
from mathics.core.evaluation import Evaluation
from mathics.core.expression import Expression
from mathics.core.symbols import strip_context
from mathics.core.systemsymbols import (
+ SymbolAbsoluteThickness,
SymbolEqual,
SymbolNone,
SymbolRGBColor,
@@ -21,36 +21,40 @@
from mathics.timing import Timer
from .colors import palette2, palette3, palette_color_directive
-from .util import GraphicsGenerator
+from .util import GraphicsGenerator, compile_exprs
-def make_plot(plot_options, evaluation: Evaluation, dim: int, is_complex: bool, emit):
+def make_surfaces(
+ plot_options, evaluation: Evaluation, dim: int, is_complex: bool, emit
+):
graphics = GraphicsGenerator(dim)
# pull out plot options
if not is_complex:
- _, xmin, xmax = plot_options.ranges[0]
- _, ymin, ymax = plot_options.ranges[1]
+ _, umin, umax = plot_options.ranges[0]
+ _, vmin, vmax = plot_options.ranges[1]
else:
# will generate xs and ys as for real, then combine to form complex cs
_, cmin, cmax = plot_options.ranges[0]
- xmin, xmax = cmin.real, cmax.real
- ymin, ymax = cmin.imag, cmax.imag
+ umin, umax = cmin.real, cmax.real
+ vmin, vmax = cmin.imag, cmax.imag
names = [strip_context(str(range[0])) for range in plot_options.ranges]
# Mesh option
- nmesh = 20
- if plot_options.mesh is SymbolNone:
- nmesh = 0
+ mesh = plot_options.mesh
+ nmeshx = nmeshy = 20
+ if mesh is SymbolNone:
+ nmeshx = nmeshy = 0
+ elif isinstance(plot_options.mesh, int):
+ nmeshx = nmeshy = plot_options.mesh
+ elif isinstance(mesh, (list, tuple)) and all(isinstance(m, int) for m in mesh):
+ nmeshx, nmeshy = mesh
# compile the functions
with Timer("compile"):
- compiled_functions = [
- lambdify_compile(evaluation, function, names)
- for function in plot_options.functions
- ]
+ compiled_functions = compile_exprs(evaluation, plot_options.functions, names)
- def compute_over_grid(nx, ny):
+ def compute_over_grid(nu, nv):
"""
For each function, computes an (nx*ny, 3) array of coordinates (xyzs),
and an (nx, ny) array of indices (inxs) into xyzs representing
@@ -62,24 +66,24 @@ def compute_over_grid(nx, ny):
grid used to display a mesh of lines on the surface.
"""
- # compute (nx, ny) grids of xs and ys for corresponding vertexes
- xs = np.linspace(xmin, xmax, nx)
- ys = np.linspace(ymin, ymax, ny)
- xs, ys = np.meshgrid(xs, ys)
+ # Note on naming: we use u,v to refer to the independent variable initially.
+ # For Plot3D etc. those will be x and y, but for ParametricPlot3D and
+ # and for SpericalPlot3D the xs, ys, and zs will all be computed.
+ # compute (nu, nv) grids of us and vs for corresponding vertexes
+ us = np.linspace(umin, umax, nu)
+ vs = np.linspace(vmin, vmax, nv)
+ us, vs = np.meshgrid(us, vs)
- # (nx,ny) array of numbers from 0 to n-1 that are
+ # (nu,nv) array of numbers from 0 to n-1 that are
# indexes into xyzs array for corresponding vertex
# +1 because these will be used as WL indexes, which are 1-based
- inxs = np.arange(math.prod(xs.shape)).reshape(xs.shape) + 1
+ inxs = np.arange(math.prod(us.shape)).reshape(us.shape) + 1
for function in compiled_functions:
# compute zs from xs and ys using compiled function
- with Timer("compute zs"):
- if not is_complex:
- zs = function(**{str(names[0]): xs, str(names[1]): ys})
- else:
- cs = xs + ys * 1j # TODO: fast enough?
- zs = function(**{str(names[0]): cs})
+ with Timer("compute xs, ys, zs"):
+ # xs, ys, zs = function(**{str(names[0]): us, str(names[1]): vs})
+ xs, ys, zs = plot_options.apply_function(function, names, us, vs)
# sometimes expr gets compiled into something that returns a complex
# even though the imaginary part is 0
@@ -87,15 +91,16 @@ def compute_over_grid(nx, ny):
# TODO: needed this for Hypergeometric - look into that
# assert np.all(np.isreal(zs)), "array contains complex values"
if not is_complex:
+ xs = np.real(xs)
+ ys = np.real(ys)
zs = np.real(zs)
# if it's a constant, make it a full array
if isinstance(zs, (float, int, complex)):
zs = np.full(xs.shape, zs)
- # (nx*ny, 3) array of points, to be indexed by quads
+ # (nu*nv, 3) array of points, to be indexed by quads
xyzs = np.stack([xs, ys, zs]).transpose(1, 2, 0).reshape(-1, 3)
-
yield xyzs, inxs
# generate the quads and emit a GraphicsComplex containing them
@@ -108,12 +113,12 @@ def compute_over_grid(nx, ny):
quads = quads.T.reshape(-1, 4)
# pass the xyzs and quads back to the caller to add colors and emit quads as appropriate
- emit(graphics, i, xyzs, quads)
+ emit(graphics, i, xyzs, None, quads)
# If requested by the Mesh attribute create a mesh of lines covering the surfaces
# For now only for Plot3D
# TODO: mesh for DensityPlot?
- if nmesh and dim == 3:
+ if nmeshx and nmeshy and dim == 3:
# meshes are black for now
graphics.add_directives([SymbolRGBColor, 0, 0, 0])
@@ -123,14 +128,53 @@ def compute_over_grid(nx, ny):
# from one row or one column of the inxs array.
# Each mesh line has high res (nx or ny) so it follows
# the contours of the surface.
- for xyzs, inxs in compute_over_grid(nx, nmesh):
+ for xyzs, inxs in compute_over_grid(nx, nmeshy):
graphics.add_complex(xyzs.real, lines=inxs, polys=None)
- for xyzs, inxs in compute_over_grid(nmesh, ny):
+ for xyzs, inxs in compute_over_grid(nmeshx, ny):
graphics.add_complex(xyzs.real, lines=inxs.T, polys=None)
return graphics
+# For ParametricPlot3D with just one independent variable we generate a curve
+# TODO: consider whether we can DRY this with similar code in ParmetricPlot
+def make_curves(plot_options, evaluation: Evaluation, dim: int, emit):
+ graphics = GraphicsGenerator(dim)
+
+ # pull out plot options
+ _, tmin, tmax = plot_options.ranges[0]
+ nt = plot_options.plot_points[0]
+
+ # compile
+ names = [strip_context(str(range[0])) for range in plot_options.ranges]
+ with Timer("compile"):
+ compiled_functions = compile_exprs(evaluation, plot_options.functions, names)
+
+ # sample points and indexes for making line
+ ts = np.linspace(tmin, tmax, nt)
+ line = np.arange(nt) + 1
+
+ # compute curve for each function
+ for i, function in enumerate(compiled_functions):
+ # compute xs, ys, zs from ts
+ with Timer("compute xs, ys, zs"):
+ xs, ys, zs = plot_options.apply_function(function, names, ts)
+
+ # if it's a constant, make it a full array
+ def full_array(a):
+ return np.full(ts.shape, a) if isinstance(a, (float, int, complex)) else a
+
+ xs = full_array(xs)
+ ys = full_array(ys)
+ zs = full_array(zs)
+
+ # stack 'em
+ xyzs = np.stack([xs, ys, zs]).T
+ emit(graphics, i, xyzs, [line], None)
+
+ return graphics
+
+
@Timer("density_colors")
def density_colors(zs):
"""default color palette for DensityPlot and ContourPlot (f(x) form)"""
@@ -151,7 +195,7 @@ def eval_Plot3D(
plot_options,
evaluation: Evaluation,
):
- def emit(graphics, i, xyzs, quads):
+ def emit(graphics, i, xyzs, _, quads):
# choose a color
color_directive = palette_color_directive(palette3, i)
graphics.add_directives(color_directive)
@@ -159,7 +203,7 @@ def emit(graphics, i, xyzs, quads):
# add a GraphicsComplex displaying a surface for this function
graphics.add_complex(xyzs, lines=None, polys=quads)
- return make_plot(plot_options, evaluation, dim=3, is_complex=False, emit=emit)
+ return make_surfaces(plot_options, evaluation, dim=3, is_complex=False, emit=emit)
@Timer("eval_DensityPlot")
@@ -167,7 +211,7 @@ def eval_DensityPlot(
plot_options,
evaluation: Evaluation,
):
- def emit(graphics, i, xyzs, quads):
+ def emit(graphics, i, xyzs, _, quads):
# Fixed palette for now
# TODO: accept color options
colors = density_colors(xyzs[:, 2])
@@ -175,7 +219,7 @@ def emit(graphics, i, xyzs, quads):
# flatten the points and add the quads
graphics.add_complex(xyzs[:, 0:2], lines=None, polys=quads, colors=colors)
- return make_plot(plot_options, evaluation, dim=2, is_complex=False, emit=emit)
+ return make_surfaces(plot_options, evaluation, dim=2, is_complex=False, emit=emit)
@Timer("eval_ContourPlot")
@@ -198,7 +242,7 @@ def eval_ContourPlot(
contour_levels = [0]
background = False
- def emit(graphics, i, xyzs, quads):
+ def emit(graphics, i, xyzs, _, quads):
# set line color
if background:
# showing a background, so just black lines
@@ -254,7 +298,7 @@ def emit(graphics, i, xyzs, quads):
)
# plot_options.plot_points = [n * 10 for n in plot_options.plot_points]
- return make_plot(plot_options, evaluation, dim=2, is_complex=False, emit=emit)
+ return make_surfaces(plot_options, evaluation, dim=2, is_complex=False, emit=emit)
@Timer("complex colors")
@@ -286,13 +330,13 @@ def eval_ComplexPlot3D(
plot_options,
evaluation: Evaluation,
):
- def emit(graphics, i, xyzs, quads):
+ def emit(graphics, i, xyzs, _, quads):
zs = xyzs[:, 2]
rgb = complex_colors(zs, s=0.8)
xyzs[:, 2] = abs(zs)
graphics.add_complex(xyzs.real, lines=None, polys=quads, colors=rgb)
- return make_plot(plot_options, evaluation, dim=3, is_complex=True, emit=emit)
+ return make_surfaces(plot_options, evaluation, dim=3, is_complex=True, emit=emit)
@Timer("eval_ComplexPlot")
@@ -300,10 +344,53 @@ def eval_ComplexPlot(
plot_options,
evaluation: Evaluation,
):
- def emit(graphics, i, xyzs, quads):
+ def emit(graphics, i, xyzs, _, quads):
# flatten the points and add the quads
rgb = complex_colors(xyzs[:, 2])
xyzs_re = xyzs[:, 0:2].real
graphics.add_complex(xyzs_re, lines=None, polys=quads, colors=rgb)
- return make_plot(plot_options, evaluation, dim=2, is_complex=True, emit=emit)
+ return make_surfaces(plot_options, evaluation, dim=2, is_complex=True, emit=emit)
+
+
+@Timer("eval_ParametricPlot3D")
+def eval_ParametricPlot3D(
+ plot_options,
+ evaluation: Evaluation,
+):
+ # ParametericPlot3D can make curves or surfaces depending on number of independent variables
+ is_surface = len(plot_options.ranges) > 1
+
+ def emit(graphics, i, xyzs, lines, polys):
+ # choose a color
+ palette = palette3 if is_surface else palette2
+ color_directive = palette_color_directive(palette, i)
+ graphics.add_directives(color_directive)
+ if not is_surface:
+ graphics.add_directives([SymbolAbsoluteThickness, 4])
+
+ # add a GraphicsComplex displaying a surface for this function
+ graphics.add_complex(xyzs, lines=lines, polys=polys)
+
+ # we want a list, each element of which is a list of 2 or 3 functions
+ # to compute the coordinates of the lines or surface
+ if not isinstance(plot_options.functions[0], (list, tuple)):
+ plot_options.functions = [plot_options.functions]
+
+ if is_surface:
+ return make_surfaces(
+ plot_options, evaluation, dim=3, is_complex=False, emit=emit
+ )
+ else:
+ return make_curves(plot_options, evaluation, dim=3, emit=emit)
+
+
+@Timer("eval_SphericalPlot3D")
+def eval_SphericalPlot3D(
+ plot_options,
+ evaluation: Evaluation,
+):
+ # At this point it's just like Plot3D - the apply_function that has been passed
+ # in plot_options will converts spherical coordinates to cartesian coordinates
+ # after evaluating the function(s) to get r
+ return eval_Plot3D(plot_options, evaluation)
diff --git a/mathics/eval/drawing/util.py b/mathics/eval/drawing/util.py
index d6e5c8ec4..0276d3e8b 100644
--- a/mathics/eval/drawing/util.py
+++ b/mathics/eval/drawing/util.py
@@ -2,9 +2,12 @@
Common utilities for plotting
"""
+from typing import Sequence
from mathics.core.atoms import NumericArray
from mathics.core.convert.expression import to_expression, to_mathics_list
+from mathics.core.convert.lambdify import lambdify_compile
+from mathics.core.evaluation import Evaluation
from mathics.core.expression import Expression
from mathics.core.list import ListExpression
from mathics.core.symbols import Symbol
@@ -20,10 +23,7 @@
)
-# TODO: this will be extended with support for GraphicsComplex in a
-# subsequent PR, which may involve a little more refactoring
class GraphicsGenerator:
-
"""
Support for generating Graphics and Graphics3D expressions
"""
@@ -102,3 +102,13 @@ def generate(self, options):
)
return graphics_expr
+
+
+def compile_exprs(
+ evaluation: Evaluation, expr_or_list: Expression | Sequence, names: Sequence[str]
+):
+ """Traverse a nested list structure and compile the functions at the leaves"""
+ if isinstance(expr_or_list, (list, tuple)):
+ return [compile_exprs(evaluation, e, names) for e in expr_or_list]
+ else:
+ return lambdify_compile(evaluation, expr_or_list, names)
diff --git a/test/builtin/drawing/test_plot_detail.py b/test/builtin/drawing/test_plot_detail.py
index 7081a0bfb..e1fdc7e36 100644
--- a/test/builtin/drawing/test_plot_detail.py
+++ b/test/builtin/drawing/test_plot_detail.py
@@ -343,14 +343,14 @@ def yaml_tests_generator(fn: str):
YAML_TESTS = [
- "doc_tests.yaml",
"vec_tests.yaml",
+ "doc_tests.yaml",
"parameters.yaml",
]
-def all_yaml_tests_generator():
- for fn in YAML_TESTS:
+def all_yaml_tests_generator(fns=None):
+ for fn in fns or YAML_TESTS:
yield from yaml_tests_generator(fn)
@@ -370,14 +370,14 @@ def test_yaml(parms):
one_test(**parms)
-def do_test_all():
+def do_test_all(fns):
# several of these tests failed on pyodide due to apparent differences
# in numpy (and/or the blas library backing it) between pyodide and other platforms
# including numerical instability, different data types (integer vs real)
# the tests above seem so far to be ok on pyodide, but generally they are
# simpler than these doc_tests
if not pyodide:
- for parms in all_yaml_tests_generator():
+ for parms in all_yaml_tests_generator(fns):
one_test(**parms)
@@ -386,11 +386,12 @@ def do_test_all():
parser = argparse.ArgumentParser(description="manage plot tests")
parser.add_argument("--update", action="store_true", help="update reference files")
+ parser.add_argument("files", nargs="*", help="yaml test files")
args = parser.parse_args()
UPDATE_MODE = args.update
try:
- do_test_all()
+ do_test_all(args.files)
except AssertionError as oops:
print(oops)
print("FAIL")
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-moebius-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-moebius-vec.txt
new file mode 100644
index 000000000..3422baf35
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-moebius-vec.txt
@@ -0,0 +1,318 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 5.00000000e-01 0.00000000e+00 -0.00000000e+00]
+ [ 4.99813069e-01 1.57862418e-02 -7.89312101e-03]
+ [ 4.99252135e-01 3.15685419e-02 -1.57842749e-02]
+ ...
+ [ 4.99252135e-01 -3.15685419e-02 1.57842749e-02]
+ [ 4.99813069e-01 -1.57862418e-02 7.89312101e-03]
+ [ 5.00000000e-01 -1.22464680e-16 6.12323400e-17]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Integer 0
+ System`Integer 0
+ System`Integer 0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 1000×3]
+ [[ 5.00000000e-01 0.00000000e+00 -0.00000000e+00]
+ [ 4.99813069e-01 1.57862418e-02 -7.89312101e-03]
+ [ 4.99252135e-01 3.15685419e-02 -1.57842749e-02]
+ ...
+ [ 4.99252135e-01 -3.15685419e-02 1.57842749e-02]
+ [ 4.99813069e-01 -1.57862418e-02 7.89312101e-03]
+ [ 5.00000000e-01 -1.22464680e-16 6.12323400e-17]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 5×200]
+ [[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+ 15 16 17 18 19 20 21 22 23 24 25 26 27 28
+ 29 30 31 32 33 34 35 36 37 38 39 40 41 42
+ 43 44 45 46 47 48 49 50 51 52 53 54 55 56
+ 57 58 59 60 61 62 63 64 65 66 67 68 69 70
+ 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+ 85 86 87 88 89 90 91 92 93 94 95 96 97 98
+ 99 100 101 102 103 104 105 106 107 108 109 110 111 112
+ 113 114 115 116 117 118 119 120 121 122 123 124 125 126
+ 127 128 129 130 131 132 133 134 135 136 137 138 139 140
+ 141 142 143 144 145 146 147 148 149 150 151 152 153 154
+ 155 156 157 158 159 160 161 162 163 164 165 166 167 168
+ 169 170 171 172 173 174 175 176 177 178 179 180 181 182
+ 183 184 185 186 187 188 189 190 191 192 193 194 195 196
+ 197 198 199 200]
+ [ 201 202 203 204 205 206 207 208 209 210 211 212 213 214
+ 215 216 217 218 219 220 221 222 223 224 225 226 227 228
+ 229 230 231 232 233 234 235 236 237 238 239 240 241 242
+ 243 244 245 246 247 248 249 250 251 252 253 254 255 256
+ 257 258 259 260 261 262 263 264 265 266 267 268 269 270
+ 271 272 273 274 275 276 277 278 279 280 281 282 283 284
+ 285 286 287 288 289 290 291 292 293 294 295 296 297 298
+ 299 300 301 302 303 304 305 306 307 308 309 310 311 312
+ 313 314 315 316 317 318 319 320 321 322 323 324 325 326
+ 327 328 329 330 331 332 333 334 335 336 337 338 339 340
+ 341 342 343 344 345 346 347 348 349 350 351 352 353 354
+ 355 356 357 358 359 360 361 362 363 364 365 366 367 368
+ 369 370 371 372 373 374 375 376 377 378 379 380 381 382
+ 383 384 385 386 387 388 389 390 391 392 393 394 395 396
+ 397 398 399 400]
+ [ 401 402 403 404 405 406 407 408 409 410 411 412 413 414
+ 415 416 417 418 419 420 421 422 423 424 425 426 427 428
+ 429 430 431 432 433 434 435 436 437 438 439 440 441 442
+ 443 444 445 446 447 448 449 450 451 452 453 454 455 456
+ 457 458 459 460 461 462 463 464 465 466 467 468 469 470
+ 471 472 473 474 475 476 477 478 479 480 481 482 483 484
+ 485 486 487 488 489 490 491 492 493 494 495 496 497 498
+ 499 500 501 502 503 504 505 506 507 508 509 510 511 512
+ 513 514 515 516 517 518 519 520 521 522 523 524 525 526
+ 527 528 529 530 531 532 533 534 535 536 537 538 539 540
+ 541 542 543 544 545 546 547 548 549 550 551 552 553 554
+ 555 556 557 558 559 560 561 562 563 564 565 566 567 568
+ 569 570 571 572 573 574 575 576 577 578 579 580 581 582
+ 583 584 585 586 587 588 589 590 591 592 593 594 595 596
+ 597 598 599 600]
+ [ 601 602 603 604 605 606 607 608 609 610 611 612 613 614
+ 615 616 617 618 619 620 621 622 623 624 625 626 627 628
+ 629 630 631 632 633 634 635 636 637 638 639 640 641 642
+ 643 644 645 646 647 648 649 650 651 652 653 654 655 656
+ 657 658 659 660 661 662 663 664 665 666 667 668 669 670
+ 671 672 673 674 675 676 677 678 679 680 681 682 683 684
+ 685 686 687 688 689 690 691 692 693 694 695 696 697 698
+ 699 700 701 702 703 704 705 706 707 708 709 710 711 712
+ 713 714 715 716 717 718 719 720 721 722 723 724 725 726
+ 727 728 729 730 731 732 733 734 735 736 737 738 739 740
+ 741 742 743 744 745 746 747 748 749 750 751 752 753 754
+ 755 756 757 758 759 760 761 762 763 764 765 766 767 768
+ 769 770 771 772 773 774 775 776 777 778 779 780 781 782
+ 783 784 785 786 787 788 789 790 791 792 793 794 795 796
+ 797 798 799 800]
+ [ 801 802 803 804 805 806 807 808 809 810 811 812 813 814
+ 815 816 817 818 819 820 821 822 823 824 825 826 827 828
+ 829 830 831 832 833 834 835 836 837 838 839 840 841 842
+ 843 844 845 846 847 848 849 850 851 852 853 854 855 856
+ 857 858 859 860 861 862 863 864 865 866 867 868 869 870
+ 871 872 873 874 875 876 877 878 879 880 881 882 883 884
+ 885 886 887 888 889 890 891 892 893 894 895 896 897 898
+ 899 900 901 902 903 904 905 906 907 908 909 910 911 912
+ 913 914 915 916 917 918 919 920 921 922 923 924 925 926
+ 927 928 929 930 931 932 933 934 935 936 937 938 939 940
+ 941 942 943 944 945 946 947 948 949 950 951 952 953 954
+ 955 956 957 958 959 960 961 962 963 964 965 966 967 968
+ 969 970 971 972 973 974 975 976 977 978 979 980 981 982
+ 983 984 985 986 987 988 989 990 991 992 993 994 995 996
+ 997 998 999 1000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 3000×3]
+ [[ 5.00000000e-01 0.00000000e+00 -0.00000000e+00]
+ [ 4.61779019e-01 2.22381055e-01 -1.11260467e-01]
+ [ 3.42617351e-01 4.29628570e-01 -2.16941870e-01]
+ ...
+ [ 3.42617351e-01 -4.29628570e-01 2.16941870e-01]
+ [ 4.61779019e-01 -2.22381055e-01 1.11260467e-01]
+ [ 5.00000000e-01 -1.22464680e-16 6.12323400e-17]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 15×200]
+ [[ 1 16 31 ... 2956 2971 2986]
+ [ 2 17 32 ... 2957 2972 2987]
+ [ 3 18 33 ... 2958 2973 2988]
+ ...
+ [ 13 28 43 ... 2968 2983 2998]
+ [ 14 29 44 ... 2969 2984 2999]
+ [ 15 30 45 ... 2970 2985 3000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Real 0.4
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`Automatic
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-multi-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-multi-vec.txt
new file mode 100644
index 000000000..2c3732d7a
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-multi-vec.txt
@@ -0,0 +1,455 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 0.392157
+ System`Real 0.560784
+ System`Real 1.0
+ System`AbsoluteThickness
+ System`Integer 4
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 1000×3]
+ [[ 0.00000000e+00 -1.00000000e+00 -0.00000000e+00]
+ [ 3.14466690e-02 -9.99861551e-01 -1.88673048e-02]
+ [ 6.28891086e-02 -9.99446227e-01 -3.77278927e-02]
+ ...
+ [-6.28891086e-02 -9.99446227e-01 3.77278927e-02]
+ [-3.14466690e-02 -9.99861551e-01 1.88673048e-02]
+ [-1.22464680e-15 -1.00000000e+00 7.34788079e-16]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 1×1000]
+ [[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+ 15 16 17 18 19 20 21 22 23 24 25 26 27 28
+ 29 30 31 32 33 34 35 36 37 38 39 40 41 42
+ 43 44 45 46 47 48 49 50 51 52 53 54 55 56
+ 57 58 59 60 61 62 63 64 65 66 67 68 69 70
+ 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+ 85 86 87 88 89 90 91 92 93 94 95 96 97 98
+ 99 100 101 102 103 104 105 106 107 108 109 110 111 112
+ 113 114 115 116 117 118 119 120 121 122 123 124 125 126
+ 127 128 129 130 131 132 133 134 135 136 137 138 139 140
+ 141 142 143 144 145 146 147 148 149 150 151 152 153 154
+ 155 156 157 158 159 160 161 162 163 164 165 166 167 168
+ 169 170 171 172 173 174 175 176 177 178 179 180 181 182
+ 183 184 185 186 187 188 189 190 191 192 193 194 195 196
+ 197 198 199 200 201 202 203 204 205 206 207 208 209 210
+ 211 212 213 214 215 216 217 218 219 220 221 222 223 224
+ 225 226 227 228 229 230 231 232 233 234 235 236 237 238
+ 239 240 241 242 243 244 245 246 247 248 249 250 251 252
+ 253 254 255 256 257 258 259 260 261 262 263 264 265 266
+ 267 268 269 270 271 272 273 274 275 276 277 278 279 280
+ 281 282 283 284 285 286 287 288 289 290 291 292 293 294
+ 295 296 297 298 299 300 301 302 303 304 305 306 307 308
+ 309 310 311 312 313 314 315 316 317 318 319 320 321 322
+ 323 324 325 326 327 328 329 330 331 332 333 334 335 336
+ 337 338 339 340 341 342 343 344 345 346 347 348 349 350
+ 351 352 353 354 355 356 357 358 359 360 361 362 363 364
+ 365 366 367 368 369 370 371 372 373 374 375 376 377 378
+ 379 380 381 382 383 384 385 386 387 388 389 390 391 392
+ 393 394 395 396 397 398 399 400 401 402 403 404 405 406
+ 407 408 409 410 411 412 413 414 415 416 417 418 419 420
+ 421 422 423 424 425 426 427 428 429 430 431 432 433 434
+ 435 436 437 438 439 440 441 442 443 444 445 446 447 448
+ 449 450 451 452 453 454 455 456 457 458 459 460 461 462
+ 463 464 465 466 467 468 469 470 471 472 473 474 475 476
+ 477 478 479 480 481 482 483 484 485 486 487 488 489 490
+ 491 492 493 494 495 496 497 498 499 500 501 502 503 504
+ 505 506 507 508 509 510 511 512 513 514 515 516 517 518
+ 519 520 521 522 523 524 525 526 527 528 529 530 531 532
+ 533 534 535 536 537 538 539 540 541 542 543 544 545 546
+ 547 548 549 550 551 552 553 554 555 556 557 558 559 560
+ 561 562 563 564 565 566 567 568 569 570 571 572 573 574
+ 575 576 577 578 579 580 581 582 583 584 585 586 587 588
+ 589 590 591 592 593 594 595 596 597 598 599 600 601 602
+ 603 604 605 606 607 608 609 610 611 612 613 614 615 616
+ 617 618 619 620 621 622 623 624 625 626 627 628 629 630
+ 631 632 633 634 635 636 637 638 639 640 641 642 643 644
+ 645 646 647 648 649 650 651 652 653 654 655 656 657 658
+ 659 660 661 662 663 664 665 666 667 668 669 670 671 672
+ 673 674 675 676 677 678 679 680 681 682 683 684 685 686
+ 687 688 689 690 691 692 693 694 695 696 697 698 699 700
+ 701 702 703 704 705 706 707 708 709 710 711 712 713 714
+ 715 716 717 718 719 720 721 722 723 724 725 726 727 728
+ 729 730 731 732 733 734 735 736 737 738 739 740 741 742
+ 743 744 745 746 747 748 749 750 751 752 753 754 755 756
+ 757 758 759 760 761 762 763 764 765 766 767 768 769 770
+ 771 772 773 774 775 776 777 778 779 780 781 782 783 784
+ 785 786 787 788 789 790 791 792 793 794 795 796 797 798
+ 799 800 801 802 803 804 805 806 807 808 809 810 811 812
+ 813 814 815 816 817 818 819 820 821 822 823 824 825 826
+ 827 828 829 830 831 832 833 834 835 836 837 838 839 840
+ 841 842 843 844 845 846 847 848 849 850 851 852 853 854
+ 855 856 857 858 859 860 861 862 863 864 865 866 867 868
+ 869 870 871 872 873 874 875 876 877 878 879 880 881 882
+ 883 884 885 886 887 888 889 890 891 892 893 894 895 896
+ 897 898 899 900 901 902 903 904 905 906 907 908 909 910
+ 911 912 913 914 915 916 917 918 919 920 921 922 923 924
+ 925 926 927 928 929 930 931 932 933 934 935 936 937 938
+ 939 940 941 942 943 944 945 946 947 948 949 950 951 952
+ 953 954 955 956 957 958 959 960 961 962 963 964 965 966
+ 967 968 969 970 971 972 973 974 975 976 977 978 979 980
+ 981 982 983 984 985 986 987 988 989 990 991 992 993 994
+ 995 996 997 998 999 1000]]
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`AbsoluteThickness
+ System`Integer 4
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 1000×3]
+ [[ 0.00000000e+00 2.00000000e+00 0.00000000e+00]
+ [ 1.25788666e-02 1.99996044e+00 2.48933554e-01]
+ [ 2.51572357e-02 1.99984177e+00 4.82194534e-01]
+ ...
+ [-2.51572357e-02 1.99984177e+00 -4.82194534e-01]
+ [-1.25788666e-02 1.99996044e+00 -2.48933554e-01]
+ [-4.89858720e-16 2.00000000e+00 -9.79717439e-15]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 1×1000]
+ [[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+ 15 16 17 18 19 20 21 22 23 24 25 26 27 28
+ 29 30 31 32 33 34 35 36 37 38 39 40 41 42
+ 43 44 45 46 47 48 49 50 51 52 53 54 55 56
+ 57 58 59 60 61 62 63 64 65 66 67 68 69 70
+ 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+ 85 86 87 88 89 90 91 92 93 94 95 96 97 98
+ 99 100 101 102 103 104 105 106 107 108 109 110 111 112
+ 113 114 115 116 117 118 119 120 121 122 123 124 125 126
+ 127 128 129 130 131 132 133 134 135 136 137 138 139 140
+ 141 142 143 144 145 146 147 148 149 150 151 152 153 154
+ 155 156 157 158 159 160 161 162 163 164 165 166 167 168
+ 169 170 171 172 173 174 175 176 177 178 179 180 181 182
+ 183 184 185 186 187 188 189 190 191 192 193 194 195 196
+ 197 198 199 200 201 202 203 204 205 206 207 208 209 210
+ 211 212 213 214 215 216 217 218 219 220 221 222 223 224
+ 225 226 227 228 229 230 231 232 233 234 235 236 237 238
+ 239 240 241 242 243 244 245 246 247 248 249 250 251 252
+ 253 254 255 256 257 258 259 260 261 262 263 264 265 266
+ 267 268 269 270 271 272 273 274 275 276 277 278 279 280
+ 281 282 283 284 285 286 287 288 289 290 291 292 293 294
+ 295 296 297 298 299 300 301 302 303 304 305 306 307 308
+ 309 310 311 312 313 314 315 316 317 318 319 320 321 322
+ 323 324 325 326 327 328 329 330 331 332 333 334 335 336
+ 337 338 339 340 341 342 343 344 345 346 347 348 349 350
+ 351 352 353 354 355 356 357 358 359 360 361 362 363 364
+ 365 366 367 368 369 370 371 372 373 374 375 376 377 378
+ 379 380 381 382 383 384 385 386 387 388 389 390 391 392
+ 393 394 395 396 397 398 399 400 401 402 403 404 405 406
+ 407 408 409 410 411 412 413 414 415 416 417 418 419 420
+ 421 422 423 424 425 426 427 428 429 430 431 432 433 434
+ 435 436 437 438 439 440 441 442 443 444 445 446 447 448
+ 449 450 451 452 453 454 455 456 457 458 459 460 461 462
+ 463 464 465 466 467 468 469 470 471 472 473 474 475 476
+ 477 478 479 480 481 482 483 484 485 486 487 488 489 490
+ 491 492 493 494 495 496 497 498 499 500 501 502 503 504
+ 505 506 507 508 509 510 511 512 513 514 515 516 517 518
+ 519 520 521 522 523 524 525 526 527 528 529 530 531 532
+ 533 534 535 536 537 538 539 540 541 542 543 544 545 546
+ 547 548 549 550 551 552 553 554 555 556 557 558 559 560
+ 561 562 563 564 565 566 567 568 569 570 571 572 573 574
+ 575 576 577 578 579 580 581 582 583 584 585 586 587 588
+ 589 590 591 592 593 594 595 596 597 598 599 600 601 602
+ 603 604 605 606 607 608 609 610 611 612 613 614 615 616
+ 617 618 619 620 621 622 623 624 625 626 627 628 629 630
+ 631 632 633 634 635 636 637 638 639 640 641 642 643 644
+ 645 646 647 648 649 650 651 652 653 654 655 656 657 658
+ 659 660 661 662 663 664 665 666 667 668 669 670 671 672
+ 673 674 675 676 677 678 679 680 681 682 683 684 685 686
+ 687 688 689 690 691 692 693 694 695 696 697 698 699 700
+ 701 702 703 704 705 706 707 708 709 710 711 712 713 714
+ 715 716 717 718 719 720 721 722 723 724 725 726 727 728
+ 729 730 731 732 733 734 735 736 737 738 739 740 741 742
+ 743 744 745 746 747 748 749 750 751 752 753 754 755 756
+ 757 758 759 760 761 762 763 764 765 766 767 768 769 770
+ 771 772 773 774 775 776 777 778 779 780 781 782 783 784
+ 785 786 787 788 789 790 791 792 793 794 795 796 797 798
+ 799 800 801 802 803 804 805 806 807 808 809 810 811 812
+ 813 814 815 816 817 818 819 820 821 822 823 824 825 826
+ 827 828 829 830 831 832 833 834 835 836 837 838 839 840
+ 841 842 843 844 845 846 847 848 849 850 851 852 853 854
+ 855 856 857 858 859 860 861 862 863 864 865 866 867 868
+ 869 870 871 872 873 874 875 876 877 878 879 880 881 882
+ 883 884 885 886 887 888 889 890 891 892 893 894 895 896
+ 897 898 899 900 901 902 903 904 905 906 907 908 909 910
+ 911 912 913 914 915 916 917 918 919 920 921 922 923 924
+ 925 926 927 928 929 930 931 932 933 934 935 936 937 938
+ 939 940 941 942 943 944 945 946 947 948 949 950 951 952
+ 953 954 955 956 957 958 959 960 961 962 963 964 965 966
+ 967 968 969 970 971 972 973 974 975 976 977 978 979 980
+ 981 982 983 984 985 986 987 988 989 990 991 992 993 994
+ 995 996 997 998 999 1000]]
+ System`RGBColor
+ System`Real 0.196078
+ System`Real 0.588235
+ System`Real 0.54902
+ System`AbsoluteThickness
+ System`Integer 4
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 1000×3]
+ [[ 0.00000000e+00 2.00000000e+00 0.00000000e+00]
+ [ 1.25788666e-02 1.99996044e+00 0.00000000e+00]
+ [ 2.51572357e-02 1.99984177e+00 0.00000000e+00]
+ ...
+ [-2.51572357e-02 1.99984177e+00 0.00000000e+00]
+ [-1.25788666e-02 1.99996044e+00 0.00000000e+00]
+ [-4.89858720e-16 2.00000000e+00 0.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 1×1000]
+ [[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+ 15 16 17 18 19 20 21 22 23 24 25 26 27 28
+ 29 30 31 32 33 34 35 36 37 38 39 40 41 42
+ 43 44 45 46 47 48 49 50 51 52 53 54 55 56
+ 57 58 59 60 61 62 63 64 65 66 67 68 69 70
+ 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+ 85 86 87 88 89 90 91 92 93 94 95 96 97 98
+ 99 100 101 102 103 104 105 106 107 108 109 110 111 112
+ 113 114 115 116 117 118 119 120 121 122 123 124 125 126
+ 127 128 129 130 131 132 133 134 135 136 137 138 139 140
+ 141 142 143 144 145 146 147 148 149 150 151 152 153 154
+ 155 156 157 158 159 160 161 162 163 164 165 166 167 168
+ 169 170 171 172 173 174 175 176 177 178 179 180 181 182
+ 183 184 185 186 187 188 189 190 191 192 193 194 195 196
+ 197 198 199 200 201 202 203 204 205 206 207 208 209 210
+ 211 212 213 214 215 216 217 218 219 220 221 222 223 224
+ 225 226 227 228 229 230 231 232 233 234 235 236 237 238
+ 239 240 241 242 243 244 245 246 247 248 249 250 251 252
+ 253 254 255 256 257 258 259 260 261 262 263 264 265 266
+ 267 268 269 270 271 272 273 274 275 276 277 278 279 280
+ 281 282 283 284 285 286 287 288 289 290 291 292 293 294
+ 295 296 297 298 299 300 301 302 303 304 305 306 307 308
+ 309 310 311 312 313 314 315 316 317 318 319 320 321 322
+ 323 324 325 326 327 328 329 330 331 332 333 334 335 336
+ 337 338 339 340 341 342 343 344 345 346 347 348 349 350
+ 351 352 353 354 355 356 357 358 359 360 361 362 363 364
+ 365 366 367 368 369 370 371 372 373 374 375 376 377 378
+ 379 380 381 382 383 384 385 386 387 388 389 390 391 392
+ 393 394 395 396 397 398 399 400 401 402 403 404 405 406
+ 407 408 409 410 411 412 413 414 415 416 417 418 419 420
+ 421 422 423 424 425 426 427 428 429 430 431 432 433 434
+ 435 436 437 438 439 440 441 442 443 444 445 446 447 448
+ 449 450 451 452 453 454 455 456 457 458 459 460 461 462
+ 463 464 465 466 467 468 469 470 471 472 473 474 475 476
+ 477 478 479 480 481 482 483 484 485 486 487 488 489 490
+ 491 492 493 494 495 496 497 498 499 500 501 502 503 504
+ 505 506 507 508 509 510 511 512 513 514 515 516 517 518
+ 519 520 521 522 523 524 525 526 527 528 529 530 531 532
+ 533 534 535 536 537 538 539 540 541 542 543 544 545 546
+ 547 548 549 550 551 552 553 554 555 556 557 558 559 560
+ 561 562 563 564 565 566 567 568 569 570 571 572 573 574
+ 575 576 577 578 579 580 581 582 583 584 585 586 587 588
+ 589 590 591 592 593 594 595 596 597 598 599 600 601 602
+ 603 604 605 606 607 608 609 610 611 612 613 614 615 616
+ 617 618 619 620 621 622 623 624 625 626 627 628 629 630
+ 631 632 633 634 635 636 637 638 639 640 641 642 643 644
+ 645 646 647 648 649 650 651 652 653 654 655 656 657 658
+ 659 660 661 662 663 664 665 666 667 668 669 670 671 672
+ 673 674 675 676 677 678 679 680 681 682 683 684 685 686
+ 687 688 689 690 691 692 693 694 695 696 697 698 699 700
+ 701 702 703 704 705 706 707 708 709 710 711 712 713 714
+ 715 716 717 718 719 720 721 722 723 724 725 726 727 728
+ 729 730 731 732 733 734 735 736 737 738 739 740 741 742
+ 743 744 745 746 747 748 749 750 751 752 753 754 755 756
+ 757 758 759 760 761 762 763 764 765 766 767 768 769 770
+ 771 772 773 774 775 776 777 778 779 780 781 782 783 784
+ 785 786 787 788 789 790 791 792 793 794 795 796 797 798
+ 799 800 801 802 803 804 805 806 807 808 809 810 811 812
+ 813 814 815 816 817 818 819 820 821 822 823 824 825 826
+ 827 828 829 830 831 832 833 834 835 836 837 838 839 840
+ 841 842 843 844 845 846 847 848 849 850 851 852 853 854
+ 855 856 857 858 859 860 861 862 863 864 865 866 867 868
+ 869 870 871 872 873 874 875 876 877 878 879 880 881 882
+ 883 884 885 886 887 888 889 890 891 892 893 894 895 896
+ 897 898 899 900 901 902 903 904 905 906 907 908 909 910
+ 911 912 913 914 915 916 917 918 919 920 921 922 923 924
+ 925 926 927 928 929 930 931 932 933 934 935 936 937 938
+ 939 940 941 942 943 944 945 946 947 948 949 950 951 952
+ 953 954 955 956 957 958 959 960 961 962 963 964 965 966
+ 967 968 969 970 971 972 973 974 975 976 977 978 979 980
+ 981 982 983 984 985 986 987 988 989 990 991 992 993 994
+ 995 996 997 998 999 1000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Real 0.4
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`Automatic
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-rings-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-rings-vec.txt
new file mode 100644
index 000000000..9c479dd67
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-rings-vec.txt
@@ -0,0 +1,366 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 6.00000000e+00 0.00000000e+00 0.00000000e+00]
+ [ 5.99700953e+00 1.89411299e-01 0.00000000e+00]
+ [ 5.98804112e+00 3.78633788e-01 0.00000000e+00]
+ ...
+ [ 5.98804112e+00 -3.78633788e-01 -2.44929360e-16]
+ [ 5.99700953e+00 -1.89411299e-01 -2.44929360e-16]
+ [ 6.00000000e+00 -1.46957616e-15 -2.44929360e-16]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Real 0.392157
+ System`Real 0.560784
+ System`Real 1.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 0.00000000e+00 0.00000000e+00 6.00000000e+00]
+ [ 1.89411299e-01 0.00000000e+00 5.99700953e+00]
+ [ 3.78633788e-01 0.00000000e+00 5.98804112e+00]
+ ...
+ [-3.78633788e-01 -2.44929360e-16 5.98804112e+00]
+ [-1.89411299e-01 -2.44929360e-16 5.99700953e+00]
+ [-1.46957616e-15 -2.44929360e-16 6.00000000e+00]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Real 0.862745
+ System`Real 0.14902
+ System`Real 0.498039
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 0.00000000e+00 6.00000000e+00 0.00000000e+00]
+ [ 0.00000000e+00 5.99700953e+00 1.89411299e-01]
+ [ 0.00000000e+00 5.98804112e+00 3.78633788e-01]
+ ...
+ [-2.44929360e-16 5.98804112e+00 -3.78633788e-01]
+ [-2.44929360e-16 5.99700953e+00 -1.89411299e-01]
+ [-2.44929360e-16 6.00000000e+00 -1.46957616e-15]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Integer 0
+ System`Integer 0
+ System`Integer 0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 6.00000000e+00 0.00000000e+00 0.00000000e+00]
+ [ 5.99700953e+00 1.89411299e-01 0.00000000e+00]
+ [ 5.98804112e+00 3.78633788e-01 0.00000000e+00]
+ ...
+ [ 5.98804112e+00 -3.78633788e-01 -2.44929360e-16]
+ [ 5.99700953e+00 -1.89411299e-01 -2.44929360e-16]
+ [ 6.00000000e+00 -1.46957616e-15 -2.44929360e-16]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 6.00000000e+00]
+ [ 1.89411299e-01 0.00000000e+00 5.99700953e+00]
+ [ 3.78633788e-01 0.00000000e+00 5.98804112e+00]
+ ...
+ [-3.78633788e-01 -2.44929360e-16 5.98804112e+00]
+ [-1.89411299e-01 -2.44929360e-16 5.99700953e+00]
+ [-1.46957616e-15 -2.44929360e-16 6.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 6.00000000e+00 0.00000000e+00]
+ [ 0.00000000e+00 5.99700953e+00 1.89411299e-01]
+ [ 0.00000000e+00 5.98804112e+00 3.78633788e-01]
+ ...
+ [-2.44929360e-16 5.98804112e+00 -3.78633788e-01]
+ [-2.44929360e-16 5.99700953e+00 -1.89411299e-01]
+ [-2.44929360e-16 6.00000000e+00 -1.46957616e-15]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 6.00000000e+00 0.00000000e+00 0.00000000e+00]
+ [ 5.67490345e+00 1.94819682e+00 0.00000000e+00]
+ [ 4.73484306e+00 3.68527628e+00 0.00000000e+00]
+ ...
+ [ 4.73484306e+00 -3.68527628e+00 -2.44929360e-16]
+ [ 5.67490345e+00 -1.94819682e+00 -2.44929360e-16]
+ [ 6.00000000e+00 -1.46957616e-15 -2.44929360e-16]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 6.00000000e+00]
+ [ 1.94819682e+00 0.00000000e+00 5.67490345e+00]
+ [ 3.68527628e+00 0.00000000e+00 4.73484306e+00]
+ ...
+ [-3.68527628e+00 -2.44929360e-16 4.73484306e+00]
+ [-1.94819682e+00 -2.44929360e-16 5.67490345e+00]
+ [-1.46957616e-15 -2.44929360e-16 6.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 6.00000000e+00 0.00000000e+00]
+ [ 0.00000000e+00 5.67490345e+00 1.94819682e+00]
+ [ 0.00000000e+00 4.73484306e+00 3.68527628e+00]
+ ...
+ [-2.44929360e-16 4.73484306e+00 -3.68527628e+00]
+ [-2.44929360e-16 5.67490345e+00 -1.94819682e+00]
+ [-2.44929360e-16 6.00000000e+00 -1.46957616e-15]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Integer 1
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`Automatic
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-torus-plotrange-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-torus-plotrange-vec.txt
new file mode 100644
index 000000000..d6ac1342b
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-torus-plotrange-vec.txt
@@ -0,0 +1,253 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 3.00000000e+00 0.00000000e+00 0.00000000e+00]
+ [ 2.99850477e+00 9.47056493e-02 0.00000000e+00]
+ [ 2.99402056e+00 1.89316894e-01 0.00000000e+00]
+ ...
+ [ 2.99402056e+00 -1.89316894e-01 -2.44929360e-16]
+ [ 2.99850477e+00 -9.47056493e-02 -2.44929360e-16]
+ [ 3.00000000e+00 -7.34788079e-16 -2.44929360e-16]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Integer 0
+ System`Integer 0
+ System`Integer 0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 3.00000000e+00 0.00000000e+00 0.00000000e+00]
+ [ 2.99850477e+00 9.47056493e-02 0.00000000e+00]
+ [ 2.99402056e+00 1.89316894e-01 0.00000000e+00]
+ ...
+ [ 2.99402056e+00 -1.89316894e-01 -2.44929360e-16]
+ [ 2.99850477e+00 -9.47056493e-02 -2.44929360e-16]
+ [ 3.00000000e+00 -7.34788079e-16 -2.44929360e-16]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 3.00000000e+00 0.00000000e+00 0.00000000e+00]
+ [ 2.83745173e+00 9.74098408e-01 0.00000000e+00]
+ [ 2.36742153e+00 1.84263814e+00 0.00000000e+00]
+ ...
+ [ 2.36742153e+00 -1.84263814e+00 -2.44929360e-16]
+ [ 2.83745173e+00 -9.74098408e-01 -2.44929360e-16]
+ [ 3.00000000e+00 -7.34788079e-16 -2.44929360e-16]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Real 0.4
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`List
+ System`Real 0.0
+ System`Real 3.0
+ System`List
+ System`Real 0.0
+ System`Real 3.0
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-torus-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-torus-vec.txt
new file mode 100644
index 000000000..29229bb83
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-torus-vec.txt
@@ -0,0 +1,250 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 3.00000000e+00 0.00000000e+00 0.00000000e+00]
+ [ 2.99850477e+00 9.47056493e-02 0.00000000e+00]
+ [ 2.99402056e+00 1.89316894e-01 0.00000000e+00]
+ ...
+ [ 2.99402056e+00 -1.89316894e-01 -2.44929360e-16]
+ [ 2.99850477e+00 -9.47056493e-02 -2.44929360e-16]
+ [ 3.00000000e+00 -7.34788079e-16 -2.44929360e-16]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Integer 0
+ System`Integer 0
+ System`Integer 0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 3.00000000e+00 0.00000000e+00 0.00000000e+00]
+ [ 2.99850477e+00 9.47056493e-02 0.00000000e+00]
+ [ 2.99402056e+00 1.89316894e-01 0.00000000e+00]
+ ...
+ [ 2.99402056e+00 -1.89316894e-01 -2.44929360e-16]
+ [ 2.99850477e+00 -9.47056493e-02 -2.44929360e-16]
+ [ 3.00000000e+00 -7.34788079e-16 -2.44929360e-16]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 3.00000000e+00 0.00000000e+00 0.00000000e+00]
+ [ 2.83745173e+00 9.74098408e-01 0.00000000e+00]
+ [ 2.36742153e+00 1.84263814e+00 0.00000000e+00]
+ ...
+ [ 2.36742153e+00 -1.84263814e+00 -2.44929360e-16]
+ [ 2.83745173e+00 -9.74098408e-01 -2.44929360e-16]
+ [ 3.00000000e+00 -7.34788079e-16 -2.44929360e-16]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Real 0.4
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`Automatic
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-trefoil-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-trefoil-vec.txt
new file mode 100644
index 000000000..30f8deed9
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-parametricplot3d-trefoil-vec.txt
@@ -0,0 +1,277 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 0.392157
+ System`Real 0.560784
+ System`Real 1.0
+ System`AbsoluteThickness
+ System`Integer 4
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 1000×3]
+ [[ 0.00000000e+00 -1.00000000e+00 -0.00000000e+00]
+ [ 3.14466690e-02 -9.99861551e-01 -1.88673048e-02]
+ [ 6.28891086e-02 -9.99446227e-01 -3.77278927e-02]
+ ...
+ [-6.28891086e-02 -9.99446227e-01 3.77278927e-02]
+ [-3.14466690e-02 -9.99861551e-01 1.88673048e-02]
+ [-1.22464680e-15 -1.00000000e+00 7.34788079e-16]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 1×1000]
+ [[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+ 15 16 17 18 19 20 21 22 23 24 25 26 27 28
+ 29 30 31 32 33 34 35 36 37 38 39 40 41 42
+ 43 44 45 46 47 48 49 50 51 52 53 54 55 56
+ 57 58 59 60 61 62 63 64 65 66 67 68 69 70
+ 71 72 73 74 75 76 77 78 79 80 81 82 83 84
+ 85 86 87 88 89 90 91 92 93 94 95 96 97 98
+ 99 100 101 102 103 104 105 106 107 108 109 110 111 112
+ 113 114 115 116 117 118 119 120 121 122 123 124 125 126
+ 127 128 129 130 131 132 133 134 135 136 137 138 139 140
+ 141 142 143 144 145 146 147 148 149 150 151 152 153 154
+ 155 156 157 158 159 160 161 162 163 164 165 166 167 168
+ 169 170 171 172 173 174 175 176 177 178 179 180 181 182
+ 183 184 185 186 187 188 189 190 191 192 193 194 195 196
+ 197 198 199 200 201 202 203 204 205 206 207 208 209 210
+ 211 212 213 214 215 216 217 218 219 220 221 222 223 224
+ 225 226 227 228 229 230 231 232 233 234 235 236 237 238
+ 239 240 241 242 243 244 245 246 247 248 249 250 251 252
+ 253 254 255 256 257 258 259 260 261 262 263 264 265 266
+ 267 268 269 270 271 272 273 274 275 276 277 278 279 280
+ 281 282 283 284 285 286 287 288 289 290 291 292 293 294
+ 295 296 297 298 299 300 301 302 303 304 305 306 307 308
+ 309 310 311 312 313 314 315 316 317 318 319 320 321 322
+ 323 324 325 326 327 328 329 330 331 332 333 334 335 336
+ 337 338 339 340 341 342 343 344 345 346 347 348 349 350
+ 351 352 353 354 355 356 357 358 359 360 361 362 363 364
+ 365 366 367 368 369 370 371 372 373 374 375 376 377 378
+ 379 380 381 382 383 384 385 386 387 388 389 390 391 392
+ 393 394 395 396 397 398 399 400 401 402 403 404 405 406
+ 407 408 409 410 411 412 413 414 415 416 417 418 419 420
+ 421 422 423 424 425 426 427 428 429 430 431 432 433 434
+ 435 436 437 438 439 440 441 442 443 444 445 446 447 448
+ 449 450 451 452 453 454 455 456 457 458 459 460 461 462
+ 463 464 465 466 467 468 469 470 471 472 473 474 475 476
+ 477 478 479 480 481 482 483 484 485 486 487 488 489 490
+ 491 492 493 494 495 496 497 498 499 500 501 502 503 504
+ 505 506 507 508 509 510 511 512 513 514 515 516 517 518
+ 519 520 521 522 523 524 525 526 527 528 529 530 531 532
+ 533 534 535 536 537 538 539 540 541 542 543 544 545 546
+ 547 548 549 550 551 552 553 554 555 556 557 558 559 560
+ 561 562 563 564 565 566 567 568 569 570 571 572 573 574
+ 575 576 577 578 579 580 581 582 583 584 585 586 587 588
+ 589 590 591 592 593 594 595 596 597 598 599 600 601 602
+ 603 604 605 606 607 608 609 610 611 612 613 614 615 616
+ 617 618 619 620 621 622 623 624 625 626 627 628 629 630
+ 631 632 633 634 635 636 637 638 639 640 641 642 643 644
+ 645 646 647 648 649 650 651 652 653 654 655 656 657 658
+ 659 660 661 662 663 664 665 666 667 668 669 670 671 672
+ 673 674 675 676 677 678 679 680 681 682 683 684 685 686
+ 687 688 689 690 691 692 693 694 695 696 697 698 699 700
+ 701 702 703 704 705 706 707 708 709 710 711 712 713 714
+ 715 716 717 718 719 720 721 722 723 724 725 726 727 728
+ 729 730 731 732 733 734 735 736 737 738 739 740 741 742
+ 743 744 745 746 747 748 749 750 751 752 753 754 755 756
+ 757 758 759 760 761 762 763 764 765 766 767 768 769 770
+ 771 772 773 774 775 776 777 778 779 780 781 782 783 784
+ 785 786 787 788 789 790 791 792 793 794 795 796 797 798
+ 799 800 801 802 803 804 805 806 807 808 809 810 811 812
+ 813 814 815 816 817 818 819 820 821 822 823 824 825 826
+ 827 828 829 830 831 832 833 834 835 836 837 838 839 840
+ 841 842 843 844 845 846 847 848 849 850 851 852 853 854
+ 855 856 857 858 859 860 861 862 863 864 865 866 867 868
+ 869 870 871 872 873 874 875 876 877 878 879 880 881 882
+ 883 884 885 886 887 888 889 890 891 892 893 894 895 896
+ 897 898 899 900 901 902 903 904 905 906 907 908 909 910
+ 911 912 913 914 915 916 917 918 919 920 921 922 923 924
+ 925 926 927 928 929 930 931 932 933 934 935 936 937 938
+ 939 940 941 942 943 944 945 946 947 948 949 950 951 952
+ 953 954 955 956 957 958 959 960 961 962 963 964 965 966
+ 967 968 969 970 971 972 973 974 975 976 977 978 979 980
+ 981 982 983 984 985 986 987 988 989 990 991 992 993 994
+ 995 996 997 998 999 1000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Real 0.4
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`Automatic
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-harmonics-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-harmonics-vec.txt
new file mode 100644
index 000000000..bd2c4736a
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-harmonics-vec.txt
@@ -0,0 +1,250 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]
+ [ 1.57862565e-02 0.00000000e+00 9.99876309e-01]
+ [ 3.15690122e-02 0.00000000e+00 9.99516232e-01]
+ ...
+ [ 3.15690122e-02 -7.73217796e-18 -9.99516232e-01]
+ [ 1.57862565e-02 -3.86651770e-18 -9.99876309e-01]
+ [ 1.22464680e-16 -2.99951957e-32 -1.00000000e+00]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Integer 0
+ System`Integer 0
+ System`Integer 0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]
+ [ 1.57862565e-02 0.00000000e+00 9.99876309e-01]
+ [ 3.15690122e-02 0.00000000e+00 9.99516232e-01]
+ ...
+ [ 3.15690122e-02 -7.73217796e-18 -9.99516232e-01]
+ [ 1.57862565e-02 -3.86651770e-18 -9.99876309e-01]
+ [ 1.22464680e-16 -2.99951957e-32 -1.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]
+ [ 1.66174628e-01 0.00000000e+00 9.95829949e-01]
+ [ 3.56414758e-01 0.00000000e+00 1.03820072e+00]
+ ...
+ [ 3.56414758e-01 -8.72964386e-17 -1.03820072e+00]
+ [ 1.66174628e-01 -4.07010452e-17 -9.95829949e-01]
+ [ 1.22464680e-16 -2.99951957e-32 -1.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Integer 1
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`Automatic
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-onion-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-onion-vec.txt
new file mode 100644
index 000000000..6903fb963
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-onion-vec.txt
@@ -0,0 +1,252 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 1.00000000e+00 0.00000000e+00 6.12323400e-17]
+ [ 9.99968847e-01 0.00000000e+00 -7.89336691e-03]
+ [ 9.99875390e-01 0.00000000e+00 -1.57862420e-02]
+ ...
+ [ 1.57862420e-02 -3.86651415e-18 -9.99875390e-01]
+ [ 7.89336691e-03 -1.93331730e-18 -9.99968847e-01]
+ [ 1.22464680e-16 -2.99951957e-32 -1.00000000e+00]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Integer 0
+ System`Integer 0
+ System`Integer 0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 1.00000000e+00 0.00000000e+00 6.12323400e-17]
+ [ 9.99968847e-01 0.00000000e+00 -7.89336691e-03]
+ [ 9.99875390e-01 0.00000000e+00 -1.57862420e-02]
+ ...
+ [ 1.57862420e-02 -3.86651415e-18 -9.99875390e-01]
+ [ 7.89336691e-03 -1.93331730e-18 -9.99968847e-01]
+ [ 1.22464680e-16 -2.99951957e-32 -1.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 2000×3]
+ [[ 1.00000000e+00 0.00000000e+00 6.12323400e-17]
+ [ 9.84807753e-01 0.00000000e+00 -1.73648178e-01]
+ [ 9.39692621e-01 0.00000000e+00 -3.42020143e-01]
+ ...
+ [ 3.42020143e-01 -8.37707748e-17 -9.39692621e-01]
+ [ 1.73648178e-01 -4.25315370e-17 -9.84807753e-01]
+ [ 1.22464680e-16 -2.99951957e-32 -1.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 10×200]
+ [[ 1 11 21 ... 1971 1981 1991]
+ [ 2 12 22 ... 1972 1982 1992]
+ [ 3 13 23 ... 1973 1983 1993]
+ ...
+ [ 8 18 28 ... 1978 1988 1998]
+ [ 9 19 29 ... 1979 1989 1999]
+ [ 10 20 30 ... 1980 1990 2000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Integer 1
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`List
+ System`Real -1.2
+ System`Real 1.0
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-orbital-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-orbital-vec.txt
new file mode 100644
index 000000000..82c906ad6
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-orbital-vec.txt
@@ -0,0 +1,250 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 0.00000000e+00 0.00000000e+00 3.00000000e+00]
+ [ 4.73429900e-02 0.00000000e+00 2.99862947e+00]
+ [ 9.45798078e-02 0.00000000e+00 2.99452046e+00]
+ ...
+ [ 9.45798078e-02 -2.31653718e-17 -2.99452046e+00]
+ [ 4.73429900e-02 -1.15956882e-17 -2.99862947e+00]
+ [ 3.67394040e-16 -8.99855870e-32 -3.00000000e+00]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Integer 0
+ System`Integer 0
+ System`Integer 0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 3.00000000e+00]
+ [ 4.73429900e-02 0.00000000e+00 2.99862947e+00]
+ [ 9.45798078e-02 0.00000000e+00 2.99452046e+00]
+ ...
+ [ 9.45798078e-02 -2.31653718e-17 -2.99452046e+00]
+ [ 4.73429900e-02 -1.15956882e-17 -2.99862947e+00]
+ [ 3.67394040e-16 -8.99855870e-32 -3.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 3.00000000e+00]
+ [ 4.75947393e-01 0.00000000e+00 2.85219636e+00]
+ [ 8.37166478e-01 0.00000000e+00 2.43858264e+00]
+ ...
+ [ 8.37166478e-01 -2.05046650e-16 -2.43858264e+00]
+ [ 4.75947393e-01 -1.16573490e-16 -2.85219636e+00]
+ [ 3.67394040e-16 -8.99855870e-32 -3.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Real 1.5
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`Automatic
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Integer 10
+ System`Integer -20
+ System`Integer 5
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-shells-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-shells-vec.txt
new file mode 100644
index 000000000..32653756f
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-shells-vec.txt
@@ -0,0 +1,366 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 0.00000000e+00 0.00000000e+00 3.00000000e+00]
+ [ 4.73587260e-02 0.00000000e+00 2.99962617e+00]
+ [ 9.47056493e-02 0.00000000e+00 2.99850477e+00]
+ ...
+ [-1.73971455e-17 -9.47056493e-02 -2.99850477e+00]
+ [-8.69965684e-18 -4.73587260e-02 -2.99962617e+00]
+ [-6.74891902e-32 -3.67394040e-16 -3.00000000e+00]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Real 0.392157
+ System`Real 0.560784
+ System`Real 1.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 0.00000000e+00 0.00000000e+00 2.00000000e+00]
+ [ 3.15724840e-02 0.00000000e+00 1.99975078e+00]
+ [ 6.31370995e-02 0.00000000e+00 1.99900318e+00]
+ ...
+ [-1.15980970e-17 -6.31370995e-02 -1.99900318e+00]
+ [-5.79977123e-18 -3.15724840e-02 -1.99975078e+00]
+ [-4.49927935e-32 -2.44929360e-16 -2.00000000e+00]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Real 0.862745
+ System`Real 0.14902
+ System`Real 0.498039
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]
+ [ 1.57862420e-02 0.00000000e+00 9.99875390e-01]
+ [ 3.15685498e-02 0.00000000e+00 9.99501589e-01]
+ ...
+ [-5.79904851e-18 -3.15685498e-02 -9.99501589e-01]
+ [-2.89988561e-18 -1.57862420e-02 -9.99875390e-01]
+ [-2.24963967e-32 -1.22464680e-16 -1.00000000e+00]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`RGBColor
+ System`Integer 0
+ System`Integer 0
+ System`Integer 0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 3.00000000e+00]
+ [ 4.73587260e-02 0.00000000e+00 2.99962617e+00]
+ [ 9.47056493e-02 0.00000000e+00 2.99850477e+00]
+ ...
+ [-1.73971455e-17 -9.47056493e-02 -2.99850477e+00]
+ [-8.69965684e-18 -4.73587260e-02 -2.99962617e+00]
+ [-6.74891902e-32 -3.67394040e-16 -3.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 2.00000000e+00]
+ [ 3.15724840e-02 0.00000000e+00 1.99975078e+00]
+ [ 6.31370995e-02 0.00000000e+00 1.99900318e+00]
+ ...
+ [-1.15980970e-17 -6.31370995e-02 -1.99900318e+00]
+ [-5.79977123e-18 -3.15724840e-02 -1.99975078e+00]
+ [-4.49927935e-32 -2.44929360e-16 -2.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]
+ [ 1.57862420e-02 0.00000000e+00 9.99875390e-01]
+ [ 3.15685498e-02 0.00000000e+00 9.99501589e-01]
+ ...
+ [-5.79904851e-18 -3.15685498e-02 -9.99501589e-01]
+ [-2.89988561e-18 -1.57862420e-02 -9.99875390e-01]
+ [-2.24963967e-32 -1.22464680e-16 -1.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 2 3 ... 198 199 200]
+ [ 201 202 203 ... 398 399 400]
+ [ 401 402 403 ... 598 599 600]
+ ...
+ [3401 3402 3403 ... 3598 3599 3600]
+ [3601 3602 3603 ... 3798 3799 3800]
+ [3801 3802 3803 ... 3998 3999 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 3.00000000e+00]
+ [ 4.93783771e-01 0.00000000e+00 2.95908391e+00]
+ [ 9.74098408e-01 0.00000000e+00 2.83745173e+00]
+ ...
+ [-1.78938975e-16 -9.74098408e-01 -2.83745173e+00]
+ [-9.07066072e-17 -4.93783771e-01 -2.95908391e+00]
+ [-6.74891902e-32 -3.67394040e-16 -3.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 2.00000000e+00]
+ [ 3.29189181e-01 0.00000000e+00 1.97272261e+00]
+ [ 6.49398938e-01 0.00000000e+00 1.89163448e+00]
+ ...
+ [-1.19292650e-16 -6.49398938e-01 -1.89163448e+00]
+ [-6.04710714e-17 -3.29189181e-01 -1.97272261e+00]
+ [-4.49927935e-32 -2.44929360e-16 -2.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 4000×3]
+ [[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]
+ [ 1.64594590e-01 0.00000000e+00 9.86361303e-01]
+ [ 3.24699469e-01 0.00000000e+00 9.45817242e-01]
+ ...
+ [-5.96463248e-17 -3.24699469e-01 -9.45817242e-01]
+ [-3.02355357e-17 -1.64594590e-01 -9.86361303e-01]
+ [-2.24963967e-32 -1.22464680e-16 -1.00000000e+00]]
+ System`Line
+ System`NumericArray NumericArray[Integer*, 20×200]
+ [[ 1 21 41 ... 3941 3961 3981]
+ [ 2 22 42 ... 3942 3962 3982]
+ [ 3 23 43 ... 3943 3963 3983]
+ ...
+ [ 18 38 58 ... 3958 3978 3998]
+ [ 19 39 59 ... 3959 3979 3999]
+ [ 20 40 60 ... 3960 3980 4000]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Integer 1
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`Automatic
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-spiral-vec.txt b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-spiral-vec.txt
new file mode 100644
index 000000000..2598b30c6
--- /dev/null
+++ b/test/builtin/drawing/test_plot_detail_ref/vec-sphericalplot3d-spiral-vec.txt
@@ -0,0 +1,210 @@
+System`Graphics3D
+ System`List
+ System`RGBColor
+ System`Real 1.0
+ System`Real 0.690196
+ System`Real 0.0
+ System`GraphicsComplex
+ System`NumericArray NumericArray[Real*, 40000×3]
+ [[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]
+ [ 1.62341599e-02 0.00000000e+00 1.02824580e+00]
+ [ 3.33519676e-02 0.00000000e+00 1.05596693e+00]
+ ...
+ [ 2.97851319e-02 -7.29525329e-18 -9.43036246e-01]
+ [ 1.53383241e-02 -3.75680590e-18 -9.71504983e-01]
+ [ 1.22464680e-16 -2.99951957e-32 -1.00000000e+00]]
+ System`Polygon
+ System`NumericArray NumericArray[Integer*, 39601×4]
+ [[ 1 2 202 201]
+ [ 201 202 402 401]
+ [ 401 402 602 601]
+ ...
+ [39399 39400 39600 39599]
+ [39599 39600 39800 39799]
+ [39799 39800 40000 39999]]
+ System`Rule
+ System`AlignmentPoint
+ System`Center
+ System`Rule
+ System`AspectRatio
+ System`Integer 1
+ System`Rule
+ System`Axes
+ System`True
+ System`Rule
+ System`AxesEdge
+ System`Automatic
+ System`Rule
+ System`AxesLabel
+ System`None
+ System`Rule
+ System`AxesOrigin
+ System`Automatic
+ System`Rule
+ System`AxesStyle
+ System`List
+ System`Rule
+ System`Background
+ System`Automatic
+ System`Rule
+ System`BaseStyle
+ System`List
+ System`Rule
+ System`BaselinePosition
+ System`Automatic
+ System`Rule
+ System`BoxRatios
+ System`List
+ System`Integer 1
+ System`Integer 1
+ System`Integer 1
+ System`Rule
+ System`BoxStyle
+ System`List
+ System`Rule
+ System`Boxed
+ System`True
+ System`Rule
+ System`ClipPlanes
+ System`None
+ System`Rule
+ System`ClipPlanesStyle
+ System`Automatic
+ System`Rule
+ System`ContentSelectable
+ System`Automatic
+ System`Rule
+ System`ControllerLinking
+ System`False
+ System`Rule
+ System`ControllerPath
+ System`Automatic
+ System`Rule
+ System`CoordinatesToolOptions
+ System`Automatic
+ System`Rule
+ System`Epilog
+ System`List
+ System`Rule
+ System`FaceGrids
+ System`None
+ System`Rule
+ System`FaceGridsStyle
+ System`List
+ System`Rule
+ System`FormatType
+ System`TraditionalForm
+ System`Rule
+ System`Frame
+ System`False
+ System`Rule
+ System`FrameLabel
+ System`None
+ System`Rule
+ System`FrameStyle
+ System`List
+ System`Rule
+ System`FrameTicks
+ System`Automatic
+ System`Rule
+ System`FrameTicksStyle
+ System`List
+ System`Rule
+ System`GridLines
+ System`None
+ System`Rule
+ System`GridLinesStyle
+ System`List
+ System`Rule
+ System`ImageMargins
+ System`Real 0.0
+ System`Rule
+ System`ImagePadding
+ System`All
+ System`Rule
+ System`ImageSize
+ System`Automatic
+ System`Rule
+ System`LabelStyle
+ System`List
+ System`Rule
+ System`Lighting
+ System`Automatic
+ System`Rule
+ System`LogPlot
+ System`False
+ System`Rule
+ System`Method
+ System`Automatic
+ System`Rule
+ System`PlotLabel
+ System`None
+ System`Rule
+ System`PlotRange
+ System`List
+ System`Automatic
+ System`Automatic
+ System`Automatic
+ System`Rule
+ System`PlotRangeClipping
+ System`False
+ System`Rule
+ System`PlotRangePadding
+ System`Automatic
+ System`Rule
+ System`PlotRegion
+ System`Automatic
+ System`Rule
+ System`PreserveImageOptions
+ System`Automatic
+ System`Rule
+ System`Prolog
+ System`List
+ System`Rule
+ System`RotateLabel
+ System`True
+ System`Rule
+ System`RotationAction
+ System`Fit
+ System`Rule
+ System`SphericalRegion
+ System`Automatic
+ System`Rule
+ System`Ticks
+ System`Automatic
+ System`Rule
+ System`TicksStyle
+ System`List
+ System`Rule
+ System`TouchscreenAutoZoom
+ System`False
+ System`Rule
+ System`ViewAngle
+ System`Automatic
+ System`Rule
+ System`ViewCenter
+ System`Automatic
+ System`Rule
+ System`ViewMatrix
+ System`Automatic
+ System`Rule
+ System`ViewPoint
+ System`List
+ System`Real 1.3
+ System`Real -2.4
+ System`Real 2.0
+ System`Rule
+ System`ViewProjection
+ System`Automatic
+ System`Rule
+ System`ViewRange
+ System`All
+ System`Rule
+ System`ViewVector
+ System`Automatic
+ System`Rule
+ System`ViewVertical
+ System`List
+ System`Integer 0
+ System`Integer 0
+ System`Integer 1
diff --git a/test/builtin/drawing/vec_tests.yaml b/test/builtin/drawing/vec_tests.yaml
index 976423075..6025a2a56 100644
--- a/test/builtin/drawing/vec_tests.yaml
+++ b/test/builtin/drawing/vec_tests.yaml
@@ -65,6 +65,58 @@ vec-parametricplot-zeta-sideways:
]
'
#
+# ParametricPlot3D
+#
+vec-parametricplot3d-trefoil:
+ expr: ParametricPlot3D[{Sin[t] + 2 Sin[2 t], Cos[t] - 2 Cos[2 t], -Sin[3 t]}, {t, 0, 2 Pi}]
+vec-parametricplot3d-multi:
+ expr: '
+ ParametricPlot3D[
+ {{Sin[t] + 2 Sin[2 t], Cos[t] - 2 Cos[2 t], -Sin[3 t]},
+ {2 Sin[t], 2 Cos[t], Sin[40 t]},
+ {2 Sin[t], 2 Cos[t], 0}},
+ {t, 0, 2 Pi}
+ ]
+ '
+vec-parametricplot3d-torus:
+ expr: '
+ ParametricPlot3D[
+ {(2 + Cos[v]) Cos[u], (2 + Cos[v]) Sin[u], Sin[v]},
+ {u, 0, 2 Pi}, {v, 0, 2 Pi}
+ ]
+ '
+vec-parametricplot3d-torus-plotrange:
+ expr: '
+ ParametricPlot3D[
+ {(2 + Cos[v]) Cos[u], (2 + Cos[v]) Sin[u], Sin[v]},
+ {u, 0, 2 Pi}, {v, 0, 2 Pi},
+ PlotRange -> {{0,3},{0,3}}
+ ]
+ '
+vec-parametricplot3d-rings:
+ expr: '
+ Module[{R, r, x, y, z},
+ R=5; r=1;
+ x = (R + r Cos[v]) Cos[u];
+ y = (R + r Cos[v]) Sin[u];
+ z = r Sin[v];
+ ParametricPlot3D[
+ {{x, y, z}, {y, z, x}, {z, x, y}},
+ {u, 0, 2 Pi}, {v, 0, 2 Pi}, BoxRatios->{1,1,1}
+ ]
+ ]
+ '
+vec-parametricplot3d-moebius:
+ expr: '
+ ParametricPlot3D[
+ {(1 + (v/2) Cos[u/2]) Cos[u],
+ (1 + (v/2) Cos[u/2]) Sin[u],
+ (v/2) Sin[u/2]},
+ {u, 0, 2 Pi}, {v, -1, 1},
+ Mesh -> {15, 5}
+ ]
+ '
+#
# Plot
#
vec-plot-exclusions:
@@ -105,6 +157,19 @@ vec-plot3d-stack:
vec-polarplot-theataxxx-8:
expr: PolarPlot[1+0.5 Cos[3 θ],{θ,0,2 Pi}]
#
+# SphericalPlot3D
+#
+vec-sphericalplot3d-harmonics:
+ expr: SphericalPlot3D[1 + 0.4 Abs[SphericalHarmonicY[10, 4, θ, φ]], θ, φ]
+vec-sphericalplot3d-spiral:
+ expr: SphericalPlot3D[1 + 0.3 Sin[6 θ + 4 φ], {θ, 0, Pi}, {φ, 0, 2 Pi}, Mesh -> None]
+vec-sphericalplot3d-orbital:
+ expr: SphericalPlot3D[1 + 2 Cos[2 θ], θ, φ, BoxRatios->{1,1,1.5}, ViewPoint->{10,-20,5}]
+vec-sphericalplot3d-shells:
+ expr: SphericalPlot3D[{3, 2, 1}, {θ, 0, π}, {φ, 0, 3π/2}]
+vec-sphericalplot3d-onion:
+ expr: SphericalPlot3D[1 + Sin[5φ] / 5, {θ, π/2, π}, φ, PlotRange->{Automatic,Automatic,{-1.2,1}}, Mesh->{10,20}]
+#
# Following is a curated subset of doc_tests.yaml that have vectorized implementation.
# Culled to remove repetitive tests.
# If the switch is flipped in doc_tests.yaml so that it does vectorized tests on everything