dimforge / dimforge/ncollide

Segment <-> Cuboid contact query broken

Open
#343 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
926
Forks
104
PR merge metrics
No merged PRs in 30d

Description

The build-in segment cuboid function often gives wrong results, or rather misses out on parts.

Code example plus working own implementation:

```rust
fn test_line_box(){
// wtf-> x_min: 114.899994, x_max: , y_min: 703.65, y_max: 1142.6; seg: Segment { a: Point { coords: Matrix { data: [-1087.5709, -369.54813] } }, b: Point { coords: Matrix { data: [600.0, 1087.5] } } }
let min = Point2::new(114.899994, 703.65);
let max = Point2::new(725.1, 1142.6);

let diff = min - max;
let center = nalgebra::center(&min, &max);

let p1 = Point2::new(-1087.5709, -369.54813);
let p2 = Point2::new(600.0, 1087.5);

let c = Cuboid::new( Vector2::new((diff[0] as f32).abs() /2f32, (diff[1] as f32).abs() / 2f32));
let c_iso = Isometry::translation(center[0], center[1]);

let seg = Segment::new(p1, p2);
let seg_iso = Isometry::::identity();

let res = nc::query::contact(&c_iso, &c, &seg_iso, &seg, 0.1f32);
let own = collide_own(min[0], max[0], min[1], max[1], &seg);

println!("res: {:?} <-> own: {}", res, own);
}

fn collide_own(
min_x: f32,
max_x: f32,
min_y: f32,
max_y: f32,
seg: &Segment
) -> bool {
let s1 = Segment::new(Point2::new(min_x, min_y), Point2::new(max_x, min_y));
let s2 = Segment::new(Point2::new(min_x, max_y), Point2::new(max_x, max_y));

let s3 = Segment::new(Point2::new(min_x, min_y), Point2::new(min_x, max_y));
let s4 = Segment::new(Point2::new(max_x, min_y), Point2::new(max_x, max_y));

let res1 = nc::query::closest_points_segment_segment(&Isometry::::identity(), seg, &Isometry::::identity(), &s1, 0.1);
let res2 = nc::query::closest_points_segment_segment(&Isometry::::identity(), seg, &Isometry::::identity(), &s2, 0.1);
let res3 = nc::query::closest_points_segment_segment(&Isometry::::identity(), seg, &Isometry::::identity(), &s3, 0.1);
let res4 = nc::query::closest_points_segment_segment(&Isometry::::identity(), seg, &Isometry::::identity(), &s4, 0.1);

match res1 {
nc::query::ClosestPoints::Intersecting => { return true; }
nc::query::ClosestPoints::WithinMargin(_, _) => { return true; }
nc::query::ClosestPoints::Disjoint => {}
};

match res2 {
nc::query::ClosestPoints::Intersecting => { return true; }
nc::query::ClosestPoints::WithinMargin(_, _) => { return true; }
nc::query::ClosestPoints::Disjoint => {}
};

match res3 {
nc::query::ClosestPoints::Intersecting => { return true; }
nc::query::ClosestPoints::WithinMargin(_, _) => { return true; }
nc::query::ClosestPoints::Disjoint => {}
};

match res4 {
nc::query::ClosestPoints::Intersecting => { return true; }
nc::query::ClosestPoints::WithinMargin(_, _) => { return true; }
nc::query::ClosestPoints::Disjoint => {}
};

return false;
}
```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.