2024-08-27 09:08:27 +08:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
|
|
Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
|
|
|
|
|
|
|
@Time : 2024/8/26 上午7:54
|
|
|
|
@Author : snowykami
|
|
|
|
@Email : snowykami@outlook.com
|
|
|
|
@File : test_line3.py
|
|
|
|
@Software: PyCharm
|
|
|
|
"""
|
|
|
|
import logging
|
|
|
|
|
2024-08-28 04:22:22 +08:00
|
|
|
from liteyuki import logger # type: ignore
|
|
|
|
|
|
|
|
from mbcp.mp_math.angle import AnyAngle
|
|
|
|
from mbcp.mp_math.const import PI
|
2024-08-27 09:08:27 +08:00
|
|
|
from mbcp.mp_math.point import Point3
|
2024-08-28 04:22:22 +08:00
|
|
|
from mbcp.mp_math.utils import approx
|
2024-08-27 09:08:27 +08:00
|
|
|
from mbcp.mp_math.vector import Vector3
|
|
|
|
from mbcp.mp_math.line import Line3
|
2024-08-28 01:26:59 +08:00
|
|
|
from tests.answer import output_ans
|
2024-08-27 09:08:27 +08:00
|
|
|
|
|
|
|
|
2024-08-28 01:26:59 +08:00
|
|
|
class TestLine3:
|
2024-08-27 09:08:27 +08:00
|
|
|
|
2024-08-28 04:22:22 +08:00
|
|
|
def test_cal_angle(self) -> None:
|
|
|
|
"""
|
|
|
|
计算两条直线的夹角
|
|
|
|
"""
|
|
|
|
"""测试样例们"""
|
|
|
|
samples: tuple[tuple[Line3, Line3, AnyAngle], ...] = (
|
|
|
|
(
|
|
|
|
Line3(Point3(0, 0, 0), Vector3(1, 1, 0)),
|
|
|
|
Line3(Point3(0, 0, 0), Vector3(1, 0, 0)),
|
|
|
|
AnyAngle(45)
|
|
|
|
),
|
|
|
|
(
|
|
|
|
Line3(Point3(0, 0, 0), Vector3(0, 1, 0)),
|
|
|
|
Line3(Point3(0, 0, 0), Vector3(1, 0, 0)),
|
|
|
|
AnyAngle(90)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
for sample in samples:
|
|
|
|
correct_ans = sample[2]
|
|
|
|
actual_ans = sample[0].cal_angle(sample[1])
|
|
|
|
output_ans(correct_ans, actual_ans, question="计算两条直线的夹角")
|
|
|
|
assert correct_ans == actual_ans
|
|
|
|
|
|
|
|
def test_cal_distance(self) -> None:
|
|
|
|
"""
|
|
|
|
计算两条直线的距离
|
|
|
|
"""
|
|
|
|
"""测试样例们"""
|
|
|
|
samples: tuple[tuple[Line3, Line3, float], ...] = (
|
|
|
|
( # 重合
|
|
|
|
Line3(Point3(0, 0, 0), Vector3(1, 1, 1)),
|
|
|
|
Line3(Point3(0, 0, 0), Vector3(2, 2, 2)),
|
|
|
|
0
|
|
|
|
),
|
|
|
|
( # 两条直线相交
|
|
|
|
Line3(Point3(0, 0, 0), Vector3(1, 1, 0)),
|
|
|
|
Line3(Point3(0, 0, 0), Vector3(1, 0, 0)),
|
|
|
|
0
|
|
|
|
),
|
|
|
|
( # 平行线
|
|
|
|
Line3.from_two_points(Point3(0, 0, 0), Point3(1, 1, 0)),
|
|
|
|
Line3.from_two_points(Point3(0, 0, 1), Point3(1, 1, 1)),
|
|
|
|
1
|
|
|
|
),
|
|
|
|
( # 异面
|
|
|
|
Line3.from_two_points(Point3(0, 0, 0), Point3(1, 1, 0)),
|
|
|
|
Line3.from_two_points(Point3(1, 0, 2), Point3(0, 1, 2)),
|
|
|
|
2
|
|
|
|
),
|
|
|
|
( # 异面2
|
|
|
|
Line3.from_two_points(Point3(1, 0, 1), Point3(2, 1 ,0)),
|
|
|
|
Line3.from_two_points(Point3(1, 2, 0), Point3(0, 1, 1)),
|
|
|
|
2 ** 0.5
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
for sample in samples:
|
|
|
|
correct_ans = sample[2]
|
|
|
|
actual_ans = sample[0].cal_distance(sample[1])
|
|
|
|
output_ans(correct_ans, actual_ans,approx(correct_ans, actual_ans), question="计算两条直线的距离")
|
|
|
|
|
2024-08-28 01:26:59 +08:00
|
|
|
def test_equal(self):
|
|
|
|
line1 = Line3(Point3(1, 1, 1), Vector3(1, 1, 1))
|
|
|
|
line2 = Line3(Point3(1, 1, 1), Vector3(2, 2, 2))
|
|
|
|
output_ans(True, line1 == line2, question="判断两条直线是否相等")
|
2024-08-27 09:08:27 +08:00
|
|
|
|
2024-08-28 01:26:59 +08:00
|
|
|
# 反例
|
|
|
|
line1 = Line3(Point3(1, 1, 1), Vector3(1, 1, 1))
|
2024-08-28 04:22:22 +08:00
|
|
|
line2 = Line3(Point3(1, 1, 1), Vector3(2, 2, 2.1))
|
2024-08-28 01:26:59 +08:00
|
|
|
output_ans(False, line1 == line2, question="判断两条直线是否不相等")
|
|
|
|
|
|
|
|
def test_approx(self):
|
|
|
|
line1 = Line3(Point3(1, 1, 1), Vector3(1, 1, 1))
|
|
|
|
line2 = Line3(Point3(1, 1, 1), Vector3(2, 2, 2.000000001))
|
|
|
|
output_ans(True, line1.approx(line2), question="判断两条直线是否近似相等")
|
|
|
|
|
|
|
|
# 反例
|
|
|
|
line1 = Line3(Point3(1, 1, 1), Vector3(1, 1, 1))
|
|
|
|
line2 = Line3(Point3(1, 1, 1), Vector3(2, 2, 3.1))
|
|
|
|
output_ans(False, line1.approx(line2), question="判断两条直线是否不近似相等")
|
|
|
|
|
|
|
|
def test_cal_intersection(self):
|
|
|
|
line1 = Line3.from_two_points(Point3(0, 0, 0), Point3(2, 2, 2))
|
|
|
|
line2 = Line3.from_two_points(Point3(0, 0, 2), Point3(2, 2, 0))
|
|
|
|
output_ans(Point3(1, 1, 1), line1 & line2, question="计算两条直线的交点测1")
|
|
|
|
|
|
|
|
line1 = Line3.from_two_points(Point3(0, 0, 0), Point3(0, 2, 2))
|
|
|
|
line2 = Line3.from_two_points(Point3(0, 0, 2), Point3(0, 2, 0))
|
|
|
|
output_ans(Point3(0, 1, 1), line1 & line2, question="计算两条直线的交点测2")
|
|
|
|
|
|
|
|
line1 = Line3.from_two_points(Point3(0, 0, 0), Point3(0, 0, 2))
|
|
|
|
line2 = Line3.from_two_points(Point3(0, 0, 2), Point3(0, 2, 0))
|
|
|
|
output_ans(Point3(0, 0, 2), line1 & line2, question="计算两条直线的交点测3")
|
|
|
|
|
|
|
|
# 反例:平行线无交点
|
|
|
|
line1 = Line3(Point3(1, 1, 1), Vector3(1, 1, 1))
|
|
|
|
line2 = Line3(Point3(2, 3, 1), Vector3(1, 1, 1))
|
|
|
|
output_ans(None, line1 & line2, question="平行线交集为空集")
|
|
|
|
|
|
|
|
# 反例:重合线交集为自身
|
|
|
|
line1 = Line3(Point3(1, 1, 1), Vector3(1, 1, 1))
|
|
|
|
line2 = Line3(Point3(0, 0, 0), Vector3(2, 2, 2))
|
|
|
|
output_ans(line1, line1 & line2, question="重合线的交集为自身")
|