pub struct Lighting {
pub position: Option<[i32; 3]>,
pub ambient: Option<f64>,
pub diffuse: Option<f64>,
pub fresnel: Option<f64>,
pub roughness: Option<f64>,
pub specular: Option<f64>,
}Expand description
A structure describing the lighting model.
§Example
use ndarray::Array;
use plotlars::{ColorBar, Lighting, Palette, Plot, SurfacePlot, Text};
use polars::prelude::*;
use std::iter;
let n: usize = 100;
let x_base: Vec<f64> = Array::linspace(-10.0, 10.0, n).into_raw_vec();
let y_base: Vec<f64> = Array::linspace(-10.0, 10.0, n).into_raw_vec();
let x = x_base
.iter()
.flat_map(|&xi| iter::repeat(xi).take(n))
.collect::<Vec<_>>();
let y = y_base
.iter()
.cycle()
.take(n * n)
.cloned()
.collect::<Vec<_>>();
let z = x_base
.iter()
.map(|i| {
y_base
.iter()
.map(|j| 1.0 / (j * j + 5.0) * j.sin() + 1.0 / (i * i + 5.0) * i.cos())
.collect::<Vec<_>>()
})
.flatten()
.collect::<Vec<_>>();
let dataset = df![
"x" => &x,
"y" => &y,
"z" => &z,
]
.unwrap();
SurfacePlot::builder()
.data(&dataset)
.x("x")
.y("y")
.z("z")
.plot_title(
Text::from("Surface Plot")
.font("Arial")
.size(18),
)
.color_bar(
&ColorBar::new()
.border_width(1),
)
.color_scale(Palette::Cividis)
.reverse_scale(true)
.lighting(
&Lighting::new()
.position(1, 0, 0)
.ambient(1.0)
.diffuse(1.0)
.fresnel(1.0)
.roughness(1.0)
.specular(1.0),
)
.opacity(0.5)
.build()
.plot();
Fields§
§position: Option<[i32; 3]>§ambient: Option<f64>§diffuse: Option<f64>§fresnel: Option<f64>§roughness: Option<f64>§specular: Option<f64>Implementations§
Source§impl Lighting
impl Lighting
Sourcepub fn new() -> Lighting
pub fn new() -> Lighting
Creates a new Lighting instance with default values.
Examples found in repository?
examples/plotly_mesh3d.rs (line 164)
128fn example_with_lighting() {
129 // Create a simple wavy surface mesh without explicit indices
130 // The mesh will be auto-triangulated
131 let mut x = Vec::new();
132 let mut y = Vec::new();
133 let mut z = Vec::new();
134
135 let n = 20;
136 for i in 0..n {
137 for j in 0..n {
138 let xi = (i as f64 / (n - 1) as f64) * 2.0 - 1.0;
139 let yj = (j as f64 / (n - 1) as f64) * 2.0 - 1.0;
140 x.push(xi);
141 y.push(yj);
142 // Create a wavy surface
143 z.push(0.3 * ((xi * 3.0).sin() + (yj * 3.0).cos()));
144 }
145 }
146
147 let dataset = DataFrame::new(
148 x.len(),
149 vec![
150 Column::new("x".into(), x),
151 Column::new("y".into(), y),
152 Column::new("z".into(), z),
153 ],
154 )
155 .unwrap();
156
157 Mesh3D::builder()
158 .data(&dataset)
159 .x("x")
160 .y("y")
161 .z("z")
162 .color(Rgb(200, 200, 255))
163 .lighting(
164 &Lighting::new()
165 .ambient(0.5)
166 .diffuse(0.8)
167 .specular(0.5)
168 .roughness(0.2)
169 .fresnel(0.2),
170 )
171 .light_position((1, 1, 2))
172 .opacity(1.0)
173 .flat_shading(false)
174 .contour(true)
175 .plot_title(Text::from("Mesh 3D").font("Arial").size(22))
176 .build()
177 .plot();
178}More examples
examples/plotly_faceting.rs (line 334)
292fn mesh3d_example() {
293 let mut x_vals = Vec::new();
294 let mut y_vals = Vec::new();
295 let mut z_vals = Vec::new();
296 let mut surface_type = Vec::new();
297
298 let n = 25;
299
300 for surface in ["Gaussian", "Saddle", "Ripple"].iter() {
301 for i in 0..n {
302 for j in 0..n {
303 let x = (i as f64 / (n - 1) as f64) * 4.0 - 2.0;
304 let y = (j as f64 / (n - 1) as f64) * 4.0 - 2.0;
305
306 let z = match *surface {
307 "Gaussian" => (-0.5 * (x * x + y * y)).exp(),
308 "Saddle" => 0.3 * (x * x - y * y),
309 "Ripple" => 0.4 * ((x * 3.0).sin() + (y * 3.0).cos()),
310 _ => 0.0,
311 };
312
313 x_vals.push(x);
314 y_vals.push(y);
315 z_vals.push(z);
316 surface_type.push(surface.to_string());
317 }
318 }
319 }
320
321 let dataset = DataFrame::new(
322 x_vals.len(),
323 vec![
324 Column::new("x".into(), x_vals),
325 Column::new("y".into(), y_vals),
326 Column::new("z".into(), z_vals),
327 Column::new("surface_type".into(), surface_type),
328 ],
329 )
330 .unwrap();
331
332 let config = FacetConfig::new().cols(3).rows(1);
333
334 let lighting = Lighting::new().ambient(0.6).diffuse(0.8).specular(0.4);
335
336 Mesh3D::builder()
337 .data(&dataset)
338 .x("x")
339 .y("y")
340 .z("z")
341 .facet("surface_type")
342 .facet_config(&config)
343 .color(Rgb(100, 150, 200))
344 .lighting(&lighting)
345 .plot_title(
346 Text::from("Mathematical Surfaces Comparison")
347 .font("Arial")
348 .size(20),
349 )
350 .build()
351 .plot();
352}Sourcepub fn position(self, x: i32, y: i32, z: i32) -> Lighting
pub fn position(self, x: i32, y: i32, z: i32) -> Lighting
Sets the position of the virtual light source.
§Arguments
x– Ani32value representing the x‑coordinate of the light.y– Ani32value representing the y‑coordinate of the light.z– Ani32value representing the z‑coordinate of the light (positive z points toward the viewer).
Sourcepub fn ambient(self, value: f64) -> Lighting
pub fn ambient(self, value: f64) -> Lighting
Sets the ambient light component.
§Arguments
value– Af64value in the range 0.0 – 1.0 specifying the uniform tint strength.
Examples found in repository?
examples/plotly_mesh3d.rs (line 165)
128fn example_with_lighting() {
129 // Create a simple wavy surface mesh without explicit indices
130 // The mesh will be auto-triangulated
131 let mut x = Vec::new();
132 let mut y = Vec::new();
133 let mut z = Vec::new();
134
135 let n = 20;
136 for i in 0..n {
137 for j in 0..n {
138 let xi = (i as f64 / (n - 1) as f64) * 2.0 - 1.0;
139 let yj = (j as f64 / (n - 1) as f64) * 2.0 - 1.0;
140 x.push(xi);
141 y.push(yj);
142 // Create a wavy surface
143 z.push(0.3 * ((xi * 3.0).sin() + (yj * 3.0).cos()));
144 }
145 }
146
147 let dataset = DataFrame::new(
148 x.len(),
149 vec![
150 Column::new("x".into(), x),
151 Column::new("y".into(), y),
152 Column::new("z".into(), z),
153 ],
154 )
155 .unwrap();
156
157 Mesh3D::builder()
158 .data(&dataset)
159 .x("x")
160 .y("y")
161 .z("z")
162 .color(Rgb(200, 200, 255))
163 .lighting(
164 &Lighting::new()
165 .ambient(0.5)
166 .diffuse(0.8)
167 .specular(0.5)
168 .roughness(0.2)
169 .fresnel(0.2),
170 )
171 .light_position((1, 1, 2))
172 .opacity(1.0)
173 .flat_shading(false)
174 .contour(true)
175 .plot_title(Text::from("Mesh 3D").font("Arial").size(22))
176 .build()
177 .plot();
178}More examples
examples/plotly_faceting.rs (line 334)
292fn mesh3d_example() {
293 let mut x_vals = Vec::new();
294 let mut y_vals = Vec::new();
295 let mut z_vals = Vec::new();
296 let mut surface_type = Vec::new();
297
298 let n = 25;
299
300 for surface in ["Gaussian", "Saddle", "Ripple"].iter() {
301 for i in 0..n {
302 for j in 0..n {
303 let x = (i as f64 / (n - 1) as f64) * 4.0 - 2.0;
304 let y = (j as f64 / (n - 1) as f64) * 4.0 - 2.0;
305
306 let z = match *surface {
307 "Gaussian" => (-0.5 * (x * x + y * y)).exp(),
308 "Saddle" => 0.3 * (x * x - y * y),
309 "Ripple" => 0.4 * ((x * 3.0).sin() + (y * 3.0).cos()),
310 _ => 0.0,
311 };
312
313 x_vals.push(x);
314 y_vals.push(y);
315 z_vals.push(z);
316 surface_type.push(surface.to_string());
317 }
318 }
319 }
320
321 let dataset = DataFrame::new(
322 x_vals.len(),
323 vec![
324 Column::new("x".into(), x_vals),
325 Column::new("y".into(), y_vals),
326 Column::new("z".into(), z_vals),
327 Column::new("surface_type".into(), surface_type),
328 ],
329 )
330 .unwrap();
331
332 let config = FacetConfig::new().cols(3).rows(1);
333
334 let lighting = Lighting::new().ambient(0.6).diffuse(0.8).specular(0.4);
335
336 Mesh3D::builder()
337 .data(&dataset)
338 .x("x")
339 .y("y")
340 .z("z")
341 .facet("surface_type")
342 .facet_config(&config)
343 .color(Rgb(100, 150, 200))
344 .lighting(&lighting)
345 .plot_title(
346 Text::from("Mathematical Surfaces Comparison")
347 .font("Arial")
348 .size(20),
349 )
350 .build()
351 .plot();
352}Sourcepub fn diffuse(self, value: f64) -> Lighting
pub fn diffuse(self, value: f64) -> Lighting
Sets the diffuse light component.
§Arguments
value– Af64value in the range 0.0 – 1.0 specifying the Lambertian reflection strength.
Examples found in repository?
examples/plotly_mesh3d.rs (line 166)
128fn example_with_lighting() {
129 // Create a simple wavy surface mesh without explicit indices
130 // The mesh will be auto-triangulated
131 let mut x = Vec::new();
132 let mut y = Vec::new();
133 let mut z = Vec::new();
134
135 let n = 20;
136 for i in 0..n {
137 for j in 0..n {
138 let xi = (i as f64 / (n - 1) as f64) * 2.0 - 1.0;
139 let yj = (j as f64 / (n - 1) as f64) * 2.0 - 1.0;
140 x.push(xi);
141 y.push(yj);
142 // Create a wavy surface
143 z.push(0.3 * ((xi * 3.0).sin() + (yj * 3.0).cos()));
144 }
145 }
146
147 let dataset = DataFrame::new(
148 x.len(),
149 vec![
150 Column::new("x".into(), x),
151 Column::new("y".into(), y),
152 Column::new("z".into(), z),
153 ],
154 )
155 .unwrap();
156
157 Mesh3D::builder()
158 .data(&dataset)
159 .x("x")
160 .y("y")
161 .z("z")
162 .color(Rgb(200, 200, 255))
163 .lighting(
164 &Lighting::new()
165 .ambient(0.5)
166 .diffuse(0.8)
167 .specular(0.5)
168 .roughness(0.2)
169 .fresnel(0.2),
170 )
171 .light_position((1, 1, 2))
172 .opacity(1.0)
173 .flat_shading(false)
174 .contour(true)
175 .plot_title(Text::from("Mesh 3D").font("Arial").size(22))
176 .build()
177 .plot();
178}More examples
examples/plotly_faceting.rs (line 334)
292fn mesh3d_example() {
293 let mut x_vals = Vec::new();
294 let mut y_vals = Vec::new();
295 let mut z_vals = Vec::new();
296 let mut surface_type = Vec::new();
297
298 let n = 25;
299
300 for surface in ["Gaussian", "Saddle", "Ripple"].iter() {
301 for i in 0..n {
302 for j in 0..n {
303 let x = (i as f64 / (n - 1) as f64) * 4.0 - 2.0;
304 let y = (j as f64 / (n - 1) as f64) * 4.0 - 2.0;
305
306 let z = match *surface {
307 "Gaussian" => (-0.5 * (x * x + y * y)).exp(),
308 "Saddle" => 0.3 * (x * x - y * y),
309 "Ripple" => 0.4 * ((x * 3.0).sin() + (y * 3.0).cos()),
310 _ => 0.0,
311 };
312
313 x_vals.push(x);
314 y_vals.push(y);
315 z_vals.push(z);
316 surface_type.push(surface.to_string());
317 }
318 }
319 }
320
321 let dataset = DataFrame::new(
322 x_vals.len(),
323 vec![
324 Column::new("x".into(), x_vals),
325 Column::new("y".into(), y_vals),
326 Column::new("z".into(), z_vals),
327 Column::new("surface_type".into(), surface_type),
328 ],
329 )
330 .unwrap();
331
332 let config = FacetConfig::new().cols(3).rows(1);
333
334 let lighting = Lighting::new().ambient(0.6).diffuse(0.8).specular(0.4);
335
336 Mesh3D::builder()
337 .data(&dataset)
338 .x("x")
339 .y("y")
340 .z("z")
341 .facet("surface_type")
342 .facet_config(&config)
343 .color(Rgb(100, 150, 200))
344 .lighting(&lighting)
345 .plot_title(
346 Text::from("Mathematical Surfaces Comparison")
347 .font("Arial")
348 .size(20),
349 )
350 .build()
351 .plot();
352}Sourcepub fn fresnel(self, value: f64) -> Lighting
pub fn fresnel(self, value: f64) -> Lighting
Sets the Fresnel (edge brightness) component.
§Arguments
value– Af64value in the range 0.0 – 1.0 specifying the rim‑light intensity.
Examples found in repository?
examples/plotly_mesh3d.rs (line 169)
128fn example_with_lighting() {
129 // Create a simple wavy surface mesh without explicit indices
130 // The mesh will be auto-triangulated
131 let mut x = Vec::new();
132 let mut y = Vec::new();
133 let mut z = Vec::new();
134
135 let n = 20;
136 for i in 0..n {
137 for j in 0..n {
138 let xi = (i as f64 / (n - 1) as f64) * 2.0 - 1.0;
139 let yj = (j as f64 / (n - 1) as f64) * 2.0 - 1.0;
140 x.push(xi);
141 y.push(yj);
142 // Create a wavy surface
143 z.push(0.3 * ((xi * 3.0).sin() + (yj * 3.0).cos()));
144 }
145 }
146
147 let dataset = DataFrame::new(
148 x.len(),
149 vec![
150 Column::new("x".into(), x),
151 Column::new("y".into(), y),
152 Column::new("z".into(), z),
153 ],
154 )
155 .unwrap();
156
157 Mesh3D::builder()
158 .data(&dataset)
159 .x("x")
160 .y("y")
161 .z("z")
162 .color(Rgb(200, 200, 255))
163 .lighting(
164 &Lighting::new()
165 .ambient(0.5)
166 .diffuse(0.8)
167 .specular(0.5)
168 .roughness(0.2)
169 .fresnel(0.2),
170 )
171 .light_position((1, 1, 2))
172 .opacity(1.0)
173 .flat_shading(false)
174 .contour(true)
175 .plot_title(Text::from("Mesh 3D").font("Arial").size(22))
176 .build()
177 .plot();
178}Sourcepub fn roughness(self, value: f64) -> Lighting
pub fn roughness(self, value: f64) -> Lighting
Sets the roughness of the material.
§Arguments
value– Af64value in the range 0.0 – 1.0 that controls highlight width (0.0 = glossy, 1.0 = matte).
Examples found in repository?
examples/plotly_mesh3d.rs (line 168)
128fn example_with_lighting() {
129 // Create a simple wavy surface mesh without explicit indices
130 // The mesh will be auto-triangulated
131 let mut x = Vec::new();
132 let mut y = Vec::new();
133 let mut z = Vec::new();
134
135 let n = 20;
136 for i in 0..n {
137 for j in 0..n {
138 let xi = (i as f64 / (n - 1) as f64) * 2.0 - 1.0;
139 let yj = (j as f64 / (n - 1) as f64) * 2.0 - 1.0;
140 x.push(xi);
141 y.push(yj);
142 // Create a wavy surface
143 z.push(0.3 * ((xi * 3.0).sin() + (yj * 3.0).cos()));
144 }
145 }
146
147 let dataset = DataFrame::new(
148 x.len(),
149 vec![
150 Column::new("x".into(), x),
151 Column::new("y".into(), y),
152 Column::new("z".into(), z),
153 ],
154 )
155 .unwrap();
156
157 Mesh3D::builder()
158 .data(&dataset)
159 .x("x")
160 .y("y")
161 .z("z")
162 .color(Rgb(200, 200, 255))
163 .lighting(
164 &Lighting::new()
165 .ambient(0.5)
166 .diffuse(0.8)
167 .specular(0.5)
168 .roughness(0.2)
169 .fresnel(0.2),
170 )
171 .light_position((1, 1, 2))
172 .opacity(1.0)
173 .flat_shading(false)
174 .contour(true)
175 .plot_title(Text::from("Mesh 3D").font("Arial").size(22))
176 .build()
177 .plot();
178}Sourcepub fn specular(self, value: f64) -> Lighting
pub fn specular(self, value: f64) -> Lighting
Sets the specular highlight intensity.
§Arguments
value– Af64value in the range 0.0 – 1.0 specifying the mirror‑like highlight strength.
Examples found in repository?
examples/plotly_mesh3d.rs (line 167)
128fn example_with_lighting() {
129 // Create a simple wavy surface mesh without explicit indices
130 // The mesh will be auto-triangulated
131 let mut x = Vec::new();
132 let mut y = Vec::new();
133 let mut z = Vec::new();
134
135 let n = 20;
136 for i in 0..n {
137 for j in 0..n {
138 let xi = (i as f64 / (n - 1) as f64) * 2.0 - 1.0;
139 let yj = (j as f64 / (n - 1) as f64) * 2.0 - 1.0;
140 x.push(xi);
141 y.push(yj);
142 // Create a wavy surface
143 z.push(0.3 * ((xi * 3.0).sin() + (yj * 3.0).cos()));
144 }
145 }
146
147 let dataset = DataFrame::new(
148 x.len(),
149 vec![
150 Column::new("x".into(), x),
151 Column::new("y".into(), y),
152 Column::new("z".into(), z),
153 ],
154 )
155 .unwrap();
156
157 Mesh3D::builder()
158 .data(&dataset)
159 .x("x")
160 .y("y")
161 .z("z")
162 .color(Rgb(200, 200, 255))
163 .lighting(
164 &Lighting::new()
165 .ambient(0.5)
166 .diffuse(0.8)
167 .specular(0.5)
168 .roughness(0.2)
169 .fresnel(0.2),
170 )
171 .light_position((1, 1, 2))
172 .opacity(1.0)
173 .flat_shading(false)
174 .contour(true)
175 .plot_title(Text::from("Mesh 3D").font("Arial").size(22))
176 .build()
177 .plot();
178}More examples
examples/plotly_faceting.rs (line 334)
292fn mesh3d_example() {
293 let mut x_vals = Vec::new();
294 let mut y_vals = Vec::new();
295 let mut z_vals = Vec::new();
296 let mut surface_type = Vec::new();
297
298 let n = 25;
299
300 for surface in ["Gaussian", "Saddle", "Ripple"].iter() {
301 for i in 0..n {
302 for j in 0..n {
303 let x = (i as f64 / (n - 1) as f64) * 4.0 - 2.0;
304 let y = (j as f64 / (n - 1) as f64) * 4.0 - 2.0;
305
306 let z = match *surface {
307 "Gaussian" => (-0.5 * (x * x + y * y)).exp(),
308 "Saddle" => 0.3 * (x * x - y * y),
309 "Ripple" => 0.4 * ((x * 3.0).sin() + (y * 3.0).cos()),
310 _ => 0.0,
311 };
312
313 x_vals.push(x);
314 y_vals.push(y);
315 z_vals.push(z);
316 surface_type.push(surface.to_string());
317 }
318 }
319 }
320
321 let dataset = DataFrame::new(
322 x_vals.len(),
323 vec![
324 Column::new("x".into(), x_vals),
325 Column::new("y".into(), y_vals),
326 Column::new("z".into(), z_vals),
327 Column::new("surface_type".into(), surface_type),
328 ],
329 )
330 .unwrap();
331
332 let config = FacetConfig::new().cols(3).rows(1);
333
334 let lighting = Lighting::new().ambient(0.6).diffuse(0.8).specular(0.4);
335
336 Mesh3D::builder()
337 .data(&dataset)
338 .x("x")
339 .y("y")
340 .z("z")
341 .facet("surface_type")
342 .facet_config(&config)
343 .color(Rgb(100, 150, 200))
344 .lighting(&lighting)
345 .plot_title(
346 Text::from("Mathematical Surfaces Comparison")
347 .font("Arial")
348 .size(20),
349 )
350 .build()
351 .plot();
352}Trait Implementations§
Auto Trait Implementations§
impl Freeze for Lighting
impl RefUnwindSafe for Lighting
impl Send for Lighting
impl Sync for Lighting
impl Unpin for Lighting
impl UnsafeUnpin for Lighting
impl UnwindSafe for Lighting
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 moreSource§impl<T> Key for Twhere
T: Clone,
impl<T> Key for Twhere
T: Clone,
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
Read this value from the supplied reader. Same as
ReadEndian::read_from_little_endian().