June 2018 Update

This commit is contained in:
Ingy döt Net 2018-06-22 20:57:24 +00:00
parent ba8067c3b7
commit 22f33d4004
5278 changed files with 84726 additions and 14379 deletions

View file

@ -0,0 +1,6 @@
p1 = Polygon[{{50, 150}, {200, 50}, {350, 150}, {350, 300}, {250, 300}, {200, 250}, {150, 350}, {100, 250}, {100, 200}}];
p2 = Polygon[{{100, 100}, {300, 100}, {300, 300}, {100, 300}}];
RegionIntersection[p1, p2]
Graphics[{Red, p1, Blue, p2, Green, RegionIntersection[p1, p2]}]

View file

@ -1,10 +1,10 @@
#[derive(Debug,Clone)]
#[derive(Debug, Clone)]
struct Point {
x: f64,
y: f64
y: f64,
}
#[derive(Debug,Clone)]
#[derive(Debug, Clone)]
struct Polygon(Vec<Point>);
fn is_inside(p: &Point, cp1: &Point, cp2: &Point) -> bool {
@ -12,32 +12,38 @@ fn is_inside(p: &Point, cp1: &Point, cp2: &Point) -> bool {
}
fn compute_intersection(cp1: &Point, cp2: &Point, s: &Point, e: &Point) -> Point {
let dc = Point {x: cp1.x - cp2.x, y: cp1.y - cp2.y};
let dp = Point {x: s.x - e.x, y: s.y - e.y};
let dc = Point {
x: cp1.x - cp2.x,
y: cp1.y - cp2.y,
};
let dp = Point {
x: s.x - e.x,
y: s.y - e.y,
};
let n1 = cp1.x * cp2.y - cp1.y * cp2.x;
let n2 = s.x * e.y - s.y * e.x;
let n3 = 1.0 / (dc.x * dp.y - dc.y * dp.x);
Point {
x: (n1 * dp.x - n2 * dc.x) * n3,
y: (n1 * dp.y - n2 * dc.y) * n3
y: (n1 * dp.y - n2 * dc.y) * n3,
}
}
fn sutherland_hodgman_clip(subject_polygon: &Polygon, clip_polygon: &Polygon) -> Polygon {
let mut result_ring = subject_polygon.0.clone();
let mut cp1 = clip_polygon.0.last().unwrap();
for cp2 in clip_polygon.0.iter() {
for cp2 in &clip_polygon.0 {
let input = result_ring;
let mut s = input.last().unwrap();
result_ring = vec![];
for e in input.iter() {
if is_inside(&e, &cp1, &cp2) {
if !is_inside(&s, &cp1, &cp2){
result_ring.push(compute_intersection(&cp1, &cp2, &s, &e));
for e in &input {
if is_inside(e, cp1, cp2) {
if !is_inside(s, cp1, cp2) {
result_ring.push(compute_intersection(cp1, cp2, s, e));
}
result_ring.push(e.clone());
} else if is_inside(&s, &cp1, &cp2){
result_ring.push(compute_intersection(&cp1, &cp2, &s, &e));
} else if is_inside(s, cp1, cp2) {
result_ring.push(compute_intersection(cp1, cp2, s, e));
}
s = e;
}
@ -46,13 +52,15 @@ fn sutherland_hodgman_clip(subject_polygon: &Polygon, clip_polygon: &Polygon) ->
Polygon(result_ring)
}
fn main(){
let _p = |x: f64, y: f64| Point {x: x, y: y};
let subject_polygon = Polygon(
vec![_p(50.0, 150.0), _p(200.0, 50.0), _p(350.0, 150.0), _p(350.0, 300.0),
_p(250.0, 300.0), _p(200.0, 250.0), _p(150.0, 350.0), _p(100.0, 250.0), _p(100.0, 200.0)]);
let clip_polygon = Polygon(
vec![_p(100.0, 100.0), _p(300.0, 100.0), _p(300.0, 300.0), _p(100.0, 300.0)]);
fn main() {
let _p = |x: f64, y: f64| Point { x, y };
let subject_polygon = Polygon(vec![
_p(50.0, 150.0), _p(200.0, 50.0), _p(350.0, 150.0), _p(350.0, 300.0), _p(250.0, 300.0),
_p(200.0, 250.0), _p(150.0, 350.0), _p(100.0, 250.0), _p(100.0, 200.0),
]);
let clip_polygon = Polygon(vec![
_p(100.0, 100.0),_p(300.0, 100.0),_p(300.0, 300.0),_p(100.0, 300.0),
]);
let result = sutherland_hodgman_clip(&subject_polygon, &clip_polygon);
println!("{:?}", result);
}