Quad.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibGfx/Point.h>
  8. #include <LibGfx/Triangle.h>
  9. namespace Gfx {
  10. template<typename T>
  11. class Quad {
  12. public:
  13. Quad(Point<T> p1, Point<T> p2, Point<T> p3, Point<T> p4)
  14. : m_p1(p1)
  15. , m_p2(p2)
  16. , m_p3(p3)
  17. , m_p4(p4)
  18. {
  19. }
  20. Point<T> const& p1() const { return m_p1; }
  21. Point<T> const& p2() const { return m_p2; }
  22. Point<T> const& p3() const { return m_p3; }
  23. Point<T> const& p4() const { return m_p4; }
  24. Rect<T> bounding_rect() const
  25. {
  26. auto top = min(min(m_p1.y(), m_p2.y()), min(m_p3.y(), m_p4.y()));
  27. auto right = max(max(m_p1.x(), m_p2.x()), max(m_p3.x(), m_p4.x()));
  28. auto bottom = max(max(m_p1.y(), m_p2.y()), max(m_p3.y(), m_p4.y()));
  29. auto left = min(min(m_p1.x(), m_p2.x()), min(m_p3.x(), m_p4.x()));
  30. return { left, top, right - left, bottom - top };
  31. }
  32. bool contains(Point<T> point) const
  33. {
  34. // FIXME: There's probably a smarter way to do this.
  35. return Triangle(m_p1, m_p2, m_p3).contains(point)
  36. || Triangle(m_p1, m_p3, m_p4).contains(point)
  37. || Triangle(m_p2, m_p4, m_p1).contains(point)
  38. || Triangle(m_p2, m_p4, m_p3).contains(point);
  39. }
  40. private:
  41. Point<T> m_p1;
  42. Point<T> m_p2;
  43. Point<T> m_p3;
  44. Point<T> m_p4;
  45. };
  46. }