Render current as a vector field
hmm...
This commit is contained in:
@@ -49,7 +49,7 @@ impl Driver {
|
|||||||
for inset in 0..thickness {
|
for inset in 0..thickness {
|
||||||
let depth = thickness - inset;
|
let depth = thickness - inset;
|
||||||
// TODO: tune a scalar multiplier on this value
|
// TODO: tune a scalar multiplier on this value
|
||||||
let conductivity = 0.1 * (depth*depth) as f64;
|
let conductivity = 0.02 * (depth*depth) as f64;
|
||||||
for x in inset..self.state.width() - inset {
|
for x in inset..self.state.width() - inset {
|
||||||
// left
|
// left
|
||||||
*self.state.get_mut(x, inset).mat_mut() = mat::Static::conductor(conductivity).into();
|
*self.state.get_mut(x, inset).mat_mut() = mat::Static::conductor(conductivity).into();
|
||||||
|
@@ -89,7 +89,7 @@ impl<'a> RenderSteps<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn render_vector_field<F: Fn(&Cell<mat::Static>) -> Point>(&mut self, color: Rgb<u8>, measure: F) {
|
fn render_vector_field<F: Fn(&Cell<mat::Static>) -> Point>(&mut self, color: Rgb<u8>, typical: f64, measure: F) {
|
||||||
let w = self.sim.width();
|
let w = self.sim.width();
|
||||||
let h = self.sim.height();
|
let h = self.sim.height();
|
||||||
let vec_spacing = 10;
|
let vec_spacing = 10;
|
||||||
@@ -97,8 +97,8 @@ impl<'a> RenderSteps<'a> {
|
|||||||
for x in 0..w {
|
for x in 0..w {
|
||||||
if x % vec_spacing == 0 && y % vec_spacing == 0 {
|
if x % vec_spacing == 0 && y % vec_spacing == 0 {
|
||||||
let vec = self.field_vector(x, y, vec_spacing, &measure);
|
let vec = self.field_vector(x, y, vec_spacing, &measure);
|
||||||
let norm_vec = scale_vector(vec, 100.0);
|
let norm_vec = scale_vector(vec, typical);
|
||||||
let alpha = scale_unsigned(vec.mag_sq(), 500.0);
|
let alpha = 0.7*scale_unsigned(vec.mag_sq(), typical * 5.0);
|
||||||
let vec = norm_vec * (vec_spacing as f64);
|
let vec = norm_vec * (vec_spacing as f64);
|
||||||
let center = Point::new(x as _, y as _) + Point::new(vec_spacing as _, vec_spacing as _)*0.5;
|
let center = Point::new(x as _, y as _) + Point::new(vec_spacing as _, vec_spacing as _)*0.5;
|
||||||
self.im.draw_field_arrow(center, vec, color, alpha as f32);
|
self.im.draw_field_arrow(center, vec, color, alpha as f32);
|
||||||
@@ -107,7 +107,15 @@ impl<'a> RenderSteps<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn render_e_field(&mut self) {
|
fn render_e_field(&mut self) {
|
||||||
self.render_vector_field(Rgb([0xff, 0xff, 0xff]), |cell| cell.e());
|
self.render_vector_field(Rgb([0xff, 0xff, 0xff]), 100.0, |cell| cell.e());
|
||||||
|
// current
|
||||||
|
self.render_vector_field(Rgb([0x00, 0xa0, 0x30]), 0.001, |cell| {
|
||||||
|
if cell.mat().conductivity() >= 1.0e3 {
|
||||||
|
cell.e()*cell.mat().conductivity()
|
||||||
|
} else {
|
||||||
|
Default::default()
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
fn render_measurements(&mut self) {
|
fn render_measurements(&mut self) {
|
||||||
for (meas_no, m) in self.meas.iter().enumerate() {
|
for (meas_no, m) in self.meas.iter().enumerate() {
|
||||||
|
Reference in New Issue
Block a user