|
1 | 1 | package dev.felnull.fnjl.util; |
2 | 2 |
|
3 | | -import dev.felnull.fnjl.math.FNComplex; |
4 | | -import dev.felnull.fnjl.math.FNVec2d; |
5 | | -import dev.felnull.fnjl.math.FNVec2f; |
6 | | -import dev.felnull.fnjl.math.FNVec2i; |
| 3 | +import dev.felnull.fnjl.math.*; |
7 | 4 | import dev.felnull.fnjl.tuple.FNPair; |
8 | 5 | import dev.felnull.fnjl.tuple.FNQuadruple; |
9 | 6 | import dev.felnull.fnjl.tuple.FNTriple; |
@@ -529,6 +526,91 @@ public static float lerpRoted(float delta, float old, float value, float maxValu |
529 | 526 | return lerp(delta, old, value); |
530 | 527 | } |
531 | 528 |
|
| 529 | + /** |
| 530 | + * 二つの2次元の線の交差点 |
| 531 | + * |
| 532 | + * @param line1 線1 |
| 533 | + * @param line2 線2 |
| 534 | + * @return 交差点座標 |
| 535 | + * @see <a href="https://asakaze-net.jp/webcalc/webcalc_p10.asp">確認 </a> <a href="https://mf-atelier.sakura.ne.jp/mf-atelier2/a1/">参考</a> |
| 536 | + */ |
| 537 | + public static FNVec2d getLinesIntersectPoint(FNVec4d line1, FNVec4d line2) { |
| 538 | + double x = (line2.getY() * line2.getZ() - line2.getX() * line2.getW()) * (line1.getZ() - line1.getX()) - (line1.getY() * line1.getZ() - line1.getX() * line1.getW()) * (line2.getZ() - line2.getX()); |
| 539 | + x /= (line1.getW() - line1.getY()) * (line2.getZ() - line2.getX()) - (line1.getZ() - line1.getX()) * (line2.getW() - line2.getY()); |
| 540 | + |
| 541 | + double y = (line2.getY() * line2.getZ() - line2.getX() * line2.getW()) * (line1.getW() - line1.getY()) - (line1.getY() * line1.getZ() - line1.getX() * line1.getW()) * (line2.getW() - line2.getY()); |
| 542 | + y /= (line1.getW() - line1.getY()) * (line2.getZ() - line2.getX()) - (line1.getZ() - line1.getX()) * (line2.getW() - line2.getY()); |
| 543 | + |
| 544 | + if (!Double.isFinite(x) || !Double.isFinite(y)) |
| 545 | + return null; |
| 546 | + return new FNVec2d(x, y); |
| 547 | + } |
| 548 | + |
| 549 | + /** |
| 550 | + * 二つの2次元の線の交差点 |
| 551 | + * |
| 552 | + * @param line1 線1 |
| 553 | + * @param line2 線2 |
| 554 | + * @return 交差点座標 |
| 555 | + * @see <a href="https://www.s-projects.net/line-line.html">確認1 </a><a href="https://asakaze-net.jp/webcalc/webcalc_p10.asp">確認2 </a> <a href="https://mf-atelier.sakura.ne.jp/mf-atelier2/a1/">参考</a> |
| 556 | + */ |
| 557 | + public static FNVec2d getLinesIntersectPoint(FN2dLine line1, FN2dLine line2) { |
| 558 | + double x = (line2.getFromY() * line2.getToX() - line2.getFromX() * line2.getToY()) * (line1.getToX() - line1.getFromX()) - (line1.getFromY() * line1.getToX() - line1.getFromX() * line1.getToY()) * (line2.getToX() - line2.getFromX()); |
| 559 | + x /= (line1.getToY() - line1.getFromY()) * (line2.getToX() - line2.getFromX()) - (line1.getToX() - line1.getFromX()) * (line2.getToY() - line2.getFromY()); |
| 560 | + |
| 561 | + double y = (line2.getFromY() * line2.getToX() - line2.getFromX() * line2.getToY()) * (line1.getToY() - line1.getFromY()) - (line1.getFromY() * line1.getToX() - line1.getFromX() * line1.getToY()) * (line2.getToY() - line2.getFromY()); |
| 562 | + y /= (line1.getToY() - line1.getFromY()) * (line2.getToX() - line2.getFromX()) - (line1.getToX() - line1.getFromX()) * (line2.getToY() - line2.getFromY()); |
| 563 | + |
| 564 | + if (!Double.isFinite(x) || !Double.isFinite(y)) |
| 565 | + return null; |
| 566 | + return new FNVec2d(x, y); |
| 567 | + } |
| 568 | + |
| 569 | + /** |
| 570 | + * 指定の線の上に点があるかどうか |
| 571 | + * |
| 572 | + * @param line 線 |
| 573 | + * @param point 点 |
| 574 | + * @return 存在するかどうか |
| 575 | + * @see <a href="https://zaki0929.github.io/page34.html">参考</a> |
| 576 | + */ |
| 577 | + public static boolean isPointOnLine(FN2dLine line, FNVec2d point) { |
| 578 | + if ((line.getFromX() <= point.getX() && point.getX() <= line.getToX()) || (line.getToX() <= point.getX() && point.getX() <= line.getToX())) { |
| 579 | + if ((line.getFromY() <= point.getY() && point.getY() <= line.getToY()) || (line.getToY() <= point.getY() && point.getY() <= line.getFromY())) { |
| 580 | + return (point.getY() * (line.getFromX() - line.getToX())) + (line.getFromY() * (line.getToX() - point.getX())) + (line.getToY() * (point.getX() - line.getFromX())) == 0; |
| 581 | + } |
| 582 | + } |
| 583 | + return false; |
| 584 | + } |
| 585 | + |
| 586 | + /** |
| 587 | + * 2点の線の角度を求める |
| 588 | + * |
| 589 | + * @param from 開始点 |
| 590 | + * @param to 終了点 |
| 591 | + * @return 角度(Degrees) |
| 592 | + */ |
| 593 | + public static double getAngle(FNVec2d from, FNVec2d to) { |
| 594 | + double x = to.getX() - from.getX(); |
| 595 | + double y = to.getY() - from.getY(); |
| 596 | + double n = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); |
| 597 | + return Math.toDegrees(Math.acos(x / n)); |
| 598 | + } |
| 599 | + |
| 600 | + /** |
| 601 | + * 2点の線の角度を求める |
| 602 | + * |
| 603 | + * @param from 開始点 |
| 604 | + * @param to 終了点 |
| 605 | + * @return 角度(Degrees XYZ) |
| 606 | + */ |
| 607 | + public static FNVec3d getAngle(FNVec3d from, FNVec3d to) { |
| 608 | + double x = FNMath.getAngle(new FNVec2d(from.getZ(), from.getY()), new FNVec2d(to.getZ(), to.getY())); |
| 609 | + double y = FNMath.getAngle(new FNVec2d(from.getX(), from.getZ()), new FNVec2d(to.getX(), to.getZ())); |
| 610 | + double z = FNMath.getAngle(new FNVec2d(from.getX(), from.getY()), new FNVec2d(to.getX(), to.getY())); |
| 611 | + return new FNVec3d(x, y, z); |
| 612 | + } |
| 613 | + |
532 | 614 | public static class PosColorEntry { |
533 | 615 | private final FNVec2i pos; |
534 | 616 | private final int color; |
|
0 commit comments