mirror of https://codeberg.org/topola/topola.git
shape,layout: restore and fix bend-seg collision detection
This commit is contained in:
parent
7fdf90b126
commit
b66995b30c
|
|
@ -120,8 +120,8 @@ impl ShapeTrait for SegShape {
|
||||||
match other {
|
match other {
|
||||||
Shape::Dot(..) => unreachable!(),
|
Shape::Dot(..) => unreachable!(),
|
||||||
Shape::Seg(other) => self.polygon().intersects(&other.polygon()),
|
Shape::Seg(other) => self.polygon().intersects(&other.polygon()),
|
||||||
Shape::Bend(_other) => {
|
Shape::Bend(other) => {
|
||||||
/*for segment in self.polygon().exterior().lines() {
|
for segment in self.polygon().exterior().lines() {
|
||||||
let inner_circle = other.inner_circle();
|
let inner_circle = other.inner_circle();
|
||||||
let outer_circle = other.outer_circle();
|
let outer_circle = other.outer_circle();
|
||||||
|
|
||||||
|
|
@ -136,7 +136,7 @@ impl ShapeTrait for SegShape {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}*/
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ use crate::layout::geometry::{
|
||||||
SegWeightTrait,
|
SegWeightTrait,
|
||||||
};
|
};
|
||||||
use crate::layout::guide::Guide;
|
use crate::layout::guide::Guide;
|
||||||
|
use crate::layout::primitive::GetLimbs;
|
||||||
use crate::layout::rules::{Conditions, GetConditions};
|
use crate::layout::rules::{Conditions, GetConditions};
|
||||||
use crate::layout::{
|
use crate::layout::{
|
||||||
bend::{FixedBendIndex, LooseBendIndex, LooseBendWeight},
|
bend::{FixedBendIndex, LooseBendIndex, LooseBendWeight},
|
||||||
|
|
@ -852,6 +853,14 @@ impl<R: RulesTrait> Layout<R> {
|
||||||
let old_pos = self.geometry_with_rtree.geometry().dot_weight(dot).pos();
|
let old_pos = self.geometry_with_rtree.geometry().dot_weight(dot).pos();
|
||||||
self.geometry_with_rtree.move_dot(dot, to);
|
self.geometry_with_rtree.move_dot(dot, to);
|
||||||
|
|
||||||
|
for limb in dot.primitive(self).limbs() {
|
||||||
|
if let Some(infringement) = self.detect_infringement_except(limb.into(), infringables) {
|
||||||
|
// Restore original state.
|
||||||
|
self.geometry_with_rtree.move_dot(dot, old_pos);
|
||||||
|
return Err(infringement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(infringement) = self.detect_infringement_except(dot.into(), infringables) {
|
if let Some(infringement) = self.detect_infringement_except(dot.into(), infringables) {
|
||||||
// Restore original state.
|
// Restore original state.
|
||||||
self.geometry_with_rtree.move_dot(dot, old_pos);
|
self.geometry_with_rtree.move_dot(dot, old_pos);
|
||||||
|
|
|
||||||
|
|
@ -523,8 +523,8 @@ fn main() -> Result<(), anyhow::Error> {
|
||||||
dot_start,
|
dot_start,
|
||||||
dot_end,
|
dot_end,
|
||||||
3.0,
|
3.0,
|
||||||
&mut EmptyRouterObserver,
|
//&mut EmptyRouterObserver,
|
||||||
//&mut DebugRouterObserver::new(&mut event_pump, &window, &mut renderer, &font_context),
|
&mut DebugRouterObserver::new(&mut event_pump, &window, &mut renderer, &font_context),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
render_times(
|
render_times(
|
||||||
|
|
|
||||||
28
src/math.rs
28
src/math.rs
|
|
@ -191,14 +191,30 @@ pub fn intersect_circle_segment(circle: &Circle, segment: &Line) -> Vec<Point> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if discriminant == 0.0 {
|
if discriminant == 0.0 {
|
||||||
return [from + (to - from) * -b / (2.0 * a)].into();
|
let u = -b / (2.0 * a);
|
||||||
|
|
||||||
|
if u >= 0.0 && u <= 1.0 {
|
||||||
|
return [from + (to - from) * -b / (2.0 * a)].into();
|
||||||
|
} else {
|
||||||
|
return [].into();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[
|
let mut v = vec![];
|
||||||
from + (to - from) * (-b + discriminant.sqrt()) / (2.0 * a),
|
|
||||||
from + (to - from) * (-b - discriminant.sqrt()) / (2.0 * a),
|
let u1 = (-b + discriminant.sqrt()) / (2.0 * a);
|
||||||
]
|
|
||||||
.into()
|
if u1 >= 0.0 && u1 <= 1.0 {
|
||||||
|
v.push(from + (to - from) * u1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let u2 = (-b - discriminant.sqrt()) / (2.0 * a);
|
||||||
|
|
||||||
|
if u2 >= 0.0 && u2 <= 1.0 {
|
||||||
|
v.push(from + (to - from) * u2);
|
||||||
|
}
|
||||||
|
|
||||||
|
v
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn between_vectors(p: Point, from: Point, to: Point) -> bool {
|
pub fn between_vectors(p: Point, from: Point, to: Point) -> bool {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue