pub struct Mesh3D { /* private fields */ }
Expand description
A structure representing a 3D mesh plot.
The Mesh3D
struct is designed to create and customize 3D mesh visualizations
with support for explicit triangulation, intensity-based coloring, and various
lighting effects. It can handle both auto-triangulated point clouds and
explicitly defined mesh connectivity through triangle indices.
§Arguments
data
- A reference to theDataFrame
containing the mesh data.x
- A string slice specifying the column name for x-axis vertex coordinates.y
- A string slice specifying the column name for y-axis vertex coordinates.z
- A string slice specifying the column name for z-axis vertex coordinates.i
- An optional string slice specifying the column name for first vertex indices of triangles.j
- An optional string slice specifying the column name for second vertex indices of triangles.k
- An optional string slice specifying the column name for third vertex indices of triangles.intensity
- An optional string slice specifying the column name for intensity values used in gradient coloring.intensity_mode
- An optionalIntensityMode
specifying whether intensity applies to vertices or cells.color
- An optionalRgb
value for uniform mesh coloring.color_bar
- An optional reference to aColorBar
for customizing the color legend.color_scale
- An optionalPalette
defining the color gradient for intensity mapping.reverse_scale
- An optional boolean to reverse the color scale direction.show_scale
- An optional boolean to show/hide the color bar.opacity
- An optionalf64
value specifying mesh transparency (range: 0.0 to 1.0).flat_shading
- An optional boolean for angular (true) vs smooth (false) shading.lighting
- An optional reference to aLighting
struct for custom lighting settings.light_position
- An optional tuple(x, y, z)
specifying the light source position.delaunay_axis
- An optional string specifying the axis for Delaunay triangulation (“x”, “y”, or “z”).contour
- An optional boolean to enable contour lines on the mesh.plot_title
- An optionalText
struct specifying the plot title.x_title
- An optionalText
struct for the x-axis title.y_title
- An optionalText
struct for the y-axis title.z_title
- An optionalText
struct for the z-axis title.legend
- An optional reference to aLegend
struct for legend customization.
§Example
use plotlars::{Lighting, Mesh3D, Plot, Rgb, Text};
use polars::prelude::*;
let mut x = Vec::new();
let mut y = Vec::new();
let mut z = Vec::new();
let n = 20;
for i in 0..n {
for j in 0..n {
let xi = (i as f64 / (n - 1) as f64) * 2.0 - 1.0;
let yj = (j as f64 / (n - 1) as f64) * 2.0 - 1.0;
x.push(xi);
y.push(yj);
z.push(0.3 * ((xi * 3.0).sin() + (yj * 3.0).cos()));
}
}
let dataset = DataFrame::new(vec![
Column::new("x".into(), x),
Column::new("y".into(), y),
Column::new("z".into(), z),
])
.unwrap();
Mesh3D::builder()
.data(&dataset)
.x("x")
.y("y")
.z("z")
.color(Rgb(200, 200, 255))
.lighting(
&Lighting::new()
.ambient(0.5)
.diffuse(0.8)
.specular(0.5)
.roughness(0.2)
.fresnel(0.2),
)
.light_position((1, 1, 2))
.opacity(1.0)
.flat_shading(false)
.contour(true)
.plot_title(
Text::from("Wavy Surface with Custom Lighting")
.font("Arial")
.size(22),
)
.build()
.plot();
Implementations§
Source§impl Mesh3D
impl Mesh3D
Sourcepub fn builder<'f1, 'f2, 'f3, 'f4, 'f5, 'f6, 'f7, 'f8, 'f9, 'f10, 'f11, 'f12>() -> Mesh3DBuilder<'f1, 'f2, 'f3, 'f4, 'f5, 'f6, 'f7, 'f8, 'f9, 'f10, 'f11, 'f12>
pub fn builder<'f1, 'f2, 'f3, 'f4, 'f5, 'f6, 'f7, 'f8, 'f9, 'f10, 'f11, 'f12>() -> Mesh3DBuilder<'f1, 'f2, 'f3, 'f4, 'f5, 'f6, 'f7, 'f8, 'f9, 'f10, 'f11, 'f12>
Examples found in repository?
examples/mesh3d.rs (line 23)
11fn example_basic_mesh() {
12 let x = vec![0.0, 1.0, 2.0, 0.0, 1.0, 2.0];
13 let y = vec![0.0, 0.0, 0.0, 1.0, 1.0, 1.0];
14 let z = vec![0.0, 0.5, 0.0, 0.0, 0.8, 0.0];
15
16 let dataset = DataFrame::new(vec![
17 Column::new("x".into(), x),
18 Column::new("y".into(), y),
19 Column::new("z".into(), z),
20 ])
21 .unwrap();
22
23 Mesh3D::builder()
24 .data(&dataset)
25 .x("x")
26 .y("y")
27 .z("z")
28 .color(Rgb(100, 150, 200))
29 .opacity(0.8)
30 .plot_title("Basic Mesh3D")
31 .build()
32 .plot();
33}
34
35fn example_with_indices() {
36 let x = vec![0.0, 1.0, 0.5, 0.5];
37 let y = vec![0.0, 0.0, 0.866, 0.289];
38 let z = vec![0.0, 0.0, 0.0, 0.816];
39 let i = vec![0, 0, 0, 1];
40 let j = vec![1, 2, 3, 2];
41 let k = vec![2, 3, 1, 3];
42
43 let dataset = DataFrame::new(vec![
44 Column::new("x".into(), x),
45 Column::new("y".into(), y),
46 Column::new("z".into(), z),
47 Column::new("i".into(), i),
48 Column::new("j".into(), j),
49 Column::new("k".into(), k),
50 ])
51 .unwrap();
52
53 Mesh3D::builder()
54 .data(&dataset)
55 .x("x")
56 .y("y")
57 .z("z")
58 .i("i")
59 .j("j")
60 .k("k")
61 .color(Rgb(255, 100, 100))
62 .opacity(0.9)
63 .flat_shading(true)
64 .plot_title("Tetrahedron with Explicit Indices")
65 .build()
66 .plot();
67}
68
69fn example_with_intensity() {
70 let mut x = Vec::new();
71 let mut y = Vec::new();
72 let mut z = Vec::new();
73 let mut intensity = Vec::new();
74
75 for i in 0..10 {
76 for j in 0..10 {
77 let xi = i as f64 * 0.1;
78 let yj = j as f64 * 0.1;
79 x.push(xi);
80 y.push(yj);
81 z.push(
82 (xi * 2.0 * std::f64::consts::PI).sin()
83 * (yj * 2.0 * std::f64::consts::PI).cos()
84 * 0.3,
85 );
86 intensity.push(xi * yj);
87 }
88 }
89
90 let dataset = DataFrame::new(vec![
91 Column::new("x".into(), x),
92 Column::new("y".into(), y),
93 Column::new("z".into(), z),
94 Column::new("intensity".into(), intensity),
95 ])
96 .unwrap();
97
98 Mesh3D::builder()
99 .data(&dataset)
100 .x("x")
101 .y("y")
102 .z("z")
103 .intensity("intensity")
104 .intensity_mode(IntensityMode::Vertex)
105 .color_scale(Palette::Viridis)
106 .reverse_scale(false)
107 .show_scale(true)
108 .color_bar(
109 &ColorBar::new()
110 .x(0.85) // Move color bar very close to the plot
111 .title("Intensity"),
112 )
113 .opacity(0.95)
114 .plot_title(
115 Text::from("Mesh3D with Intensity Coloring")
116 .font("Arial")
117 .size(20),
118 )
119 .build()
120 .plot();
121}
122
123fn example_with_lighting() {
124 // Create a simple wavy surface mesh without explicit indices
125 // The mesh will be auto-triangulated
126 let mut x = Vec::new();
127 let mut y = Vec::new();
128 let mut z = Vec::new();
129
130 let n = 20;
131 for i in 0..n {
132 for j in 0..n {
133 let xi = (i as f64 / (n - 1) as f64) * 2.0 - 1.0;
134 let yj = (j as f64 / (n - 1) as f64) * 2.0 - 1.0;
135 x.push(xi);
136 y.push(yj);
137 // Create a wavy surface
138 z.push(0.3 * ((xi * 3.0).sin() + (yj * 3.0).cos()));
139 }
140 }
141
142 let dataset = DataFrame::new(vec![
143 Column::new("x".into(), x),
144 Column::new("y".into(), y),
145 Column::new("z".into(), z),
146 ])
147 .unwrap();
148
149 Mesh3D::builder()
150 .data(&dataset)
151 .x("x")
152 .y("y")
153 .z("z")
154 .color(Rgb(200, 200, 255))
155 .lighting(
156 &Lighting::new()
157 .ambient(0.5)
158 .diffuse(0.8)
159 .specular(0.5)
160 .roughness(0.2)
161 .fresnel(0.2),
162 )
163 .light_position((1, 1, 2))
164 .opacity(1.0)
165 .flat_shading(false)
166 .contour(true)
167 .plot_title(
168 Text::from("Wavy Surface with Custom Lighting")
169 .font("Arial")
170 .size(22),
171 )
172 .build()
173 .plot();
174}
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Mesh3D
impl !RefUnwindSafe for Mesh3D
impl !Send for Mesh3D
impl !Sync for Mesh3D
impl Unpin for Mesh3D
impl !UnwindSafe for Mesh3D
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more