Basically the last commit, but better
This commit is contained in:
parent
e5d010ee5d
commit
7e05556e99
94
src/main.rs
94
src/main.rs
@ -197,14 +197,12 @@ fn main() {
|
|||||||
let next_tri = *next_tri;
|
let next_tri = *next_tri;
|
||||||
for (idx, &(_base_idx, base_tri)) in w.tris.iter().enumerate() {
|
for (idx, &(_base_idx, base_tri)) in w.tris.iter().enumerate() {
|
||||||
let base_tris = &w.tris[0..=idx];
|
let base_tris = &w.tris[0..=idx];
|
||||||
let mut w = w.clone();
|
let mut neww = w.clone();
|
||||||
let free_angle = right_of(base_tri);
|
let free_angle = right_of(base_tri);
|
||||||
let next_angle = left_of(next_tri);
|
let next_angle = left_of(next_tri);
|
||||||
let target = next_angle - PI + free_angle;
|
let target = next_angle - PI + free_angle;
|
||||||
|
let original_tri = next_tri;
|
||||||
let mut next_tri = rotate(next_tri, target);
|
let mut next_tri = rotate(next_tri, target);
|
||||||
if save_counter == 254 {
|
|
||||||
println!("inserting after {:?} in {:?}", idx, w.tris);
|
|
||||||
}
|
|
||||||
if next_tri.0.y < 0.0 || next_tri.1.y < 0.0 || next_tri.2.y < 0.0 {
|
if next_tri.0.y < 0.0 || next_tri.1.y < 0.0 || next_tri.2.y < 0.0 {
|
||||||
let miny = min(next_tri.0.y, min(next_tri.1.y, next_tri.2.y));
|
let miny = min(next_tri.0.y, min(next_tri.1.y, next_tri.2.y));
|
||||||
next_tri.0.y -= miny;
|
next_tri.0.y -= miny;
|
||||||
@ -223,19 +221,16 @@ fn main() {
|
|||||||
next_tri.2.x += dx;
|
next_tri.2.x += dx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
w.tris.insert(idx+1, (*next_idx, next_tri));
|
neww.tris.insert(idx+1, (*next_idx, next_tri));
|
||||||
if save_counter == 254 {
|
if idx + 1 != neww.tris.len() - 1 {
|
||||||
println!("right {:?}", 0);
|
|
||||||
}
|
|
||||||
if idx + 1 != w.tris.len() - 1 {
|
|
||||||
for &delta in &[
|
for &delta in &[
|
||||||
/*80.0, 30.0, 10.0, 5.0,*/ 1.0, 0.6, 0.32, 0.18, 0.1, 0.06, 0.03, 0.01,
|
/*80.0, 30.0, 10.0, 5.0,*/ 1.0, 0.6, 0.32, 0.18, 0.1, 0.06, 0.03, 0.01,
|
||||||
0.003,
|
0.003,
|
||||||
] {
|
] {
|
||||||
let initial_state = w.tris[0..=idx+1].iter().any(|(_, x)| w.tris[idx+2..].iter().any(|(_, y)| x.intersects(y)));
|
let initial_state = neww.tris[0..=idx+1].iter().any(|(_, x)| neww.tris[idx+2..].iter().any(|(_, y)| x.intersects(y)));
|
||||||
let dx = if initial_state { delta } else { -delta };
|
let dx = if initial_state { delta } else { -delta };
|
||||||
while w.tris[0..=idx+1].iter().any(|(_, x)| w.tris[idx+2..].iter().any(|(_, y)| x.intersects(y))) == initial_state {
|
while neww.tris[0..=idx+1].iter().any(|(_, x)| neww.tris[idx+2..].iter().any(|(_, y)| x.intersects(y))) == initial_state {
|
||||||
for (_, tri) in &mut w.tris[idx+2..] {
|
for (_, tri) in &mut neww.tris[idx+2..] {
|
||||||
tri.0.x += dx;
|
tri.0.x += dx;
|
||||||
tri.1.x += dx;
|
tri.1.x += dx;
|
||||||
tri.2.x += dx;
|
tri.2.x += dx;
|
||||||
@ -243,27 +238,82 @@ fn main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
w.normalize();
|
neww.normalize();
|
||||||
w.calc_width();
|
neww.calc_width();
|
||||||
if save_iterations {
|
if save_iterations {
|
||||||
display::save_world(&format!("{}b_{}.svg", save_prefix, save_counter), &w);
|
display::save_world(&format!("{}b_{}.svg", save_prefix, save_counter), &neww);
|
||||||
}
|
}
|
||||||
if w.tris.len() == count_tris {
|
if neww.tris.len() == count_tris {
|
||||||
if w.width < best.width {
|
if neww.width < best.width {
|
||||||
println!("[{}] new best: {}", save_counter, w.width);
|
println!("[{}] new best: {}", save_counter, neww.width);
|
||||||
//println!("{:?}", w.tris);
|
//println!("{:?}", w.tris);
|
||||||
display::save_world(
|
display::save_world(
|
||||||
&format!("{}best_{}.svg", save_prefix, save_counter),
|
&format!("{}best_{}.svg", save_prefix, save_counter),
|
||||||
&w,
|
&neww,
|
||||||
);
|
);
|
||||||
best = w;
|
best = neww;
|
||||||
}
|
}
|
||||||
} else if w.width < best.width {
|
} else if neww.width < best.width {
|
||||||
//w.width -= (2.0 * PI - free_angle - next_angle) * 0.01;
|
//w.width -= (2.0 * PI - free_angle - next_angle) * 0.01;
|
||||||
//if (angle > 50 && angle < 55) || (angle > 88 && angle < 92) {
|
//if (angle > 50 && angle < 55) || (angle > 88 && angle < 92) {
|
||||||
//println!("{:?} -> {:?}", angle, w.width);
|
//println!("{:?} -> {:?}", angle, w.width);
|
||||||
//}
|
//}
|
||||||
new.push(w);
|
new.push(neww);
|
||||||
|
}
|
||||||
|
save_counter += 1;
|
||||||
|
|
||||||
|
let mut neww = w.clone();
|
||||||
|
let mut next_tri = original_tri;
|
||||||
|
for &delta in &[
|
||||||
|
/*80.0, 30.0, 10.0, 5.0,*/ 1.0, 0.6, 0.32, 0.18, 0.1, 0.06, 0.03, 0.01,
|
||||||
|
0.003,
|
||||||
|
] {
|
||||||
|
let initial_state = base_tris.iter().any(|(_, x)| x.intersects(&next_tri));
|
||||||
|
let dx = if initial_state { delta } else { -delta };
|
||||||
|
while base_tris.iter().any(|(_, x)| x.intersects(&next_tri)) == initial_state {
|
||||||
|
next_tri.0.x += dx;
|
||||||
|
next_tri.1.x += dx;
|
||||||
|
next_tri.2.x += dx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
neww.tris.insert(idx+1, (*next_idx, next_tri));
|
||||||
|
if idx + 1 != neww.tris.len() - 1 {
|
||||||
|
for &delta in &[
|
||||||
|
/*80.0, 30.0, 10.0, 5.0,*/ 1.0, 0.6, 0.32, 0.18, 0.1, 0.06, 0.03, 0.01,
|
||||||
|
0.003,
|
||||||
|
] {
|
||||||
|
let initial_state = neww.tris[0..=idx+1].iter().any(|(_, x)| neww.tris[idx+2..].iter().any(|(_, y)| x.intersects(y)));
|
||||||
|
let dx = if initial_state { delta } else { -delta };
|
||||||
|
while neww.tris[0..=idx+1].iter().any(|(_, x)| neww.tris[idx+2..].iter().any(|(_, y)| x.intersects(y))) == initial_state {
|
||||||
|
for (_, tri) in &mut neww.tris[idx+2..] {
|
||||||
|
tri.0.x += dx;
|
||||||
|
tri.1.x += dx;
|
||||||
|
tri.2.x += dx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
neww.normalize();
|
||||||
|
neww.calc_width();
|
||||||
|
if save_iterations {
|
||||||
|
display::save_world(&format!("{}b_{}.svg", save_prefix, save_counter), &neww);
|
||||||
|
}
|
||||||
|
if neww.tris.len() == count_tris {
|
||||||
|
if neww.width < best.width {
|
||||||
|
println!("[{}] new best: {}", save_counter, neww.width);
|
||||||
|
//println!("{:?}", w.tris);
|
||||||
|
display::save_world(
|
||||||
|
&format!("{}best_{}.svg", save_prefix, save_counter),
|
||||||
|
&neww,
|
||||||
|
);
|
||||||
|
best = neww;
|
||||||
|
}
|
||||||
|
} else if neww.width < best.width {
|
||||||
|
//w.width -= (2.0 * PI - free_angle - next_angle) * 0.01;
|
||||||
|
//if (angle > 50 && angle < 55) || (angle > 88 && angle < 92) {
|
||||||
|
//println!("{:?} -> {:?}", angle, w.width);
|
||||||
|
//}
|
||||||
|
new.push(neww);
|
||||||
}
|
}
|
||||||
save_counter += 1;
|
save_counter += 1;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user