mirror of https://codeberg.org/topola/topola.git
primitive: Move `.core()` to a trait only implemented by bends
This commit is contained in:
parent
8379470bb1
commit
961fc02678
|
|
@ -5,7 +5,7 @@ use crate::{
|
||||||
graph::{BendIndex, DotIndex, FixedDotIndex, MakePrimitive},
|
graph::{BendIndex, DotIndex, FixedDotIndex, MakePrimitive},
|
||||||
layout::Layout,
|
layout::Layout,
|
||||||
math::{self, Circle},
|
math::{self, Circle},
|
||||||
primitive::{GetWeight, MakeShape},
|
primitive::{GetCore, GetWeight, MakeShape},
|
||||||
rules::{Conditions, Rules},
|
rules::{Conditions, Rules},
|
||||||
shape::ShapeTrait,
|
shape::ShapeTrait,
|
||||||
};
|
};
|
||||||
|
|
@ -125,11 +125,7 @@ impl<'a, 'b> Guide<'a, 'b> {
|
||||||
self.bend_circle(inner.into(), width)
|
self.bend_circle(inner.into(), width)
|
||||||
} else {
|
} else {
|
||||||
self.dot_circle(
|
self.dot_circle(
|
||||||
self.layout
|
self.layout.primitive(head.segbend.bend).core().into(),
|
||||||
.primitive(head.segbend.bend)
|
|
||||||
.core()
|
|
||||||
.unwrap()
|
|
||||||
.into(),
|
|
||||||
width,
|
width,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
25
src/mesh.rs
25
src/mesh.rs
|
|
@ -5,9 +5,9 @@ use petgraph::visit;
|
||||||
use spade::InsertionError;
|
use spade::InsertionError;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
graph::{FixedBendIndex, FixedDotIndex, GetNodeIndex, Index, LooseBendIndex},
|
graph::{FixedBendIndex, FixedDotIndex, GetNodeIndex, Index, LooseBendIndex, MakePrimitive},
|
||||||
layout::Layout,
|
layout::Layout,
|
||||||
primitive::MakeShape,
|
primitive::{GetCore, MakeShape},
|
||||||
shape::ShapeTrait,
|
shape::ShapeTrait,
|
||||||
triangulation::Triangulation,
|
triangulation::Triangulation,
|
||||||
};
|
};
|
||||||
|
|
@ -34,11 +34,24 @@ impl Mesh {
|
||||||
|
|
||||||
pub fn generate(&mut self, layout: &Layout) -> Result<(), InsertionError> {
|
pub fn generate(&mut self, layout: &Layout) -> Result<(), InsertionError> {
|
||||||
for node in layout.nodes() {
|
for node in layout.nodes() {
|
||||||
if let Index::FixedDot(dot) = node {
|
let center = node.primitive(&layout.graph).shape().center();
|
||||||
let center = layout.primitive(dot).shape().center();
|
|
||||||
|
|
||||||
self.triangulation
|
match node {
|
||||||
.add_vertex(dot.into(), center.x(), center.y());
|
Index::FixedDot(fixed_dot) => {
|
||||||
|
self.triangulation
|
||||||
|
.add_vertex(fixed_dot.into(), center.x(), center.y())?;
|
||||||
|
}
|
||||||
|
Index::FixedBend(fixed_bend) => {
|
||||||
|
self.triangulation
|
||||||
|
.add_vertex(fixed_bend.into(), center.x(), center.y())?;
|
||||||
|
}
|
||||||
|
/*Index::LooseBend(loose_bend) => {
|
||||||
|
self.triangulation.add_bend(
|
||||||
|
loose_bend.into(),
|
||||||
|
layout.primitive(loose_bend).core().into(),
|
||||||
|
);
|
||||||
|
}*/
|
||||||
|
_ => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,22 @@ pub trait GetFirstLayer: GetGraph + GetNodeIndex {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait GetCore: GetGraph + GetNodeIndex {
|
||||||
|
fn core(&self) -> FixedDotIndex {
|
||||||
|
self.graph()
|
||||||
|
.neighbors(self.node_index())
|
||||||
|
.filter(|ni| {
|
||||||
|
self.graph()
|
||||||
|
.edge_weight(self.graph().find_edge(self.node_index(), *ni).unwrap())
|
||||||
|
.unwrap()
|
||||||
|
.is_core()
|
||||||
|
})
|
||||||
|
.map(|ni| FixedDotIndex::new(ni))
|
||||||
|
.next()
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait GetOuter: GetGraph + GetNodeIndex {
|
pub trait GetOuter: GetGraph + GetNodeIndex {
|
||||||
fn outer(&self) -> Option<LooseBendIndex> {
|
fn outer(&self) -> Option<LooseBendIndex> {
|
||||||
self.graph()
|
self.graph()
|
||||||
|
|
@ -107,19 +123,6 @@ impl<'a, W> GenericPrimitive<'a, W> {
|
||||||
Self { index, graph }
|
Self { index, graph }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn core(&self) -> Option<FixedDotIndex> {
|
|
||||||
self.graph
|
|
||||||
.neighbors(self.index.node_index())
|
|
||||||
.filter(|ni| {
|
|
||||||
self.graph
|
|
||||||
.edge_weight(self.graph.find_edge(self.index.node_index(), *ni).unwrap())
|
|
||||||
.unwrap()
|
|
||||||
.is_core()
|
|
||||||
})
|
|
||||||
.map(|ni| FixedDotIndex::new(ni))
|
|
||||||
.next()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn tagged_weight(&self) -> Weight {
|
fn tagged_weight(&self) -> Weight {
|
||||||
*self.graph.node_weight(self.index.node_index()).unwrap()
|
*self.graph.node_weight(self.index.node_index()).unwrap()
|
||||||
}
|
}
|
||||||
|
|
@ -204,7 +207,6 @@ impl<'a> MakeShape for FixedDot<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> TraverseOutward for FixedDot<'a> {}
|
impl<'a> TraverseOutward for FixedDot<'a> {}
|
||||||
|
|
||||||
impl<'a> GetFirstLayer for FixedDot<'a> {}
|
impl<'a> GetFirstLayer for FixedDot<'a> {}
|
||||||
|
|
||||||
pub type LooseDot<'a> = GenericPrimitive<'a, LooseDotWeight>;
|
pub type LooseDot<'a> = GenericPrimitive<'a, LooseDotWeight>;
|
||||||
|
|
@ -342,7 +344,7 @@ impl<'a> FixedBend<'a> {
|
||||||
if let Some(inner) = self.inner() {
|
if let Some(inner) = self.inner() {
|
||||||
inner.into()
|
inner.into()
|
||||||
} else {
|
} else {
|
||||||
self.core().unwrap().into()
|
self.core().into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -371,8 +373,7 @@ impl<'a> FixedBend<'a> {
|
||||||
let core_circle = self
|
let core_circle = self
|
||||||
.primitive(
|
.primitive(
|
||||||
self.primitive(FixedBendIndex::new(self.index.node_index()))
|
self.primitive(FixedBendIndex::new(self.index.node_index()))
|
||||||
.core()
|
.core(),
|
||||||
.unwrap(),
|
|
||||||
)
|
)
|
||||||
.weight()
|
.weight()
|
||||||
.circle;
|
.circle;
|
||||||
|
|
@ -381,7 +382,7 @@ impl<'a> FixedBend<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cross_product(&self) -> f64 {
|
pub fn cross_product(&self) -> f64 {
|
||||||
let center = self.primitive(self.core().unwrap()).weight().circle.pos;
|
let center = self.primitive(self.core()).weight().circle.pos;
|
||||||
let ends = self.ends();
|
let ends = self.ends();
|
||||||
let end1 = self.primitive(ends.0).weight().circle.pos;
|
let end1 = self.primitive(ends.0).weight().circle.pos;
|
||||||
let end2 = self.primitive(ends.1).weight().circle.pos;
|
let end2 = self.primitive(ends.1).weight().circle.pos;
|
||||||
|
|
@ -403,7 +404,7 @@ impl<'a> MakeShape for FixedBend<'a> {
|
||||||
from: self.primitive(ends.0).weight().circle.pos,
|
from: self.primitive(ends.0).weight().circle.pos,
|
||||||
to: self.primitive(ends.1).weight().circle.pos,
|
to: self.primitive(ends.1).weight().circle.pos,
|
||||||
c: Circle {
|
c: Circle {
|
||||||
pos: self.primitive(self.core().unwrap()).weight().circle.pos,
|
pos: self.primitive(self.core()).weight().circle.pos,
|
||||||
r: self.inner_radius(),
|
r: self.inner_radius(),
|
||||||
},
|
},
|
||||||
width: self.width(),
|
width: self.width(),
|
||||||
|
|
@ -424,11 +425,9 @@ impl<'a> GetEnds<FixedDotIndex, FixedDotIndex> for FixedBend<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> GetOtherEnd<FixedDotIndex, FixedDotIndex> for FixedBend<'a> {}
|
impl<'a> GetOtherEnd<FixedDotIndex, FixedDotIndex> for FixedBend<'a> {}
|
||||||
|
|
||||||
impl<'a> TraverseOutward for FixedBend<'a> {}
|
impl<'a> TraverseOutward for FixedBend<'a> {}
|
||||||
|
|
||||||
impl<'a> GetFirstLayer for FixedBend<'a> {}
|
impl<'a> GetFirstLayer for FixedBend<'a> {}
|
||||||
|
impl<'a> GetCore for FixedBend<'a> {} // TODO: Fixed bends don't have cores actually.
|
||||||
impl<'a> GetOuter for FixedBend<'a> {}
|
impl<'a> GetOuter for FixedBend<'a> {}
|
||||||
|
|
||||||
pub type LooseBend<'a> = GenericPrimitive<'a, LooseBendWeight>;
|
pub type LooseBend<'a> = GenericPrimitive<'a, LooseBendWeight>;
|
||||||
|
|
@ -459,8 +458,7 @@ impl<'a> LooseBend<'a> {
|
||||||
let core_circle = self
|
let core_circle = self
|
||||||
.primitive(
|
.primitive(
|
||||||
self.primitive(LooseBendIndex::new(self.index.node_index()))
|
self.primitive(LooseBendIndex::new(self.index.node_index()))
|
||||||
.core()
|
.core(),
|
||||||
.unwrap(),
|
|
||||||
)
|
)
|
||||||
.weight()
|
.weight()
|
||||||
.circle;
|
.circle;
|
||||||
|
|
@ -483,7 +481,7 @@ impl<'a> MakeShape for LooseBend<'a> {
|
||||||
from: self.primitive(ends.0).weight().circle.pos,
|
from: self.primitive(ends.0).weight().circle.pos,
|
||||||
to: self.primitive(ends.1).weight().circle.pos,
|
to: self.primitive(ends.1).weight().circle.pos,
|
||||||
c: Circle {
|
c: Circle {
|
||||||
pos: self.primitive(self.core().unwrap()).weight().circle.pos,
|
pos: self.primitive(self.core()).weight().circle.pos,
|
||||||
r: self.inner_radius(),
|
r: self.inner_radius(),
|
||||||
},
|
},
|
||||||
width: self.width(),
|
width: self.width(),
|
||||||
|
|
@ -510,5 +508,5 @@ impl<'a> GetEnds<LooseDotIndex, LooseDotIndex> for LooseBend<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> GetOtherEnd<LooseDotIndex, LooseDotIndex> for LooseBend<'a> {}
|
impl<'a> GetOtherEnd<LooseDotIndex, LooseDotIndex> for LooseBend<'a> {}
|
||||||
|
impl<'a> GetCore for LooseBend<'a> {}
|
||||||
impl<'a> GetOuter for LooseBend<'a> {}
|
impl<'a> GetOuter for LooseBend<'a> {}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue