More drawing

This commit is contained in:
numzero 2024-04-28 23:01:15 +03:00
parent 1faf395c34
commit b5e58e731a

View File

@ -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,24 +24,30 @@ 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
} }
} }
gc.stroke(); gc.stroke();
}
});
});
} }
struct Coil { struct Coil {
@ -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,
} }
} }