mirror of https://codeberg.org/topola/topola.git
Make inner and outer circle obtainable from `Shape`
This commit is contained in:
parent
c7f89c9fb9
commit
356154c914
15
src/main.rs
15
src/main.rs
|
|
@ -216,7 +216,7 @@ fn main() {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let barrier1_dot2 = layout
|
/*let barrier1_dot2 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 10,
|
net: 10,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
|
|
@ -225,7 +225,7 @@ fn main() {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let _ = layout.add_seg(barrier1_dot1, barrier1_dot2, 16.0);
|
let _ = layout.add_seg(barrier1_dot1, barrier1_dot2, 16.0);*/
|
||||||
|
|
||||||
let barrier2_dot1 = layout
|
let barrier2_dot1 = layout
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
|
|
@ -381,9 +381,8 @@ fn render_times(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Shape::Bend(bend) => {
|
Shape::Bend(bend) => {
|
||||||
let delta1 = bend.from - bend.center;
|
let delta1 = bend.from - bend.c.pos;
|
||||||
let delta2 = bend.to - bend.center;
|
let delta2 = bend.to - bend.c.pos;
|
||||||
let r = bend.from.euclidean_distance(&bend.center);
|
|
||||||
|
|
||||||
let mut angle1 = delta1.y().atan2(delta1.x());
|
let mut angle1 = delta1.y().atan2(delta1.x());
|
||||||
let mut angle2 = delta2.y().atan2(delta2.x());
|
let mut angle2 = delta2.y().atan2(delta2.x());
|
||||||
|
|
@ -392,10 +391,10 @@ fn render_times(
|
||||||
let _ = canvas.arc(
|
let _ = canvas.arc(
|
||||||
//around_circle.pos.x() as i16,
|
//around_circle.pos.x() as i16,
|
||||||
//around_circle.pos.y() as i16,
|
//around_circle.pos.y() as i16,
|
||||||
bend.center.x() as i16,
|
bend.c.pos.x() as i16,
|
||||||
bend.center.y() as i16,
|
bend.c.pos.y() as i16,
|
||||||
//(shape.around_weight.unwrap().circle.r + 10.0 + (d as f64)) as i16,
|
//(shape.around_weight.unwrap().circle.r + 10.0 + (d as f64)) as i16,
|
||||||
(r + (d as f64)) as i16,
|
(bend.circle().r + (d as f64)) as i16,
|
||||||
angle1.to_degrees() as i16,
|
angle1.to_degrees() as i16,
|
||||||
angle2.to_degrees() as i16,
|
angle2.to_degrees() as i16,
|
||||||
Color::RGB(200, 52, 52),
|
Color::RGB(200, 52, 52),
|
||||||
|
|
|
||||||
|
|
@ -294,7 +294,6 @@ impl Mesh {
|
||||||
for edge in triangulation.directed_edges() {
|
for edge in triangulation.directed_edges() {
|
||||||
let from = edge.from().as_ref().index;
|
let from = edge.from().as_ref().index;
|
||||||
let to = edge.to().as_ref().index;
|
let to = edge.to().as_ref().index;
|
||||||
dbg!(from, to);
|
|
||||||
self.graph.add_edge(from, to, Label::Peer);
|
self.graph.add_edge(from, to, Label::Peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ use crate::graph::{
|
||||||
BendIndex, BendWeight, DotIndex, DotWeight, Index, Label, Path, SegIndex, SegWeight, Tag,
|
BendIndex, BendWeight, DotIndex, DotWeight, Index, Label, Path, SegIndex, SegWeight, Tag,
|
||||||
TaggedIndex, TaggedWeight,
|
TaggedIndex, TaggedWeight,
|
||||||
};
|
};
|
||||||
use crate::math;
|
use crate::math::{self, Circle};
|
||||||
use crate::shape::{BendShape, DotShape, SegShape, Shape};
|
use crate::shape::{BendShape, DotShape, SegShape, Shape};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -34,10 +34,14 @@ impl<'a, Weight> Primitive<'a, Weight> {
|
||||||
}
|
}
|
||||||
TaggedWeight::Bend(bend) => {
|
TaggedWeight::Bend(bend) => {
|
||||||
let ends = self.ends();
|
let ends = self.ends();
|
||||||
|
|
||||||
let mut bend_shape = BendShape {
|
let mut bend_shape = BendShape {
|
||||||
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,
|
||||||
center: self.primitive(self.core().unwrap()).weight().circle.pos,
|
c: Circle {
|
||||||
|
pos: self.primitive(self.core().unwrap()).weight().circle.pos,
|
||||||
|
r: self.inner_radius(),
|
||||||
|
},
|
||||||
width: self.primitive(ends[0]).weight().circle.r * 2.0,
|
width: self.primitive(ends[0]).weight().circle.r * 2.0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -49,6 +53,27 @@ impl<'a, Weight> Primitive<'a, Weight> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn inner_radius(&self) -> f64 {
|
||||||
|
let mut r = 0.0;
|
||||||
|
let mut layer = BendIndex::new(self.index.index);
|
||||||
|
|
||||||
|
while let Some(inner) = self.primitive(layer).inner() {
|
||||||
|
r += self.primitive(inner).shape().width();
|
||||||
|
layer = inner;
|
||||||
|
}
|
||||||
|
|
||||||
|
let core_circle = self
|
||||||
|
.primitive(
|
||||||
|
self.primitive(BendIndex::new(self.index.index))
|
||||||
|
.core()
|
||||||
|
.unwrap(),
|
||||||
|
)
|
||||||
|
.weight()
|
||||||
|
.circle;
|
||||||
|
|
||||||
|
core_circle.r + r + 5.0
|
||||||
|
}
|
||||||
|
|
||||||
pub fn neighbors(&self) -> impl Iterator<Item = TaggedIndex> + '_ {
|
pub fn neighbors(&self) -> impl Iterator<Item = TaggedIndex> + '_ {
|
||||||
self.graph
|
self.graph
|
||||||
.neighbors_undirected(self.index.index)
|
.neighbors_undirected(self.index.index)
|
||||||
|
|
|
||||||
36
src/shape.rs
36
src/shape.rs
|
|
@ -37,30 +37,34 @@ impl SegShape {
|
||||||
pub struct BendShape {
|
pub struct BendShape {
|
||||||
pub from: Point,
|
pub from: Point,
|
||||||
pub to: Point,
|
pub to: Point,
|
||||||
pub center: Point,
|
pub c: Circle,
|
||||||
pub width: f64,
|
pub width: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BendShape {
|
impl BendShape {
|
||||||
fn inner_circle(&self) -> Circle {
|
pub fn inner_circle(&self) -> Circle {
|
||||||
|
self.c
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn circle(&self) -> Circle {
|
||||||
Circle {
|
Circle {
|
||||||
pos: self.center,
|
pos: self.c.pos,
|
||||||
r: self.center.euclidean_distance(&self.from) - self.width / 2.0,
|
r: self.c.r + self.width / 2.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn outer_circle(&self) -> Circle {
|
pub fn outer_circle(&self) -> Circle {
|
||||||
Circle {
|
Circle {
|
||||||
pos: self.center,
|
pos: self.c.pos,
|
||||||
r: self.center.euclidean_distance(&self.from) + self.width / 2.0,
|
r: self.c.r + self.width,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn between_ends(&self, point: Point) -> bool {
|
fn between_ends(&self, point: Point) -> bool {
|
||||||
math::between_vectors(
|
math::between_vectors(
|
||||||
point - self.center,
|
point - self.c.pos,
|
||||||
self.from - self.center,
|
self.from - self.c.pos,
|
||||||
self.to - self.center,
|
self.to - self.c.pos,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -87,10 +91,8 @@ impl Shape {
|
||||||
Shape::Dot(dot) => dot.c.pos,
|
Shape::Dot(dot) => dot.c.pos,
|
||||||
Shape::Seg(seg) => (seg.from + seg.to) / 2.0,
|
Shape::Seg(seg) => (seg.from + seg.to) / 2.0,
|
||||||
Shape::Bend(bend) => {
|
Shape::Bend(bend) => {
|
||||||
let sum = (bend.from - bend.center) + (bend.to - bend.center);
|
let sum = (bend.from - bend.c.pos) + (bend.to - bend.c.pos);
|
||||||
let r = bend.from.euclidean_distance(&bend.center);
|
bend.c.pos + (sum / sum.euclidean_distance(&point! {x: 0.0, y: 0.0})) * bend.c.r
|
||||||
|
|
||||||
bend.center + (sum / sum.euclidean_distance(&point! {x: 0.0, y: 0.0})) * r
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -211,10 +213,10 @@ impl Shape {
|
||||||
AABB::<[f64; 2]>::from_points(points.iter())
|
AABB::<[f64; 2]>::from_points(points.iter())
|
||||||
}
|
}
|
||||||
Shape::Bend(bend) => {
|
Shape::Bend(bend) => {
|
||||||
let halfwidth = bend.center.euclidean_distance(&bend.from).ceil() + bend.width;
|
let halfwidth = bend.c.r + bend.width;
|
||||||
AABB::from_corners(
|
AABB::from_corners(
|
||||||
[bend.center.x() - halfwidth, bend.center.y() - halfwidth],
|
[bend.c.pos.x() - halfwidth, bend.c.pos.y() - halfwidth],
|
||||||
[bend.center.x() + halfwidth, bend.center.y() + halfwidth],
|
[bend.c.pos.x() + halfwidth, bend.c.pos.y() + halfwidth],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue