mirror of
https://github.com/snowykami/mbcp.git
synced 2025-08-02 19:49:58 +00:00
🐛 fix line.cal_intersection
This commit is contained in:
@ -8,16 +8,19 @@ Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved
|
||||
@File : .answer.py
|
||||
@Software: PyCharm
|
||||
"""
|
||||
from typing import Optional
|
||||
|
||||
from liteyuki.log import logger # type: ignore
|
||||
|
||||
|
||||
def output_answer(correct_ans, actual_ans, question: str = None):
|
||||
def output_ans(correct_ans, actual_ans, condition: Optional[bool] = None,question: Optional[str] = None):
|
||||
"""
|
||||
输出答案
|
||||
Args:
|
||||
correct_ans:
|
||||
actual_ans:
|
||||
question:
|
||||
condition: 判对条件
|
||||
question: 问题
|
||||
|
||||
Returns:
|
||||
|
||||
@ -25,8 +28,31 @@ def output_answer(correct_ans, actual_ans, question: str = None):
|
||||
print("")
|
||||
if question is not None:
|
||||
logger.info(f"问题:{question}")
|
||||
r = correct_ans == actual_ans
|
||||
r = (correct_ans == actual_ans) if condition is None else condition
|
||||
if r:
|
||||
logger.success(f"测试正确 正确答案:{correct_ans} 实际答案:{actual_ans}")
|
||||
else:
|
||||
logger.error(f"测试错误 正确答案:{correct_ans} 实际答案:{actual_ans}")
|
||||
assert r
|
||||
|
||||
|
||||
def output_step_ans(correct_ans, actual_ans, condition: Optional[bool] = None, question: Optional[str] = None):
|
||||
"""
|
||||
输出步骤答案
|
||||
Args:
|
||||
correct_ans: 正确答案
|
||||
actual_ans: 实际答案
|
||||
condition: 判对条件
|
||||
question: 问题
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
print("")
|
||||
if question is not None:
|
||||
logger.info(f" 步骤:{question}")
|
||||
r = (correct_ans == actual_ans) if condition is None else condition
|
||||
if r:
|
||||
logger.success(f" 正确 正确:{correct_ans} 实际:{actual_ans}")
|
||||
else:
|
||||
logger.error(f" 错误 正确:{correct_ans} 实际:{actual_ans}")
|
||||
|
@ -13,8 +13,50 @@ import logging
|
||||
from mbcp.mp_math.point import Point3
|
||||
from mbcp.mp_math.vector import Vector3
|
||||
from mbcp.mp_math.line import Line3
|
||||
from tests.answer import output_answer
|
||||
from tests.answer import output_ans
|
||||
|
||||
|
||||
class TestLine3:
|
||||
|
||||
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="判断两条直线是否相等")
|
||||
|
||||
# 反例
|
||||
line1 = Line3(Point3(1, 1, 1), Vector3(1, 1, 1))
|
||||
line2 = Line3(Point3(1, 1, 1), Vector3(2, 2, 2.000000001))
|
||||
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="重合线的交集为自身")
|
||||
|
@ -12,7 +12,7 @@ import logging
|
||||
|
||||
from mbcp.mp_math.vector import Vector3
|
||||
|
||||
from tests.answer import output_answer
|
||||
from tests.answer import output_ans
|
||||
|
||||
|
||||
class TestVector3:
|
||||
@ -41,7 +41,7 @@ class TestVector3:
|
||||
v1 = Vector3(1, 2, 3)
|
||||
v2 = Vector3(3, 6, 9)
|
||||
actual_ans = v1.is_parallel(v2)
|
||||
output_answer(correct_ans, actual_ans)
|
||||
output_ans(correct_ans, actual_ans)
|
||||
assert correct_ans == actual_ans
|
||||
|
||||
"""小题2"""
|
||||
@ -49,7 +49,7 @@ class TestVector3:
|
||||
v1 = Vector3(1, 2, 3)
|
||||
v2 = Vector3(3, 6, 8)
|
||||
actual_ans = v1.is_parallel(v2)
|
||||
output_answer(correct_ans, actual_ans)
|
||||
output_ans(correct_ans, actual_ans)
|
||||
assert correct_ans == actual_ans
|
||||
|
||||
|
||||
|
@ -7,7 +7,7 @@ from mbcp.mp_math.line import Line3
|
||||
from mbcp.mp_math.plane import Plane3
|
||||
from mbcp.mp_math.point import Point3
|
||||
from mbcp.mp_math.vector import Vector3
|
||||
from .answer import output_answer
|
||||
from .answer import output_ans, output_step_ans
|
||||
|
||||
|
||||
class TestWordProblem:
|
||||
@ -27,7 +27,7 @@ class TestWordProblem:
|
||||
s = pl1.normal.cross(pl2.normal)
|
||||
actual_ans = Line3(p, s)
|
||||
|
||||
output_answer(correct_ans, actual_ans, question)
|
||||
output_ans(correct_ans, actual_ans, question=question)
|
||||
assert actual_ans == correct_ans
|
||||
|
||||
"""解法2"""
|
||||
@ -38,7 +38,7 @@ class TestWordProblem:
|
||||
# 求pl3和pl4的交线
|
||||
actual_ans = pl3.cal_intersection_line3(pl4)
|
||||
|
||||
output_answer(correct_ans, actual_ans, question)
|
||||
output_ans(correct_ans, actual_ans, question=question)
|
||||
assert actual_ans == correct_ans
|
||||
|
||||
def test_c8s4e5(self):
|
||||
@ -56,21 +56,37 @@ class TestWordProblem:
|
||||
|
||||
"""解"""
|
||||
actual_ans = plane & line
|
||||
output_answer(correct_ans, actual_ans, question)
|
||||
output_ans(correct_ans, actual_ans, question=question)
|
||||
|
||||
def test_c8s4e6(self):
|
||||
question = "求过点(2, 3, 1)且与直线(x+1)/3 = (y-1)/2 = z/-1垂直相交的直线的方程。"
|
||||
"""正确答案"""
|
||||
correct_ans = Line3(Point3(2, 1, 3), Vector3(2, -1, 4))
|
||||
"""题目已知量"""
|
||||
point = Point3(2, 3, 1)
|
||||
point = Point3(2, 1, 3)
|
||||
line = Line3(Point3(-1, 1, 0), Vector3(3, 2, -1))
|
||||
|
||||
"""解"""
|
||||
# 先作平面过点且垂直与已知直线
|
||||
pl = line.cal_perpendicular(point)
|
||||
logger.debug(line.get_point(1))
|
||||
# 先作过点且垂直与已知直线的平面
|
||||
s1_correct_ans = Plane3(3, 2, -1, -5)
|
||||
pl = Plane3.from_point_and_normal(point, line.direction)
|
||||
|
||||
# output_answer(correct_ans, actual_ans, question)
|
||||
output_step_ans(s1_correct_ans, pl, question="作过点且垂直与已知直线的平面")
|
||||
|
||||
# 求该平面与已知直线的交点
|
||||
s2_correct_ans = Point3(2 / 7, 13 / 7, -3 / 7)
|
||||
s2_actual_ans = pl & line
|
||||
|
||||
output_step_ans(s2_correct_ans, s2_actual_ans, s1_correct_ans.approx(s1_correct_ans), question="求该平面与已知直线的交点")
|
||||
|
||||
# 求所求直线的方向向量
|
||||
s3_correct_ans = (-6 / 7) * Vector3(2, -1, 4)
|
||||
|
||||
dv = s2_correct_ans - point
|
||||
|
||||
output_step_ans(s3_correct_ans, dv, condition=s3_correct_ans.unit.approx(dv.unit), question="求所求直线的方向向量")
|
||||
|
||||
# 求所求直线的方程
|
||||
actual_ans = Line3(point, dv)
|
||||
|
||||
output_ans(correct_ans, actual_ans, correct_ans.approx(actual_ans), question=question)
|
||||
|
Reference in New Issue
Block a user