mirror of https://codeberg.org/topola/topola.git
Fix dot-bend collision detection
Fixes bend AABB calculation and the actual circle-arc intersection algorithm.
This commit is contained in:
parent
4f473bacec
commit
6e87f9c124
|
|
@ -191,7 +191,7 @@ fn main() {
|
||||||
.add_dot(DotWeight {
|
.add_dot(DotWeight {
|
||||||
net: 0,
|
net: 0,
|
||||||
circle: Circle {
|
circle: Circle {
|
||||||
pos: (190.5, 100.5).into(),
|
pos: (190.5, 200.5).into(),
|
||||||
r: 8.0,
|
r: 8.0,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
@ -248,7 +248,7 @@ fn main() {
|
||||||
let _ = layout.add_seg(barrier2_dot1, barrier2_dot2, 16.0);
|
let _ = layout.add_seg(barrier2_dot1, barrier2_dot2, 16.0);
|
||||||
|
|
||||||
let head = layout.route_start(dot5);
|
let head = layout.route_start(dot5);
|
||||||
let head = layout.route_around_dot(head, dot6, true, 5.0).unwrap();
|
let head = layout.route_around_dot(head, dot6, false, 5.0).unwrap();
|
||||||
let _ = layout.route_finish(head, dot7, 5.0);
|
let _ = layout.route_finish(head, dot7, 5.0);
|
||||||
|
|
||||||
/*render_times(&mut event_pump, &mut canvas, &mut layout, None, -1);
|
/*render_times(&mut event_pump, &mut canvas, &mut layout, None, -1);
|
||||||
|
|
|
||||||
25
src/shape.rs
25
src/shape.rs
|
|
@ -47,14 +47,14 @@ impl BendShape {
|
||||||
fn inner_circle(&self) -> Circle {
|
fn inner_circle(&self) -> Circle {
|
||||||
Circle {
|
Circle {
|
||||||
pos: self.center,
|
pos: self.center,
|
||||||
r: self.center.euclidean_distance(&self.from) - self.width / 2.,
|
r: self.center.euclidean_distance(&self.from) - self.width / 2.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn outer_circle(&self) -> Circle {
|
fn outer_circle(&self) -> Circle {
|
||||||
Circle {
|
Circle {
|
||||||
pos: self.center,
|
pos: self.center,
|
||||||
r: self.center.euclidean_distance(&self.from) + self.width / 2.,
|
r: self.center.euclidean_distance(&self.from) + self.width / 2.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -97,26 +97,26 @@ impl Shape {
|
||||||
Shape::Seg(other) => dot.c.pos.euclidean_distance(&other.polygon()) < dot.c.r,
|
Shape::Seg(other) => dot.c.pos.euclidean_distance(&other.polygon()) < dot.c.r,
|
||||||
Shape::Bend(other) => {
|
Shape::Bend(other) => {
|
||||||
for point in math::circles_intersection(&dot.c, &other.inner_circle()) {
|
for point in math::circles_intersection(&dot.c, &other.inner_circle()) {
|
||||||
if !math::between_vectors(
|
if math::between_vectors(
|
||||||
point - other.center,
|
point - other.center,
|
||||||
other.from - other.center,
|
other.from - other.center,
|
||||||
other.to - other.center,
|
other.to - other.center,
|
||||||
) {
|
) {
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for point in math::circles_intersection(&dot.c, &other.outer_circle()) {
|
for point in math::circles_intersection(&dot.c, &other.outer_circle()) {
|
||||||
if !math::between_vectors(
|
if math::between_vectors(
|
||||||
point - other.center,
|
point - other.center,
|
||||||
other.from - other.center,
|
other.from - other.center,
|
||||||
other.to - other.center,
|
other.to - other.center,
|
||||||
) {
|
) {
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
true
|
false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Shape::Seg(seg) => {
|
Shape::Seg(seg) => {
|
||||||
|
|
@ -154,10 +154,13 @@ impl Shape {
|
||||||
.collect();
|
.collect();
|
||||||
AABB::<[f64; 2]>::from_points(points.iter())
|
AABB::<[f64; 2]>::from_points(points.iter())
|
||||||
}
|
}
|
||||||
Shape::Bend(bend) => AABB::<[f64; 2]>::from_points(&[
|
Shape::Bend(bend) => {
|
||||||
[bend.from.x() - bend.width, bend.from.y() - bend.width],
|
let halfwidth = bend.center.euclidean_distance(&bend.from).ceil() + bend.width;
|
||||||
[bend.to.x() + bend.width, bend.to.y() + bend.width],
|
AABB::from_corners(
|
||||||
]),
|
[bend.center.x() - halfwidth, bend.center.y() - halfwidth],
|
||||||
|
[bend.center.x() + halfwidth, bend.center.y() + halfwidth],
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue