primitive: Remove Option<...> as loose dot is always adjacent to a seg

This commit is contained in:
Mikolaj Wielgus 2023-10-28 19:11:59 +00:00
parent c163716a6a
commit 0cf7c718f3
6 changed files with 26 additions and 43 deletions

View File

@ -1,9 +1,4 @@
use petgraph::stable_graph::StableDiGraph; use crate::graph::{GetEnds, Index, Interior, LooseBendIndex, LooseDotIndex, LooseSegIndex};
use crate::graph::{
GetEnds, Index, Interior, Label, LooseBendIndex, LooseDotIndex, LooseSegIndex, Weight,
};
use crate::primitive::{GetOtherEnd, LooseBend, LooseDot, LooseSeg};
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
pub struct Bow { pub struct Bow {

View File

@ -1,4 +1,4 @@
use contracts::{debug_ensures, debug_requires}; use contracts::debug_ensures;
use enum_dispatch::enum_dispatch; use enum_dispatch::enum_dispatch;
use geo::{EuclideanLength, Point}; use geo::{EuclideanLength, Point};
@ -334,7 +334,7 @@ impl<'a> Draw<'a> {
DotIndex::Fixed(loose) => BareHead { dot: loose }.into(), DotIndex::Fixed(loose) => BareHead { dot: loose }.into(),
DotIndex::Loose(fixed) => SegbendHead { DotIndex::Loose(fixed) => SegbendHead {
dot: fixed, dot: fixed,
segbend: self.layout.segbend(fixed).unwrap(), segbend: self.layout.segbend(fixed),
} }
.into(), .into(),
} }

View File

@ -6,12 +6,11 @@ use petgraph::Direction::Incoming;
use rstar::primitives::GeomWithData; use rstar::primitives::GeomWithData;
use rstar::{RTree, RTreeObject}; use rstar::{RTree, RTreeObject};
use crate::bow::Bow;
use crate::graph::{ use crate::graph::{
BendWeight, DotIndex, DotWeight, FixedBendIndex, FixedBendWeight, FixedDotIndex, BendWeight, DotIndex, DotWeight, FixedBendIndex, FixedDotIndex, FixedDotWeight, FixedSegIndex,
FixedDotWeight, FixedSegIndex, FixedSegWeight, GenericIndex, GetNetMut, GetNodeIndex, Index, FixedSegWeight, GenericIndex, GetNetMut, GetNodeIndex, Index, Interior, Label, LooseBendIndex,
Interior, Label, LooseBendIndex, LooseBendWeight, LooseDotIndex, LooseDotWeight, LooseSegIndex, LooseBendWeight, LooseDotIndex, LooseDotWeight, LooseSegIndex, LooseSegWeight, MakePrimitive,
LooseSegWeight, MakePrimitive, Retag, SegWeight, Weight, Retag, SegWeight, Weight,
}; };
use crate::primitive::{GenericPrimitive, GetConnectable, GetWeight, MakeShape}; use crate::primitive::{GenericPrimitive, GetConnectable, GetWeight, MakeShape};
use crate::segbend::Segbend; use crate::segbend::Segbend;
@ -301,7 +300,7 @@ impl Layout {
Bow::from_bend(bend, &self.graph) Bow::from_bend(bend, &self.graph)
}*/ }*/
pub fn segbend(&self, dot: LooseDotIndex) -> Option<Segbend> { pub fn segbend(&self, dot: LooseDotIndex) -> Segbend {
Segbend::from_dot(dot, &self.graph) Segbend::from_dot(dot, &self.graph)
} }
@ -346,9 +345,7 @@ impl Layout {
self.primitive(dot) self.primitive(dot)
.seg() .seg()
.map(|seg| self.remove_from_rtree(seg.into())); .map(|seg| self.remove_from_rtree(seg.into()));
self.primitive(dot) self.remove_from_rtree(self.primitive(dot).bend().into());
.bend()
.map(|bend| self.remove_from_rtree(bend.into()));
self.remove_from_rtree(dot.into()); self.remove_from_rtree(dot.into());
let mut dot_weight = self.primitive(dot).weight(); let mut dot_weight = self.primitive(dot).weight();
@ -364,20 +361,16 @@ impl Layout {
self.insert_into_rtree(dot.into()); self.insert_into_rtree(dot.into());
self.primitive(dot) self.primitive(dot)
.seg() .seg()
.map(|prev| self.insert_into_rtree(prev.into())); .map(|seg| self.remove_from_rtree(seg.into()));
self.primitive(dot) self.insert_into_rtree(self.primitive(dot).bend().into());
.bend()
.map(|next| self.insert_into_rtree(next.into()));
return Err(()); return Err(());
} }
self.insert_into_rtree(dot.into()); self.insert_into_rtree(dot.into());
self.primitive(dot) self.primitive(dot)
.seg() .seg()
.map(|prev| self.insert_into_rtree(prev.into())); .map(|seg| self.remove_from_rtree(seg.into()));
self.primitive(dot) self.insert_into_rtree(self.primitive(dot).bend().into());
.bend()
.map(|next| self.insert_into_rtree(next.into()));
Ok(()) Ok(())
} }

View File

@ -5,10 +5,10 @@ use petgraph::stable_graph::{NodeIndex, StableDiGraph};
use petgraph::Direction::{Incoming, Outgoing}; use petgraph::Direction::{Incoming, Outgoing};
use crate::graph::{ use crate::graph::{
DotIndex, FixedBendIndex, FixedBendWeight, FixedDotIndex, FixedDotWeight, FixedSegIndex, DotIndex, FixedBendIndex, FixedBendWeight, FixedDotIndex, FixedDotWeight, FixedSegWeight,
FixedSegWeight, GenericIndex, GetEnds, GetNet, GetNodeIndex, GetWidth, Index, Interior, Label, GenericIndex, GetEnds, GetNet, GetNodeIndex, GetWidth, Index, Interior, Label, LooseBendIndex,
LooseBendIndex, LooseBendWeight, LooseDotIndex, LooseDotWeight, LooseSegIndex, LooseSegWeight, LooseBendWeight, LooseDotIndex, LooseDotWeight, LooseSegIndex, LooseSegWeight, MakePrimitive,
MakePrimitive, Retag, Weight, Retag, Weight,
}; };
use crate::math::{self, Circle}; use crate::math::{self, Circle};
use crate::shape::{BendShape, DotShape, SegShape, Shape, ShapeTrait}; use crate::shape::{BendShape, DotShape, SegShape, Shape, ShapeTrait};
@ -204,7 +204,7 @@ impl<'a> LooseDot<'a> {
.next() .next()
} }
pub fn bend(&self) -> Option<LooseBendIndex> { pub fn bend(&self) -> LooseBendIndex {
self.graph self.graph
.neighbors_undirected(self.index.node_index()) .neighbors_undirected(self.index.node_index())
.filter(|ni| { .filter(|ni| {
@ -221,6 +221,7 @@ impl<'a> LooseDot<'a> {
.filter(|ni| self.graph.node_weight(*ni).unwrap().is_loose_bend()) .filter(|ni| self.graph.node_weight(*ni).unwrap().is_loose_bend())
.map(|ni| LooseBendIndex::new(ni)) .map(|ni| LooseBendIndex::new(ni))
.next() .next()
.unwrap()
} }
} }

View File

@ -2,10 +2,9 @@ use petgraph::stable_graph::StableDiGraph;
use crate::{ use crate::{
graph::{ graph::{
FixedBendIndex, FixedDotIndex, FixedSegIndex, GetEnds, Index, Interior, Label, GetEnds, Index, Interior, Label, LooseBendIndex, LooseDotIndex, LooseSegIndex, Weight,
LooseBendIndex, LooseDotIndex, LooseSegIndex, Weight,
}, },
primitive::{FixedBend, FixedDot, GetOtherEnd, LooseBend, LooseDot}, primitive::{GetOtherEnd, LooseBend, LooseDot},
}; };
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
@ -16,14 +15,11 @@ pub struct Segbend {
} }
impl Segbend { impl Segbend {
pub fn from_dot( pub fn from_dot(dot: LooseDotIndex, graph: &StableDiGraph<Weight, Label, usize>) -> Self {
dot: LooseDotIndex, let bend = LooseDot::new(dot, graph).bend();
graph: &StableDiGraph<Weight, Label, usize>,
) -> Option<Self> {
let bend = LooseDot::new(dot, graph).bend()?;
let dot = LooseBend::new(bend, graph).other_end(dot); let dot = LooseBend::new(bend, graph).other_end(dot);
let seg = LooseDot::new(dot, graph).seg()?; let seg = LooseDot::new(dot, graph).seg().unwrap();
Some(Self { bend, dot, seg }) Self { bend, dot, seg }
} }
} }

View File

@ -1,12 +1,10 @@
use contracts::debug_ensures; use contracts::debug_ensures;
use crate::{ use crate::{
bow::Bow,
draw::{BareHead, Draw, Head, HeadTrait, SegbendHead}, draw::{BareHead, Draw, Head, HeadTrait, SegbendHead},
graph::{FixedBendIndex, FixedDotIndex, GetEnds}, graph::FixedDotIndex,
layout::Layout, layout::Layout,
mesh::{Mesh, VertexIndex}, mesh::{Mesh, VertexIndex},
primitive::GetWeight,
rules::Rules, rules::Rules,
}; };