triangle.lua 3.8 KB

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