mirror of https://codeberg.org/topola/topola.git
Reinsert all bends into R-tree when moving a dot
This was causing a crash. Added some code that was used to debug this.
This commit is contained in:
parent
b7e00828cf
commit
bdf3930894
|
|
@ -206,7 +206,6 @@ impl Layout {
|
||||||
fn relax_band(&mut self, bend: BendIndex) {
|
fn relax_band(&mut self, bend: BendIndex) {
|
||||||
let mut prev_bend = bend;
|
let mut prev_bend = bend;
|
||||||
while let Some(cur_bend) = self.mesh.primitive(prev_bend).prev_akin() {
|
while let Some(cur_bend) = self.mesh.primitive(prev_bend).prev_akin() {
|
||||||
dbg!(cur_bend);
|
|
||||||
if self.mesh.primitive(cur_bend).cross_product() >= 0.0 {
|
if self.mesh.primitive(cur_bend).cross_product() >= 0.0 {
|
||||||
self.release_bow(cur_bend);
|
self.release_bow(cur_bend);
|
||||||
}
|
}
|
||||||
|
|
@ -216,7 +215,6 @@ impl Layout {
|
||||||
|
|
||||||
let mut prev_bend = bend;
|
let mut prev_bend = bend;
|
||||||
while let Some(cur_bend) = self.mesh.primitive(prev_bend).next_akin() {
|
while let Some(cur_bend) = self.mesh.primitive(prev_bend).next_akin() {
|
||||||
dbg!(cur_bend);
|
|
||||||
if self.mesh.primitive(cur_bend).cross_product() >= 0.0 {
|
if self.mesh.primitive(cur_bend).cross_product() >= 0.0 {
|
||||||
self.release_bow(cur_bend);
|
self.release_bow(cur_bend);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
13
src/main.rs
13
src/main.rs
|
|
@ -16,6 +16,7 @@ mod primitive;
|
||||||
mod shape;
|
mod shape;
|
||||||
mod math;
|
mod math;
|
||||||
|
|
||||||
|
use std::panic;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use graph::{TaggedIndex, Tag};
|
use graph::{TaggedIndex, Tag};
|
||||||
use sdl2::EventPump;
|
use sdl2::EventPump;
|
||||||
|
|
@ -202,6 +203,7 @@ fn render_times(event_pump: &mut EventPump, canvas: &mut Canvas<Window>, layout:
|
||||||
layout.move_dot(*follower.as_dot().unwrap(), (state.x() as f64, state.y() as f64).into());
|
layout.move_dot(*follower.as_dot().unwrap(), (state.x() as f64, state.y() as f64).into());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let result = panic::catch_unwind(|| {
|
||||||
for shape in layout.shapes() {
|
for shape in layout.shapes() {
|
||||||
if let Some(center) = shape.center {
|
if let Some(center) = shape.center {
|
||||||
let circle = shape.circle().unwrap();
|
let circle = shape.circle().unwrap();
|
||||||
|
|
@ -236,6 +238,17 @@ fn render_times(event_pump: &mut EventPump, canvas: &mut Canvas<Window>, layout:
|
||||||
(shape.width / 2.0) as i16,
|
(shape.width / 2.0) as i16,
|
||||||
Color::RGB(200, 52, 52));
|
Color::RGB(200, 52, 52));
|
||||||
}
|
}
|
||||||
|
/*let envelope = shape.envelope();
|
||||||
|
let _ = canvas.rectangle(envelope.lower()[0] as i16,
|
||||||
|
envelope.lower()[1] as i16,
|
||||||
|
envelope.upper()[0] as i16,
|
||||||
|
envelope.upper()[1] as i16,
|
||||||
|
Color::RGB(100, 100, 100));*/
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Err(err) = result {
|
||||||
|
dbg!(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas.present();
|
canvas.present();
|
||||||
|
|
|
||||||
25
src/mesh.rs
25
src/mesh.rs
|
|
@ -41,8 +41,9 @@ impl Mesh {
|
||||||
pub fn remove<Weight: std::marker::Copy>(&mut self, index: Index<Weight>) {
|
pub fn remove<Weight: std::marker::Copy>(&mut self, index: Index<Weight>) {
|
||||||
// Unnecessary retag. It should be possible to elide it.
|
// Unnecessary retag. It should be possible to elide it.
|
||||||
let weight = *self.graph.node_weight(index.index).unwrap();
|
let weight = *self.graph.node_weight(index.index).unwrap();
|
||||||
self.rtree.remove(&RTreeWrapper::new(self.primitive(index).shape(), index.retag(weight)));
|
|
||||||
|
|
||||||
|
let wrapper = RTreeWrapper::new(self.primitive(index).shape(), index.retag(weight));
|
||||||
|
assert!(self.rtree.remove(&wrapper).is_some());
|
||||||
self.graph.remove_node(index.index);
|
self.graph.remove_node(index.index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -110,6 +111,17 @@ impl Mesh {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn move_dot(&mut self, dot: DotIndex, to: Point) {
|
pub fn move_dot(&mut self, dot: DotIndex, to: Point) {
|
||||||
|
let mut cur_bend = self.primitive(dot).outer();
|
||||||
|
loop {
|
||||||
|
match cur_bend {
|
||||||
|
Some(..) => (),
|
||||||
|
None => break,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.remove_from_rtree(cur_bend.unwrap().tag());
|
||||||
|
cur_bend = self.primitive(cur_bend.unwrap()).outer()
|
||||||
|
}
|
||||||
|
|
||||||
self.remove_from_rtree(dot.tag());
|
self.remove_from_rtree(dot.tag());
|
||||||
|
|
||||||
let mut dot_weight = self.primitive(dot).weight();
|
let mut dot_weight = self.primitive(dot).weight();
|
||||||
|
|
@ -117,6 +129,17 @@ impl Mesh {
|
||||||
*self.graph.node_weight_mut(dot.index).unwrap() = TaggedWeight::Dot(dot_weight);
|
*self.graph.node_weight_mut(dot.index).unwrap() = TaggedWeight::Dot(dot_weight);
|
||||||
|
|
||||||
self.insert_into_rtree(dot.tag());
|
self.insert_into_rtree(dot.tag());
|
||||||
|
|
||||||
|
let mut cur_bend = self.primitive(dot).outer();
|
||||||
|
loop {
|
||||||
|
match cur_bend {
|
||||||
|
Some(..) => (),
|
||||||
|
None => break,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.insert_into_rtree(cur_bend.unwrap().tag());
|
||||||
|
cur_bend = self.primitive(cur_bend.unwrap()).outer()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn nodes(&self) -> impl Iterator<Item=TaggedIndex> + '_ {
|
pub fn nodes(&self) -> impl Iterator<Item=TaggedIndex> + '_ {
|
||||||
|
|
|
||||||
|
|
@ -63,13 +63,11 @@ impl<'a, Weight> Primitive<'a, Weight> {
|
||||||
let mut prev_index = self.index.index;
|
let mut prev_index = self.index.index;
|
||||||
|
|
||||||
while let Some(index) = self.graph.neighbors_directed(prev_index, Outgoing)
|
while let Some(index) = self.graph.neighbors_directed(prev_index, Outgoing)
|
||||||
.filter(|ni| dbg!(self.graph.find_edge(prev_index, *ni).is_some()))
|
.filter(|ni| self.graph.find_edge(prev_index, *ni).is_some())
|
||||||
.filter(|ni| dbg!(self.graph.edge_weight(self.graph.find_edge(prev_index, *ni).unwrap()).unwrap().is_end()))
|
.filter(|ni| self.graph.edge_weight(self.graph.find_edge(prev_index, *ni).unwrap()).unwrap().is_end())
|
||||||
.next()
|
.next()
|
||||||
{
|
{
|
||||||
let weight = *self.graph.node_weight(index).unwrap();
|
let weight = *self.graph.node_weight(index).unwrap();
|
||||||
dbg!(weight);
|
|
||||||
dbg!(index);
|
|
||||||
|
|
||||||
if mem::discriminant(&self.tagged_weight()) == mem::discriminant(&weight) {
|
if mem::discriminant(&self.tagged_weight()) == mem::discriminant(&weight) {
|
||||||
return Some(Index::<Weight>::new(index));
|
return Some(Index::<Weight>::new(index));
|
||||||
|
|
@ -92,13 +90,11 @@ impl<'a, Weight> Primitive<'a, Weight> {
|
||||||
let mut prev_index = self.index.index;
|
let mut prev_index = self.index.index;
|
||||||
|
|
||||||
while let Some(index) = self.graph.neighbors_directed(prev_index, Incoming)
|
while let Some(index) = self.graph.neighbors_directed(prev_index, Incoming)
|
||||||
.filter(|ni| dbg!(self.graph.find_edge(*ni, prev_index).is_some()))
|
.filter(|ni| self.graph.find_edge(*ni, prev_index).is_some())
|
||||||
.filter(|ni| dbg!(self.graph.edge_weight(self.graph.find_edge(*ni, prev_index).unwrap()).unwrap().is_end()))
|
.filter(|ni| self.graph.edge_weight(self.graph.find_edge(*ni, prev_index).unwrap()).unwrap().is_end())
|
||||||
.next()
|
.next()
|
||||||
{
|
{
|
||||||
let weight = *self.graph.node_weight(index).unwrap();
|
let weight = *self.graph.node_weight(index).unwrap();
|
||||||
dbg!(weight);
|
|
||||||
dbg!(index);
|
|
||||||
|
|
||||||
if mem::discriminant(&self.tagged_weight()) == mem::discriminant(&weight) {
|
if mem::discriminant(&self.tagged_weight()) == mem::discriminant(&weight) {
|
||||||
return Some(Index::<Weight>::new(index));
|
return Some(Index::<Weight>::new(index));
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use rstar::{RTreeObject, AABB};
|
||||||
use crate::graph::{TaggedWeight, DotWeight};
|
use crate::graph::{TaggedWeight, DotWeight};
|
||||||
use crate::math::Circle;
|
use crate::math::Circle;
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct Shape {
|
pub struct Shape {
|
||||||
pub width: f64,
|
pub width: f64,
|
||||||
pub from: Point,
|
pub from: Point,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue