Problem 52334. ICFP2021 Hole-In-Wall: Figure Validation with Segment Crossing and Segment on Wall Checks
The contest folds the figure in Red to fit within the hole shown in light grey ![](data:image/png;base64,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)
This Challenge is to evaluate the complete Figure validation defined in the Specification when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole. The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.
Valid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)<= epsilon/1000000. Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey. 4) Pathological cases of Segments crossing Wall region between Hole Vertices or from figure vertices on Hole edges is not allowed.
Valid=check_figureSP(hxy, pxy, mseg, epsilon, npxy)
Crossing Segments appears in Cody 1720 but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.
The ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use Register Team. Anyone can select Problems Page and then click problem numbers to see the puzzles and to download problem files.
Solution Stats
Solution Comments
Show commentsProblem Recent Solvers2
Suggested Problems
-
17963 Solvers
-
Get the area codes from a list of phone numbers
1051 Solvers
-
The Hitchhiker's Guide to MATLAB
3280 Solvers
-
Solve the set of simultaneous linear equations
414 Solvers
-
930 Solvers
More from this Author308
Problem Tags
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!