More drawing
This commit is contained in:
parent
1faf395c34
commit
b5e58e731a
|
|
@ -5,7 +5,7 @@ use num_traits::identities::Zero;
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let space = Coil {
|
let space = Coil {
|
||||||
coil_scale: 2.0,
|
coil_scale: 3.0,
|
||||||
coil_r: 300.0,
|
coil_r: 300.0,
|
||||||
coil_w: 50.0,
|
coil_w: 50.0,
|
||||||
coil_m: 10.0,
|
coil_m: 10.0,
|
||||||
|
|
@ -24,15 +24,24 @@ pub fn main() {
|
||||||
gc.fill_color(Color::Rgba(0.8, 0.8, 0.8, 1.0));
|
gc.fill_color(Color::Rgba(0.8, 0.8, 0.8, 1.0));
|
||||||
gc.fill();
|
gc.fill();
|
||||||
|
|
||||||
gc.line_width(1.0);
|
gc.line_width(0.5);
|
||||||
gc.stroke_color(Color::Rgba(1.0, 0.5, 0.0, 1.0));
|
gc.stroke_color(Color::Rgba(1.0, 0.5, 0.0, 1.0));
|
||||||
for y in itertools_num::linspace(-1.0, 1.0, 101) {
|
for y in itertools_num::linspace(-1.0, 1.0, 101) {
|
||||||
let base = vec2(-500.0, 0.0);
|
draw_ray(gc, &space, vec2(-500.0, 0.0), vec2(1.0, y));
|
||||||
let dir = vec2(1.0, y);
|
}
|
||||||
let path = trace_iter(&space, base, dir, 1.0);
|
gc.stroke_color(Color::Rgba(0.0, 0.5, 1.0, 1.0));
|
||||||
|
for y in itertools_num::linspace(-1.0, 1.0, 101) {
|
||||||
|
draw_ray(gc, &space, vec2(0.0, space.coil_r), vec2(1.0, y));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_ray(gc: &mut Vec<Draw>, space: &impl Metric, base: Vec2, dir: Vec2) {
|
||||||
|
let dir = space.globalize(base, dir);
|
||||||
gc.new_path();
|
gc.new_path();
|
||||||
gc.move_to(base.x, base.y);
|
gc.move_to(base.x, base.y);
|
||||||
for pt in path.take(10000) {
|
for pt in trace_iter(space, base, dir, 1.0).take(10000) {
|
||||||
gc.line_to(pt.x, pt.y);
|
gc.line_to(pt.x, pt.y);
|
||||||
if any(greaterThan(abs(pt), Vec2::from_s(1000.0))) {
|
if any(greaterThan(abs(pt), Vec2::from_s(1000.0))) {
|
||||||
break
|
break
|
||||||
|
|
@ -40,9 +49,6 @@ pub fn main() {
|
||||||
}
|
}
|
||||||
gc.stroke();
|
gc.stroke();
|
||||||
}
|
}
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Coil {
|
struct Coil {
|
||||||
coil_m: f32,
|
coil_m: f32,
|
||||||
|
|
@ -88,6 +94,13 @@ trait Metric {
|
||||||
part_deriv(|p| self.metric(p), pos, 1.0e-3)
|
part_deriv(|p| self.metric(p), pos, 1.0e-3)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn length(&self, at: Vec2, v: Vec2) -> f32 {
|
||||||
|
sqrt(dot(v, self.metric(at) * v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn normalize(&self, at: Vec2, v: Vec2) -> Vec2 {
|
||||||
|
v / self.length(at, v)
|
||||||
|
}
|
||||||
fn globalize(&self, at: Vec2, v: Vec2) -> Vec2 {
|
fn globalize(&self, at: Vec2, v: Vec2) -> Vec2 {
|
||||||
let h = self.halfmetric(at);
|
let h = self.halfmetric(at);
|
||||||
transpose(&h.ortho) * diagonal( Vec2::from_s(1.0) / h.diag) * h.ortho * v
|
transpose(&h.ortho) * diagonal( Vec2::from_s(1.0) / h.diag) * h.ortho * v
|
||||||
|
|
@ -130,7 +143,7 @@ fn trace_iter<M: Metric>(space: &M, base: Vec2, dir: Vec2, dt: f32) -> TraceIter
|
||||||
TraceIter{
|
TraceIter{
|
||||||
space: space,
|
space: space,
|
||||||
p: base,
|
p: base,
|
||||||
v: normalize(dir),
|
v: space.normalize(base, dir),
|
||||||
dt: dt,
|
dt: dt,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user