mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:12:43 +00:00 
			
		
		
		
	 5d8f4ab878
			
		
	
	
		5d8f4ab878
		
	
	
	
	
		
			
			This comes with a very barebones API for now. You can ask for the bounding rect of the quad, and also check if a point is inside of it.
		
			
				
	
	
		
			55 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <LibGfx/Point.h>
 | |
| #include <LibGfx/Triangle.h>
 | |
| 
 | |
| namespace Gfx {
 | |
| 
 | |
| template<typename T>
 | |
| class Quad {
 | |
| public:
 | |
|     Quad(Point<T> p1, Point<T> p2, Point<T> p3, Point<T> p4)
 | |
|         : m_p1(p1)
 | |
|         , m_p2(p2)
 | |
|         , m_p3(p3)
 | |
|         , m_p4(p4)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     Point<T> const& p1() const { return m_p1; }
 | |
|     Point<T> const& p2() const { return m_p2; }
 | |
|     Point<T> const& p3() const { return m_p3; }
 | |
|     Point<T> const& p4() const { return m_p4; }
 | |
| 
 | |
|     Rect<T> bounding_rect() const
 | |
|     {
 | |
|         auto top = min(min(m_p1.y(), m_p2.y()), min(m_p3.y(), m_p4.y()));
 | |
|         auto right = max(max(m_p1.x(), m_p2.x()), max(m_p3.x(), m_p4.x()));
 | |
|         auto bottom = max(max(m_p1.y(), m_p2.y()), max(m_p3.y(), m_p4.y()));
 | |
|         auto left = min(min(m_p1.x(), m_p2.x()), min(m_p3.x(), m_p4.x()));
 | |
|         return { left, top, right - left, bottom - top };
 | |
|     }
 | |
| 
 | |
|     bool contains(Point<T> point) const
 | |
|     {
 | |
|         // FIXME: There's probably a smarter way to do this.
 | |
|         return Triangle(m_p1, m_p2, m_p3).contains(point)
 | |
|             || Triangle(m_p1, m_p3, m_p4).contains(point)
 | |
|             || Triangle(m_p2, m_p4, m_p1).contains(point)
 | |
|             || Triangle(m_p2, m_p4, m_p3).contains(point);
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     Point<T> m_p1;
 | |
|     Point<T> m_p2;
 | |
|     Point<T> m_p3;
 | |
|     Point<T> m_p4;
 | |
| };
 | |
| 
 | |
| }
 |