Skip to content

Commit 8c9f847

Browse files
committed
1.49
1 parent 9b6a74d commit 8c9f847

File tree

5 files changed

+368
-6
lines changed

5 files changed

+368
-6
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package dev.felnull.fnjl.math;
2+
3+
import dev.felnull.fnjl.util.FNMath;
4+
5+
import java.util.Objects;
6+
7+
public class FN2dLine {
8+
private FNVec2d from;
9+
private FNVec2d to;
10+
11+
public FN2dLine(FNVec2d from, FNVec2d to) {
12+
this.from = from;
13+
this.to = to;
14+
}
15+
16+
public FN2dLine(double fromX, double fromY, double toX, double toY) {
17+
this(new FNVec2d(fromX, fromY), new FNVec2d(toX, toY));
18+
}
19+
20+
public FNVec2d getFrom() {
21+
return from;
22+
}
23+
24+
public FNVec2d getTo() {
25+
return to;
26+
}
27+
28+
public void setFrom(FNVec2d from) {
29+
this.from = from;
30+
}
31+
32+
public void setTo(FNVec2d to) {
33+
this.to = to;
34+
}
35+
36+
public double getFromX() {
37+
return from.getX();
38+
}
39+
40+
public double getFromY() {
41+
return from.getY();
42+
}
43+
44+
public double getToX() {
45+
return to.getX();
46+
}
47+
48+
public double getToY() {
49+
return to.getY();
50+
}
51+
52+
public FNVec2d getIntersectPoint(FN2dLine line) {
53+
return FNMath.getLinesIntersectPoint(this, line);
54+
}
55+
56+
public boolean isOnPoint(FNVec2d point) {
57+
return FNMath.isPointOnLine(this, point);
58+
}
59+
60+
@Override
61+
public String toString() {
62+
return "FN2dLine{" +
63+
"from=" + from +
64+
", to=" + to +
65+
'}';
66+
}
67+
68+
@Override
69+
public boolean equals(Object o) {
70+
if (this == o) return true;
71+
if (o == null || getClass() != o.getClass()) return false;
72+
FN2dLine fn2dLine = (FN2dLine) o;
73+
return Objects.equals(from, fn2dLine.from) && Objects.equals(to, fn2dLine.to);
74+
}
75+
76+
@Override
77+
public int hashCode() {
78+
return Objects.hash(from, to);
79+
}
80+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package dev.felnull.fnjl.math;
2+
3+
import java.util.Objects;
4+
5+
public class FN3dLine {
6+
private FNVec3d from;
7+
private FNVec3d to;
8+
9+
public FN3dLine(double fromX, double fromY, double fromZ, double toX, double toY, double toZ) {
10+
this(new FNVec3d(fromX, fromY, fromZ), new FNVec3d(toX, toY, toZ));
11+
}
12+
13+
public FN3dLine(FNVec3d from, FNVec3d to) {
14+
this.from = from;
15+
this.to = to;
16+
}
17+
18+
public FNVec3d getFrom() {
19+
return from;
20+
}
21+
22+
public FNVec3d getTo() {
23+
return to;
24+
}
25+
26+
public void setTo(FNVec3d to) {
27+
this.to = to;
28+
}
29+
30+
public void setFrom(FNVec3d from) {
31+
this.from = from;
32+
}
33+
34+
35+
public double getFromX() {
36+
return from.getX();
37+
}
38+
39+
public double getFromY() {
40+
return from.getY();
41+
}
42+
43+
public double getFromZ() {
44+
return from.getZ();
45+
}
46+
47+
public double getToX() {
48+
return to.getX();
49+
}
50+
51+
public double getToY() {
52+
return to.getY();
53+
}
54+
55+
public double getToZ() {
56+
return to.getZ();
57+
}
58+
59+
/* public FNVec3d getIntersectPoint(FN3dLine line) {
60+
FN2dLine lineX1 = new FN2dLine(new FNVec2d(getFromX(), getFromY()), new FNVec2d(getToX(), getToY()));
61+
FN2dLine lineX2 = new FN2dLine(new FNVec2d(line.getFromX(), line.getFromY()), new FNVec2d(line.getToX(), line.getToY()));
62+
FNVec2d pointX = lineX1.getIntersectPoint(lineX2);
63+
64+
FN2dLine lineY1 = new FN2dLine(new FNVec2d(getFromX(), getFromZ()), new FNVec2d(getToX(), getToZ()));
65+
FN2dLine lineY2 = new FN2dLine(new FNVec2d(line.getFromX(), line.getFromZ()), new FNVec2d(line.getToX(), line.getToZ()));
66+
FNVec2d pointY = lineY1.getIntersectPoint(lineY2);
67+
68+
FN2dLine lineZ1 = new FN2dLine(new FNVec2d(getFromY(), getFromZ()), new FNVec2d(getToY(), getToZ()));
69+
FN2dLine lineZ2 = new FN2dLine(new FNVec2d(line.getFromY(), line.getFromZ()), new FNVec2d(line.getToY(), line.getToZ()));
70+
FNVec2d pointZ = lineZ1.getIntersectPoint(lineZ2);
71+
72+
if (pointX == null || pointY == null)
73+
return null;
74+
75+
return new FNVec3d(pointX.getX(), pointY.getY(), pointY.getY());
76+
}*/
77+
78+
@Override
79+
public String toString() {
80+
return "FN3dLine{" +
81+
"from=" + from +
82+
", to=" + to +
83+
'}';
84+
}
85+
86+
@Override
87+
public boolean equals(Object o) {
88+
if (this == o) return true;
89+
if (o == null || getClass() != o.getClass()) return false;
90+
FN3dLine fn3dLine = (FN3dLine) o;
91+
return Objects.equals(from, fn3dLine.from) && Objects.equals(to, fn3dLine.to);
92+
}
93+
94+
@Override
95+
public int hashCode() {
96+
return Objects.hash(from, to);
97+
}
98+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package dev.felnull.fnjl.math;
2+
3+
import java.util.Objects;
4+
5+
public class FNFace {
6+
private FNVec3d from;
7+
private FNVec3d to;
8+
9+
public FNFace(double fromX, double fromY, double fromZ, double toX, double toY, double toZ) {
10+
this(new FNVec3d(fromX, fromY, fromZ), new FNVec3d(toX, toY, toZ));
11+
}
12+
13+
public FNFace(FNVec3d from, FNVec3d to) {
14+
this.from = from;
15+
this.to = to;
16+
}
17+
18+
public FNVec3d getFrom() {
19+
return from;
20+
}
21+
22+
public FNVec3d getTo() {
23+
return to;
24+
}
25+
26+
public void setTo(FNVec3d to) {
27+
this.to = to;
28+
}
29+
30+
public void setFrom(FNVec3d from) {
31+
this.from = from;
32+
}
33+
34+
public double getFromX() {
35+
return from.getX();
36+
}
37+
38+
public double getFromY() {
39+
return from.getY();
40+
}
41+
42+
public double getFromZ() {
43+
return from.getZ();
44+
}
45+
46+
public double getToX() {
47+
return to.getX();
48+
}
49+
50+
public double getToY() {
51+
return to.getY();
52+
}
53+
54+
public double getToZ() {
55+
return to.getZ();
56+
}
57+
58+
/**
59+
*    0
60+
*   ┌━━┐
61+
*  3┃ ┃ 1
62+
*   └━━┘
63+
*    2
64+
* <p>
65+
* y┃ /z
66+
*  └━━
67+
*  x
68+
*
69+
* @param num Edge number
70+
* @return Edge
71+
*/
72+
public FN3dLine getEdge(int num) {
73+
switch (num) {
74+
case 0:
75+
return new FN3dLine(getFromX(), getFromY(), getFromZ(), getToX(), getFromY(), getToZ());
76+
case 1:
77+
return new FN3dLine(getToX(), getFromY(), getToZ(), getToX(), getToY(), getToZ());
78+
case 2:
79+
return new FN3dLine(getToX(), getToY(), getToZ(), getFromX(), getToY(), getFromZ());
80+
case 3:
81+
return new FN3dLine(getFromX(), getFromY(), getFromZ(), getFromX(), getToY(), getFromZ());
82+
}
83+
throw new IllegalStateException("Invalid edge number");
84+
}
85+
86+
@Override
87+
public String toString() {
88+
return "FNFace{" + "from=" + from + ", to=" + to + '}';
89+
}
90+
91+
@Override
92+
public boolean equals(Object o) {
93+
if (this == o) return true;
94+
if (o == null || getClass() != o.getClass()) return false;
95+
FNFace fnFace = (FNFace) o;
96+
return Objects.equals(from, fnFace.from) && Objects.equals(to, fnFace.to);
97+
}
98+
99+
@Override
100+
public int hashCode() {
101+
return Objects.hash(from, to);
102+
}
103+
}

common/src/main/java/dev/felnull/fnjl/util/FNMath.java

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package dev.felnull.fnjl.util;
22

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.*;
74
import dev.felnull.fnjl.tuple.FNPair;
85
import dev.felnull.fnjl.tuple.FNQuadruple;
96
import dev.felnull.fnjl.tuple.FNTriple;
@@ -529,6 +526,91 @@ public static float lerpRoted(float delta, float old, float value, float maxValu
529526
return lerp(delta, old, value);
530527
}
531528

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+
532614
public static class PosColorEntry {
533615
private final FNVec2i pos;
534616
private final int color;

common/src/test/java/dev/felnull/fnjltest/Main.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
public class Main {
44
public static void main(String[] args) throws Exception {
5-
6-
5+
76
}
87
}

0 commit comments

Comments
 (0)