m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
5.3 KiB

6 months ago
  1. from sympy.core.numbers import (Rational, oo)
  2. from sympy.core.singleton import S
  3. from sympy.core.symbol import symbols
  4. from sympy.functions.elementary.complexes import sign
  5. from sympy.functions.elementary.miscellaneous import sqrt
  6. from sympy.geometry.ellipse import (Circle, Ellipse)
  7. from sympy.geometry.line import (Line, Ray2D, Segment2D)
  8. from sympy.geometry.parabola import Parabola
  9. from sympy.geometry.point import (Point, Point2D)
  10. from sympy.testing.pytest import raises
  11. def test_parabola_geom():
  12. a, b = symbols('a b')
  13. p1 = Point(0, 0)
  14. p2 = Point(3, 7)
  15. p3 = Point(0, 4)
  16. p4 = Point(6, 0)
  17. p5 = Point(a, a)
  18. d1 = Line(Point(4, 0), Point(4, 9))
  19. d2 = Line(Point(7, 6), Point(3, 6))
  20. d3 = Line(Point(4, 0), slope=oo)
  21. d4 = Line(Point(7, 6), slope=0)
  22. d5 = Line(Point(b, a), slope=oo)
  23. d6 = Line(Point(a, b), slope=0)
  24. half = S.Half
  25. pa1 = Parabola(None, d2)
  26. pa2 = Parabola(directrix=d1)
  27. pa3 = Parabola(p1, d1)
  28. pa4 = Parabola(p2, d2)
  29. pa5 = Parabola(p2, d4)
  30. pa6 = Parabola(p3, d2)
  31. pa7 = Parabola(p2, d1)
  32. pa8 = Parabola(p4, d1)
  33. pa9 = Parabola(p4, d3)
  34. pa10 = Parabola(p5, d5)
  35. pa11 = Parabola(p5, d6)
  36. raises(ValueError, lambda:
  37. Parabola(Point(7, 8, 9), Line(Point(6, 7), Point(7, 7))))
  38. raises(NotImplementedError, lambda:
  39. Parabola(Point(7, 8), Line(Point(3, 7), Point(2, 9))))
  40. raises(ValueError, lambda:
  41. Parabola(Point(0, 2), Line(Point(7, 2), Point(6, 2))))
  42. raises(ValueError, lambda: Parabola(Point(7, 8), Point(3, 8)))
  43. # Basic Stuff
  44. assert pa1.focus == Point(0, 0)
  45. assert pa1.ambient_dimension == S(2)
  46. assert pa2 == pa3
  47. assert pa4 != pa7
  48. assert pa6 != pa7
  49. assert pa6.focus == Point2D(0, 4)
  50. assert pa6.focal_length == 1
  51. assert pa6.p_parameter == -1
  52. assert pa6.vertex == Point2D(0, 5)
  53. assert pa6.eccentricity == 1
  54. assert pa7.focus == Point2D(3, 7)
  55. assert pa7.focal_length == half
  56. assert pa7.p_parameter == -half
  57. assert pa7.vertex == Point2D(7*half, 7)
  58. assert pa4.focal_length == half
  59. assert pa4.p_parameter == half
  60. assert pa4.vertex == Point2D(3, 13*half)
  61. assert pa8.focal_length == 1
  62. assert pa8.p_parameter == 1
  63. assert pa8.vertex == Point2D(5, 0)
  64. assert pa4.focal_length == pa5.focal_length
  65. assert pa4.p_parameter == pa5.p_parameter
  66. assert pa4.vertex == pa5.vertex
  67. assert pa4.equation() == pa5.equation()
  68. assert pa8.focal_length == pa9.focal_length
  69. assert pa8.p_parameter == pa9.p_parameter
  70. assert pa8.vertex == pa9.vertex
  71. assert pa8.equation() == pa9.equation()
  72. assert pa10.focal_length == pa11.focal_length == sqrt((a - b) ** 2) / 2 # if a, b real == abs(a - b)/2
  73. assert pa11.vertex == Point(*pa10.vertex[::-1]) == Point(a,
  74. a - sqrt((a - b)**2)*sign(a - b)/2) # change axis x->y, y->x on pa10
  75. def test_parabola_intersection():
  76. l1 = Line(Point(1, -2), Point(-1,-2))
  77. l2 = Line(Point(1, 2), Point(-1,2))
  78. l3 = Line(Point(1, 0), Point(-1,0))
  79. p1 = Point(0,0)
  80. p2 = Point(0, -2)
  81. p3 = Point(120, -12)
  82. parabola1 = Parabola(p1, l1)
  83. # parabola with parabola
  84. assert parabola1.intersection(parabola1) == [parabola1]
  85. assert parabola1.intersection(Parabola(p1, l2)) == [Point2D(-2, 0), Point2D(2, 0)]
  86. assert parabola1.intersection(Parabola(p2, l3)) == [Point2D(0, -1)]
  87. assert parabola1.intersection(Parabola(Point(16, 0), l1)) == [Point2D(8, 15)]
  88. assert parabola1.intersection(Parabola(Point(0, 16), l1)) == [Point2D(-6, 8), Point2D(6, 8)]
  89. assert parabola1.intersection(Parabola(p3, l3)) == []
  90. # parabola with point
  91. assert parabola1.intersection(p1) == []
  92. assert parabola1.intersection(Point2D(0, -1)) == [Point2D(0, -1)]
  93. assert parabola1.intersection(Point2D(4, 3)) == [Point2D(4, 3)]
  94. # parabola with line
  95. assert parabola1.intersection(Line(Point2D(-7, 3), Point(12, 3))) == [Point2D(-4, 3), Point2D(4, 3)]
  96. assert parabola1.intersection(Line(Point(-4, -1), Point(4, -1))) == [Point(0, -1)]
  97. assert parabola1.intersection(Line(Point(2, 0), Point(0, -2))) == [Point2D(2, 0)]
  98. raises(TypeError, lambda: parabola1.intersection(Line(Point(0, 0, 0), Point(1, 1, 1))))
  99. # parabola with segment
  100. assert parabola1.intersection(Segment2D((-4, -5), (4, 3))) == [Point2D(0, -1), Point2D(4, 3)]
  101. assert parabola1.intersection(Segment2D((0, -5), (0, 6))) == [Point2D(0, -1)]
  102. assert parabola1.intersection(Segment2D((-12, -65), (14, -68))) == []
  103. # parabola with ray
  104. assert parabola1.intersection(Ray2D((-4, -5), (4, 3))) == [Point2D(0, -1), Point2D(4, 3)]
  105. assert parabola1.intersection(Ray2D((0, 7), (1, 14))) == [Point2D(14 + 2*sqrt(57), 105 + 14*sqrt(57))]
  106. assert parabola1.intersection(Ray2D((0, 7), (0, 14))) == []
  107. # parabola with ellipse/circle
  108. assert parabola1.intersection(Circle(p1, 2)) == [Point2D(-2, 0), Point2D(2, 0)]
  109. assert parabola1.intersection(Circle(p2, 1)) == [Point2D(0, -1), Point2D(0, -1)]
  110. assert parabola1.intersection(Ellipse(p2, 2, 1)) == [Point2D(0, -1), Point2D(0, -1)]
  111. assert parabola1.intersection(Ellipse(Point(0, 19), 5, 7)) == []
  112. assert parabola1.intersection(Ellipse((0, 3), 12, 4)) == \
  113. [Point2D(0, -1), Point2D(0, -1), Point2D(-4*sqrt(17)/3, Rational(59, 9)), Point2D(4*sqrt(17)/3, Rational(59, 9))]
  114. # parabola with unsupported type
  115. raises(TypeError, lambda: parabola1.intersection(2))