test_parabola.py 6.0 KB

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