triangle.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. local make_assertion = (require "telescope").make_assertion
  2. local Point = (require "delaunay").Point
  3. local Edge = (require "delaunay").Edge
  4. local Triangle = (require "delaunay").Triangle
  5. make_assertion("fuzzy_equal", "%s to be almost equal to %s", function(a, b)
  6. return math.abs(a - b) < 1e-8
  7. end)
  8. context("Triangle", function()
  9. test('a triangle is created passing three Points', function()
  10. local t = Triangle(Point(), Point(2,0), Point(1,1))
  11. assert_equal(getmetatable(t), Triangle)
  12. end)
  13. test('a triangle has 3 Points as members : p1, p2 and p3', function()
  14. local p1, p2, p3 = Point(), Point(2,0), Point(1,1)
  15. local t = Triangle(p1, p2, p3)
  16. assert_equal(t.p1, p1)
  17. assert_equal(t.p2, p2)
  18. assert_equal(t.p3, p3)
  19. end)
  20. test('a triangle has also 3 Edges as members : e1, e2 and e3', function()
  21. local p1, p2, p3 = Point(), Point(2,0), Point(1,1)
  22. local t = Triangle(p1, p2, p3)
  23. assert_equal(t.e1, Edge(p1, p2))
  24. assert_equal(t.e2, Edge(p2, p3))
  25. assert_equal(t.e3, Edge(p3, p1))
  26. end)
  27. test('a triangle cannot have a flat angle', function()
  28. local p1, p2, p3 = Point(-1, 0), Point(0, 0), Point(1, 0)
  29. local p4, p5, p6 = Point(0, 1), Point(0, 0), Point(0, -1)
  30. local function makeFlat1() return Triangle(p1, p2, p3) end
  31. local function makeFlat2() return Triangle(p4, p5, p6) end
  32. assert_error(makeFlat1)
  33. assert_error(makeFlat2)
  34. end)
  35. it('can evaluate the 3 sides length', function()
  36. local p1, p2, p3 = Point(), Point(2,0), Point(1,1)
  37. local t = Triangle(p1, p2, p3)
  38. local a, b, c = t:getSidesLength()
  39. assert_equal(a, 2)
  40. assert_equal(b, math.sqrt(2))
  41. assert_equal(c, math.sqrt(2))
  42. end)
  43. it('can evaluate the coordinates of the triangle center', function()
  44. local p1, p2, p3 = Point(-1,0), Point(1,0), Point(0,1)
  45. local t = Triangle(p1, p2, p3)
  46. local x, y = t:getCenter()
  47. assert_equal(x, 0)
  48. assert_equal(y, 1/3)
  49. end)
  50. it('can evaluate the coordinates of the triangle circumcenter', function()
  51. local p1, p2, p3 = Point(5, 5), Point(10, 3), Point(9, 15)
  52. local t = Triangle(p1, p2, p3)
  53. local x, y = t:getCircumCenter()
  54. assert_equal(x, 9.5)
  55. assert_equal(y, 9)
  56. end)
  57. it('can evaluate the radius of the triangle circumcircle', function()
  58. local p1, p2, p3 = Point(5, 5), Point(10, 3), Point(9, 15)
  59. local t = Triangle(p1, p2, p3)
  60. assert_fuzzy_equal(t:getCircumRadius(), 6.0207972893961)
  61. end)
  62. it('can evaluate both circumcenter and circumradius', function()
  63. local p1, p2, p3 = Point(5, 5), Point(10, 3), Point(9, 15)
  64. local t = Triangle(p1, p2, p3)
  65. local x, y, r = t:getCircumCircle()
  66. assert_equal(x, 9.5)
  67. assert_equal(y, 9)
  68. assert_fuzzy_equal(t:getCircumRadius(), 6.0207972893961)
  69. end)
  70. it('can test if a given point lies in a triangle\'s circumcircle', function()
  71. local p1, p2, p3 = Point(0, 0.5), Point(1, 1), Point(1.01, 1.01)
  72. local t = Triangle(Point(-1,0), Point(1, 0), Point(1, 1))
  73. assert_true(t:inCircumCircle(p1))
  74. assert_true(t:inCircumCircle(p2))
  75. assert_false(t:inCircumCircle(p3))
  76. end)
  77. it('can evaluate the area of a triangle', function()
  78. local p1, p2, p3 = Point(), Point(1, 0), Point(1, 1)
  79. local t = Triangle(p1, p2, p3)
  80. local x, y, r = t:getCircumCircle()
  81. assert_equal(t:getArea(), 0.5)
  82. end)
  83. it('can evaluate if triangle is defined clockwise', function()
  84. local p1, p2, p3 = Point(), Point(-1, 0), Point(1, 1)
  85. assert_true((Triangle(p1, p2, p3)):isCW())
  86. assert_false((Triangle(p1, p3, p2)):isCW())
  87. end)
  88. it('can also evaluate if triangle is defined counter-clockwise', function()
  89. local p1, p2, p3 = Point(), Point(1, 0), Point(1, 1)
  90. assert_true((Triangle(p1, p2, p3)):isCCW())
  91. assert_false((Triangle(p1, p3, p2)):isCCW())
  92. end)
  93. end)