mirror of
https://github.com/snowykami/mbcp.git
synced 2024-11-22 14:17:38 +08:00
⚡ add some mathematical object
This commit is contained in:
parent
044040dd74
commit
de5bfa3843
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*script*
|
||||||
|
.idea*
|
10
main.py
Normal file
10
main.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
||||||
|
|
||||||
|
@Time : 2024/8/6 下午1:30
|
||||||
|
@Author : snowykami
|
||||||
|
@Email : snowykami@outlook.com
|
||||||
|
@File : main.py
|
||||||
|
@Software: PyCharm
|
||||||
|
"""
|
10
mcpe/__init__.py
Normal file
10
mcpe/__init__.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
||||||
|
|
||||||
|
@Time : 2024/8/6 下午12:54
|
||||||
|
@Author : snowykami
|
||||||
|
@Email : snowykami@outlook.com
|
||||||
|
@File : __init__.py
|
||||||
|
@Software: PyCharm
|
||||||
|
"""
|
10
mcpe/mp_math/__init__.py
Normal file
10
mcpe/mp_math/__init__.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
||||||
|
|
||||||
|
@Time : 2024/8/6 下午12:57
|
||||||
|
@Author : snowykami
|
||||||
|
@Email : snowykami@outlook.com
|
||||||
|
@File : __init__.py.py
|
||||||
|
@Software: PyCharm
|
||||||
|
"""
|
66
mcpe/mp_math/line.py
Normal file
66
mcpe/mp_math/line.py
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
||||||
|
|
||||||
|
@Time : 2024/8/6 下午12:57
|
||||||
|
@Author : snowykami
|
||||||
|
@Email : snowykami@outlook.com
|
||||||
|
@File : line.py
|
||||||
|
@Software: PyCharm
|
||||||
|
"""
|
||||||
|
from typing import overload, TYPE_CHECKING
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from mcpe.mp_math.point import Point3
|
||||||
|
from mcpe.mp_math.vector import Vector3
|
||||||
|
|
||||||
|
|
||||||
|
class Line3:
|
||||||
|
def __init__(self, a: float, b: float, c: float, d:float):
|
||||||
|
"""
|
||||||
|
三维空间中的直线。
|
||||||
|
:param a:
|
||||||
|
:param b:
|
||||||
|
:param c:
|
||||||
|
:param d:
|
||||||
|
"""
|
||||||
|
self.a = a
|
||||||
|
self.b = b
|
||||||
|
self.c = c
|
||||||
|
self.d = d
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"Line3({self.a}, {self.b}, {self.c}, {self.d})"
|
||||||
|
|
||||||
|
def get_perpendicular(self, p: "Point3") -> "Line3":
|
||||||
|
"""
|
||||||
|
获取直线经过指定点p的垂线。
|
||||||
|
:param p: 指定点p,直线外的点
|
||||||
|
:return: 垂直于self且过点p的直线
|
||||||
|
"""
|
||||||
|
a = -self.b
|
||||||
|
b = self.a
|
||||||
|
c = 0
|
||||||
|
d = -(a * p.x + b * p.y + self.c * p.z)
|
||||||
|
return Line3(a, b, c, d)
|
||||||
|
|
||||||
|
def get_intersection(self, l: "Line3") -> "Point3":
|
||||||
|
"""
|
||||||
|
获取两空间直线的交点。
|
||||||
|
:param l: 另一条直线,不平行于self,不共线,且共面
|
||||||
|
:return: 交点
|
||||||
|
"""
|
||||||
|
# 平行检测
|
||||||
|
if ...:
|
||||||
|
...
|
||||||
|
# 共线检测
|
||||||
|
if ...:
|
||||||
|
...
|
||||||
|
# 不共线检测
|
||||||
|
if ...:
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
10
mcpe/mp_math/plane.py
Normal file
10
mcpe/mp_math/plane.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
||||||
|
|
||||||
|
@Time : 2024/8/6 下午1:45
|
||||||
|
@Author : snowykami
|
||||||
|
@Email : snowykami@outlook.com
|
||||||
|
@File : plane.py
|
||||||
|
@Software: PyCharm
|
||||||
|
"""
|
23
mcpe/mp_math/point.py
Normal file
23
mcpe/mp_math/point.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
from typing import overload, TYPE_CHECKING
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from mcpe.mp_math.vector import Vector3
|
||||||
|
|
||||||
|
|
||||||
|
class Point3:
|
||||||
|
def __init__(self, x, y, z):
|
||||||
|
"""
|
||||||
|
笛卡尔坐标系中的点。
|
||||||
|
:param x:
|
||||||
|
:param y:
|
||||||
|
:param z:
|
||||||
|
"""
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.z = z
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"Point3({self.x}, {self.y}, {self.z})"
|
||||||
|
|
||||||
|
def __add__(self, other: "Vector3") -> "Point3":
|
||||||
|
return Point3(self.x + other.x, self.y + other.y, self.z + other.z)
|
63
mcpe/mp_math/vector.py
Normal file
63
mcpe/mp_math/vector.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
from typing import overload, TYPE_CHECKING
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from mcpe.mp_math.point import Point3
|
||||||
|
|
||||||
|
|
||||||
|
class Vector3:
|
||||||
|
def __init__(self, x, y, z):
|
||||||
|
"""
|
||||||
|
笛卡尔坐标系中的向量。
|
||||||
|
:param x:
|
||||||
|
:param y:
|
||||||
|
:param z:
|
||||||
|
"""
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.z = z
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"Vector3({self.x}, {self.y}, {self.z})"
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __add__(self, other: 'Vector3') -> 'Vector3':
|
||||||
|
...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __add__(self, other: 'Point3') -> 'Point3':
|
||||||
|
...
|
||||||
|
|
||||||
|
def __add__(self, other):
|
||||||
|
if isinstance(other, Vector3):
|
||||||
|
return Vector3(self.x + other.x, self.y + other.y, self.z + other.z)
|
||||||
|
elif isinstance(other, Point3):
|
||||||
|
return Point3(self.x + other.x, self.y + other.y, self.z + other.z)
|
||||||
|
else:
|
||||||
|
raise TypeError(f"unsupported operand type(s) for +: 'Vector3' and '{type(other)}'")
|
||||||
|
|
||||||
|
def __radd__(self, other: 'Point3') -> 'Point3':
|
||||||
|
return Point3(self.x + other.x, self.y + other.y, self.z + other.z)
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __sub__(self, other: 'Vector3') -> 'Vector3':
|
||||||
|
...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def __sub__(self, other: 'Point3') -> 'Point3':
|
||||||
|
...
|
||||||
|
|
||||||
|
def __sub__(self, other):
|
||||||
|
if isinstance(other, Vector3):
|
||||||
|
return Vector3(self.x - other.x, self.y - other.y, self.z - other.z)
|
||||||
|
elif isinstance(other, Point3):
|
||||||
|
return Point3(self.x - other.x, self.y - other.y, self.z - other.z)
|
||||||
|
else:
|
||||||
|
raise TypeError(f"unsupported operand type(s) for -: 'Vector3' and '{type(other)}'")
|
||||||
|
|
||||||
|
def __rsub__(self, other: Point3):
|
||||||
|
if isinstance(other, Point3):
|
||||||
|
return Point3(other.x - self.x, other.y - self.y, other.z - self.z)
|
||||||
|
elif isinstance(other, Vector3):
|
||||||
|
return Vector3(other.x - self.x, other.y - self.y, other.z - self.z)
|
||||||
|
else:
|
||||||
|
raise TypeError(f"unsupported operand type(s) for -: '{type(other)}' and 'Vector3'")
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
pytest~=8.3.2
|
22
tests/test_vector.py
Normal file
22
tests/test_vector.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
||||||
|
|
||||||
|
@Time : 2024/8/6 下午1:05
|
||||||
|
@Author : snowykami
|
||||||
|
@Email : snowykami@outlook.com
|
||||||
|
@File : test_vector.py
|
||||||
|
@Software: PyCharm
|
||||||
|
"""
|
||||||
|
from mcpe.mp_math.vector import Vector3
|
||||||
|
from mcpe.mp_math.point import Point3
|
||||||
|
|
||||||
|
|
||||||
|
def test_v():
|
||||||
|
v1 = Vector3(1, 2, 3)
|
||||||
|
v2 = Vector3(4, 5, 6)
|
||||||
|
v3 = v1 + v2
|
||||||
|
assert v3.x == 5
|
||||||
|
assert v3.y == 7
|
||||||
|
assert v3.z == 9
|
||||||
|
print("test_v 1111passed")
|
Loading…
Reference in New Issue
Block a user