Initial data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 72d218235f
commit f23f22d71c
199087 changed files with 3378941 additions and 0 deletions

View file

@ -0,0 +1,17 @@
const E = 0.0001;
fcn rayHitsSeg([(Px,Py)],[(Ax,Ay)],[(Bx,By)]){ // --> Bool
if(Py==Ay or Py==By) Py+=E;
if(Py<Ay or Py>By or Px>Ax.max(Bx)) False
else if(Px<Ax.min(Bx)) True
else try{ ( (Py - Ay)/(Px - Ax) )>=( (By - Ay)/(Bx - Ax) ) } //blue>=red
catch(MathError){ Px==Ax } // divide by zero == ∞, only blue?
}
fcn pointInPoly(point, polygon){ // --> Bool, polygon is ( (a,b),(c,d).. )
polygon.filter('wrap([(ab,cd)]){ a,b:=ab; c,d:=cd;
if(b<=d) rayHitsSeg(point,ab,cd); // left point has smallest y coordinate
else rayHitsSeg(point,cd,ab);
})
.len().isOdd; // True if crossed an odd number of borders ie inside polygon
}

View file

@ -0,0 +1,50 @@
polys:=T( //(name,( ((a,b),(c,d)),((a,b),(c,d))... ), ... )==(nm,(ln,ln..) ..)
T("squared",
T(T(T( 0.0, 0.0), T(10.0, 0.0)),
T(T(10.0, 0.0), T(10.0, 10.0)),
T(T(10.0, 10.0), T( 0.0, 10.0)),
T(T( 0.0, 10.0), T( 0.0, 0.0)))),
T("squaredhole",
T(T(T( 0.0, 0.0), T(10.0, 0.0)),
T(T(10.0, 0.0), T(10.0, 10.0)),
T(T(10.0, 10.0), T( 0.0, 10.0)),
T(T( 0.0, 10.0), T( 0.0, 0.0)),
T(T( 2.5, 2.5), T( 7.5, 2.5)),
T(T( 7.5, 2.5), T( 7.5, 7.5)),
T(T( 7.5, 7.5), T( 2.5, 7.5)),
T(T( 2.5, 7.5), T( 2.5, 2.5)))),
T("strange",
T(T(T( 0.0, 0.0), T( 2.5, 2.5)),
T(T( 2.5, 2.5), T( 0.0, 10.0)),
T(T( 0.0, 10.0), T( 2.5, 7.5)),
T(T( 2.5, 7.5), T( 7.5, 7.5)),
T(T( 7.5, 7.5), T(10.0, 10.0)),
T(T(10.0, 10.0), T(10.0, 0.0)),
T(T(10.0, 0.0), T( 2.5, 2.5)),
T(T( 2.5, 2.5), T( 0.0, 0.0)))), # conjecturally close polygon
T("exagon",
T(T(T( 3.0, 0.0), T( 7.0, 0.0)),
T(T( 7.0, 0.0), T(10.0, 5.0)),
T(T(10.0, 5.0), T( 7.0, 10.0)),
T(T( 7.0, 10.0), T( 3.0, 10.0)),
T(T( 3.0, 10.0), T( 0.0, 5.0)),
T(T( 0.0, 5.0), T( 3.0, 0.0)))),
);
testPoints:=T(
T( 5.0, 5.0),
T( 5.0, 8.0),
T(-10.0, 5.0),
T( 0.0, 5.0),
T( 10.0, 5.0),
T( 8.0, 5.0),
T( 10.0, 10.0)
);
foreach name,polywanna in (polys){
name.println();
foreach testPoint in (testPoints){
println("\t(%6.1f,%6.1f)\t".fmt(testPoint.xplode()),
pointInPoly(testPoint,polywanna) and "IN" or "OUT");
}
}