189 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
		
		
			
		
	
	
			189 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
|  | // Copyright (c) 2016-2018 Easy2D - Nomango
 | |||
|  | // 
 | |||
|  | // Permission is hereby granted, free of charge, to any person obtaining a copy
 | |||
|  | // of this software and associated documentation files (the "Software"), to deal
 | |||
|  | // in the Software without restriction, including without limitation the rights
 | |||
|  | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |||
|  | // copies of the Software, and to permit persons to whom the Software is
 | |||
|  | // furnished to do so, subject to the following conditions:
 | |||
|  | // 
 | |||
|  | // The above copyright notice and this permission notice shall be included in
 | |||
|  | // all copies or substantial portions of the Software.
 | |||
|  | // 
 | |||
|  | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |||
|  | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |||
|  | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |||
|  | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |||
|  | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |||
|  | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | |||
|  | // THE SOFTWARE.
 | |||
|  | 
 | |||
|  | #pragma once
 | |||
|  | #include "base.hpp"
 | |||
|  | #include "Unit.h"
 | |||
|  | 
 | |||
|  | namespace easy2d | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD>μ<EFBFBD><CEBC>ཻ<EFBFBD><E0BDBB>ϵ
 | |||
|  | 	enum class GeometryRelation : int | |||
|  | 	{ | |||
|  | 		Unknown, | |||
|  | 		Disjoin,		// <20><EFBFBD><DEBD><EFBFBD>
 | |||
|  | 		IsContained,	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 		Contains,		// <20><><EFBFBD><EFBFBD>
 | |||
|  | 		Overlap			// <20>ص<EFBFBD>
 | |||
|  | 	}; | |||
|  | 
 | |||
|  | 
 | |||
|  | 	// <20><><EFBFBD>γ<EFBFBD><CEB3><EFBFBD>
 | |||
|  | 	class Geometry | |||
|  | 		: public Unit | |||
|  | 	{ | |||
|  | 	public: | |||
|  | 		Geometry(); | |||
|  | 
 | |||
|  | 		virtual ~Geometry(); | |||
|  | 
 | |||
|  | 		cpGeometry const& GetD2DGeometry() const { return geo_; } | |||
|  | 
 | |||
|  | 		float GetLength(); | |||
|  | 
 | |||
|  | 		bool ComputePointAt( | |||
|  | 			float length, | |||
|  | 			Point* point, | |||
|  | 			Point* tangent | |||
|  | 		); | |||
|  | 
 | |||
|  | 		// <20>ж<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 		bool ContainsPoint( | |||
|  | 			Point const& point | |||
|  | 		); | |||
|  | 
 | |||
|  | 		// <20>ж<EFBFBD><D0B6><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ཻ״̬
 | |||
|  | 		GeometryRelation GetRelationWith( | |||
|  | 			spGeometry const& other | |||
|  | 		); | |||
|  | 
 | |||
|  | 	protected: | |||
|  | 		cpGeometry geo_; | |||
|  | 	}; | |||
|  | 
 | |||
|  | 
 | |||
|  | 	// <20><><EFBFBD>ξ<EFBFBD><CEBE><EFBFBD>
 | |||
|  | 	class RectangleGeometry | |||
|  | 		: public Geometry | |||
|  | 	{ | |||
|  | 	public: | |||
|  | 		RectangleGeometry(); | |||
|  | 
 | |||
|  | 		RectangleGeometry( | |||
|  | 			Size const& rect_size | |||
|  | 		); | |||
|  | 
 | |||
|  | 		virtual ~RectangleGeometry(); | |||
|  | 
 | |||
|  | 		Size const& GetSize() const { return size_; } | |||
|  | 
 | |||
|  | 		void SetSize(Size const& rect_size); | |||
|  | 
 | |||
|  | 	protected: | |||
|  | 		Size size_; | |||
|  | 	}; | |||
|  | 
 | |||
|  | 
 | |||
|  | 	// <20><><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2>
 | |||
|  | 	class CircleGeometry | |||
|  | 		: public Geometry | |||
|  | 	{ | |||
|  | 	public: | |||
|  | 		CircleGeometry(); | |||
|  | 
 | |||
|  | 		CircleGeometry( | |||
|  | 			float radius | |||
|  | 		); | |||
|  | 
 | |||
|  | 		virtual ~CircleGeometry(); | |||
|  | 
 | |||
|  | 		float GetRadius() const { return radius_; } | |||
|  | 
 | |||
|  | 		void SetRadius( | |||
|  | 			float radius | |||
|  | 		); | |||
|  | 
 | |||
|  | 	protected: | |||
|  | 		float radius_; | |||
|  | 	}; | |||
|  | 
 | |||
|  | 
 | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ
 | |||
|  | 	class EllipseGeometry | |||
|  | 		: public Geometry | |||
|  | 	{ | |||
|  | 	public: | |||
|  | 		EllipseGeometry(); | |||
|  | 
 | |||
|  | 		EllipseGeometry( | |||
|  | 			float radius_x, | |||
|  | 			float radius_y | |||
|  | 		); | |||
|  | 
 | |||
|  | 		virtual ~EllipseGeometry(); | |||
|  | 
 | |||
|  | 		float GetRadiusX() const { return radius_x_; } | |||
|  | 
 | |||
|  | 		float GetRadiusY() const { return radius_y_; } | |||
|  | 
 | |||
|  | 		void SetRadius( | |||
|  | 			float radius_x, | |||
|  | 			float radius_y | |||
|  | 		); | |||
|  | 
 | |||
|  | 	protected: | |||
|  | 		float radius_x_; | |||
|  | 		float radius_y_; | |||
|  | 	}; | |||
|  | 
 | |||
|  | 
 | |||
|  | 	// <20><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
 | |||
|  | 	class PathGeometry | |||
|  | 		: public Geometry | |||
|  | 	{ | |||
|  | 	public: | |||
|  | 		PathGeometry(); | |||
|  | 
 | |||
|  | 		virtual ~PathGeometry(); | |||
|  | 
 | |||
|  | 		// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
 | |||
|  | 		void BeginPath(); | |||
|  | 
 | |||
|  | 		// <20><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
 | |||
|  | 		void EndPath( | |||
|  | 			bool closed = true		/* ·<><C2B7><EFBFBD>Ƿ<EFBFBD><C7B7>պ<EFBFBD> */ | |||
|  | 		); | |||
|  | 
 | |||
|  | 		// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>߶<EFBFBD>
 | |||
|  | 		void AddLine( | |||
|  | 			Point const& point		/* <20>˵<EFBFBD> */ | |||
|  | 		); | |||
|  | 
 | |||
|  | 		// <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>߶<EFBFBD>
 | |||
|  | 		void AddLines( | |||
|  | 			std::vector<Point> const& points | |||
|  | 		); | |||
|  | 
 | |||
|  | 		// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 		void AddBezier( | |||
|  | 			Point const& point1,	/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵĵ<DFB5>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD> */ | |||
|  | 			Point const& point2,	/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵĵڶ<C4B5><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD> */ | |||
|  | 			Point const& point3		/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>յ<EFBFBD> */ | |||
|  | 		); | |||
|  | 
 | |||
|  | 		// <20><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
 | |||
|  | 		void ClearPath(); | |||
|  | 
 | |||
|  | 	protected: | |||
|  | 		cpPathGeometry	current_geometry_; | |||
|  | 		cpGeometrySink	current_sink_; | |||
|  | 	}; | |||
|  | } |