let ex1 = [[0, 0], [1, 2], [2, 0], [0, 1], [2, 1]];
let ex2 = [[0, 0], [1, 2], [2, 0], [0, 2], [2, 2]];
let ex3 = [[0, 0], [0, 1], [1, 2], [2, 1], [2, 0]];
let ex4 = [[0, 0], [5, 5], [0, 5], [1, 0], [1, 6]];
console.log(isStar(ex1));
console.log(isStar(ex2));
console.log(isStar(ex3));
console.log(isStar(ex4));
function isStar(points) {
return cross(points[0], points[1], points[2], points[3])
&& cross(points[1], points[2], points[3], points[4])
&& cross(points[2], points[3], points[4], points[0]);
}
// 線分a-bと線分c-dの交差判定
function cross(a, b, c, d) {
let s1 = (a[0] - b[0]) * (c[1] - a[1]) - (a[1] - b[1]) * (c[0] - a[0]);
let t1 = (a[0] - b[0]) * (d[1] - a[1]) - (a[1] - b[1]) * (d[0] - a[0]);
if (s1 * t1 > -1e-100)
return false;
let s2 = (c[0] - d[0]) * (a[1] - c[1]) - (c[1] - d[1]) * (a[0] - c[0]);
let t2 = (c[0] - d[0]) * (b[1] - c[1]) - (c[1] - d[1]) * (b[0] - c[0]);
if (s2 * t2 > -1e-100)
return false;
return true;
}
bGV0IGV4MSA9IFtbMCwgMF0sIFsxLCAyXSwgWzIsIDBdLCBbMCwgMV0sIFsyLCAxXV07CmxldCBleDIgPSBbWzAsIDBdLCBbMSwgMl0sIFsyLCAwXSwgWzAsIDJdLCBbMiwgMl1dOwpsZXQgZXgzID0gW1swLCAwXSwgWzAsIDFdLCBbMSwgMl0sIFsyLCAxXSwgWzIsIDBdXTsKbGV0IGV4NCA9IFtbMCwgMF0sIFs1LCA1XSwgWzAsIDVdLCBbMSwgMF0sIFsxLCA2XV07Cgpjb25zb2xlLmxvZyhpc1N0YXIoZXgxKSk7CmNvbnNvbGUubG9nKGlzU3RhcihleDIpKTsKY29uc29sZS5sb2coaXNTdGFyKGV4MykpOwpjb25zb2xlLmxvZyhpc1N0YXIoZXg0KSk7CgoKCmZ1bmN0aW9uIGlzU3Rhcihwb2ludHMpIHsKICAgIHJldHVybiBjcm9zcyhwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10pCiAgICAgICAgJiYgY3Jvc3MocG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgcG9pbnRzWzRdKQogICAgICAgICYmIGNyb3NzKHBvaW50c1syXSwgcG9pbnRzWzNdLCBwb2ludHNbNF0sIHBvaW50c1swXSk7Cn0KCgovLyDnt5rliIZhLWLjgajnt5rliIZjLWTjga7kuqTlt67liKTlrpoKZnVuY3Rpb24gY3Jvc3MoYSwgYiwgYywgZCkgewogICAgbGV0IHMxID0gKGFbMF0gLSBiWzBdKSAqIChjWzFdIC0gYVsxXSkgLSAoYVsxXSAtIGJbMV0pICogKGNbMF0gLSBhWzBdKTsKICAgIGxldCB0MSA9IChhWzBdIC0gYlswXSkgKiAoZFsxXSAtIGFbMV0pIC0gKGFbMV0gLSBiWzFdKSAqIChkWzBdIC0gYVswXSk7CiAgICBpZiAoczEgKiB0MSA+IC0xZS0xMDApCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGxldCBzMiA9IChjWzBdIC0gZFswXSkgKiAoYVsxXSAtIGNbMV0pIC0gKGNbMV0gLSBkWzFdKSAqIChhWzBdIC0gY1swXSk7CiAgICBsZXQgdDIgPSAoY1swXSAtIGRbMF0pICogKGJbMV0gLSBjWzFdKSAtIChjWzFdIC0gZFsxXSkgKiAoYlswXSAtIGNbMF0pOwogICAgaWYgKHMyICogdDIgID4gLTFlLTEwMCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAKICAgIHJldHVybiB0cnVlOwp9