⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rect.h

📁 这是一款2d游戏引擎
💻 H
字号:
/*  $Id: rect.h,v 1.42 2004/01/05 00:15:34 mbn Exp $
**
**  ClanLib Game SDK
**  Copyright (C) 2003  The ClanLib Team
**  For a total list of contributers see the file CREDITS.
**
**  This library is free software; you can redistribute it and/or
**  modify it under the terms of the GNU Lesser General Public
**  License as published by the Free Software Foundation; either
**  version 2.1 of the License, or (at your option) any later version.
**
**  This library is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
**  Lesser General Public License for more details.
**
**  You should have received a copy of the GNU Lesser General Public
**  License along with this library; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
**
*/

//! clanCore="Math"
//! header=core.h

#ifndef header_rect
#define header_rect

#if _MSC_VER > 1000
#pragma once
#endif

#include "size.h"
#include "point.h"
#include "origin.h"

//: 2D (left,top,right,bottom) rectangle structure.
//- !group=Core/Math!
//- !header=core.h!
class CL_Rect
{
//! Construction:
public:
	//: Constructs an rectangle.
	//param left: Initial left position of rectangle.
	//param top: Initial top position of rectangle.
	//param right: Initial right position of rectangle.
	//param bottom: Initial bottom position of rectangle.
	//param point: Initial top-left position of rectangle.
	//param size: Initial size of rectangle.
	//param rect: Initial rectangle position and size.
	CL_Rect() { return; }

	CL_Rect(int new_left, int new_top, int new_right, int new_bottom)
	{ left = new_left; top = new_top; right = new_right; bottom = new_bottom; }

	CL_Rect(const CL_Point &p, const CL_Size &size)
	{ left = p.x; top = p.y; right = left + size.width; bottom = top + size.height; }

	CL_Rect(const CL_Rect &rect)
	{ left = rect.left; top = rect.top; right = rect.right; bottom = rect.bottom; }

	//: Rect += Rect operator.
	CL_Rect &operator+=(const CL_Rect &r)
	{ left += r.left; top += r.top; right += r.right; bottom += r.bottom; return *this; }

	//: Rect -= Rect operator.
	CL_Rect &operator-=(const CL_Rect &r)
	{ left -= r.left; top -= r.top; right -= r.right; bottom -= r.bottom; return *this; }
	
	//: Rect += Point operator.
	CL_Rect &operator+=(const CL_Point &p)
	{ left += p.x; top += p.y; right += p.x; bottom += p.y; return *this; }

	//: Rect -= Point operator.
	CL_Rect &operator-=(const CL_Point &p)
	{ left -= p.x; top -= p.y; right -= p.x; bottom -= p.y; return *this; }

	//: Rect + Rect operator.
	CL_Rect operator+(const CL_Rect &r) const
	{ return CL_Rect(left + r.left, top + r.top, right + r.right, bottom + r.bottom); }

	//: Rect - Rect operator.
	CL_Rect operator-(const CL_Rect &r) const
	{ return CL_Rect(left - r.left, top - r.top, right - r.right, bottom - r.bottom); }

	//: Rect + Point operator.
	CL_Rect operator+(const CL_Point &p) const
	{ return CL_Rect(left + p.x, top + p.y, right + p.x, bottom + p.y); }

	//: Rect - Point operator.
	CL_Rect operator-(const CL_Point &p) const
	{ return CL_Rect(left - p.x, top - p.y, right - p.x, bottom - p.y); }

	//: Rect == Rect operator.
	bool operator==(const CL_Rect &r) const
	{ return (left == r.left && top == r.top && right == r.right && bottom && r.bottom); }

//! Attributes:
public:
	//: X1-coordinate.
	int left;
	
	//: Y1-coordinate.
	int top;
	
	//: X2-coordinate.
	int right;
	
	//: Y2-coordinate.
	int bottom;
	
	//: Returns the width of the rectangle.
	int get_width() const { return right - left; }
	
	//: Returns the height of the rectangle.
	int get_height() const { return bottom - top; }

	//: Returns the size of the rectangle.
	CL_Size get_size() const { return CL_Size(right - left, bottom - top); }
	
	//: Returns true if point is inside the rectangle.
	bool is_inside(const CL_Point &p) const { return (p.x >= left && p.y >= top && p.x <= right && p.y <= bottom); }

	//: Returns true if rectangle passed is overlapping or inside this rectangle.
	bool is_overlapped(const CL_Rect &r) const 
	{
		return (r.left < right && r.right > left && r.top < bottom && r.bottom > top);
	}
	
	//: Returns another CL_Rect containing a rotated version of this one.
	//param hotspot: Point to rotate around.
	//param origin: Determines the hotspot point within the rectangle
	//param x, y: Offsets applied negatively to the hotspot point
	//param angle: Angle to rotate in degrees.
	CL_Rect get_rot_bounds(const CL_Point &hotspot, float angle) const;
	CL_Rect get_rot_bounds(CL_Origin origin, int x, int y, float angle) const;
	
//! Operations:
public:
	//: Sets the size of the rectangle, maintaining top/left position.
	void set_size(const CL_Size &size)
	{
		right = left + size.width;
		bottom = top + size.height;
	}

	//: Calculates and returns the union of two rectangles.
	CL_Rect calc_union(const CL_Rect &rect)
	{
		CL_Rect result;
		if (left   > rect.left)   result.left   = left;   else result.left   = rect.left;
		if (right  < rect.right)  result.right  = right;  else result.right  = rect.right;
		if (top    > rect.top)    result.top    = top;    else result.top    = rect.top;
		if (bottom < rect.bottom) result.bottom = bottom; else result.bottom = rect.bottom;
		return result;
	}

	//: Normalize rectangle. Ensures that left is less than right and top is less than bottom.
	void normalize()
	{
		if (left > right)
		{
			int temp = right;
			right = left;
			left = temp;
		}

		if (top > bottom)
		{
			int temp = bottom;
			bottom = top;
			top = temp;
		}
	}
	
	//: Applies an origin and offset pair to this rectangle
	//param origin: The new origin to adjust to from default upper-left position
	//param x, y: Offsets applied negatively to each corner of the rectangle
	void apply_alignment(CL_Origin origin, int x, int y)
	{
		CL_Point offset = calc_origin(origin, get_size());
		offset.x -= x;
		offset.y -= y;
		
		left += offset.x;
		top += offset.y;
		right += offset.x;
		bottom += offset.y;
	}
};

//: 2D (left,top,right,bottom) floating point rectangle structure.
class CL_Rectf
{
//! Construction:
public:
	//: Constructs an rectangle.
	//param left: Initial left position of rectangle.
	//param top: Initial top position of rectangle.
	//param right: Initial right position of rectangle.
	//param bottom: Initial bottom position of rectangle.
	//param point: Initial top-left position of rectangle.
	//param size: Initial size of rectangle.
	//param rect: Initial rectangle position and size.
	CL_Rectf() { return; }

	CL_Rectf(float new_left, float new_top, float new_right, float new_bottom)
	{ left = new_left; top = new_top; right = new_right; bottom = new_bottom; }

	CL_Rectf(const CL_Pointf &p, const CL_Sizef &size)
	{ left = p.x; top = p.y; right = left + size.width; bottom = top + size.height; }

	CL_Rectf(const CL_Rectf &rect)
	{ left = rect.left; top = rect.top; right = rect.right; bottom = rect.bottom; }

	//: Rect += Rect operator.
	CL_Rectf &operator+=(const CL_Rectf &r)
	{ left += r.left; top += r.top; right += r.right; bottom += r.bottom; return *this; }

	//: Rect -= Rect operator.
	CL_Rectf &operator-=(const CL_Rectf &r)
	{ left -= r.left; top -= r.top; right -= r.right; bottom -= r.bottom; return *this; }
	
	//: Rect += Point operator.
	CL_Rectf &operator+=(const CL_Pointf &p)
	{ left += p.x; top += p.y; right += p.x; bottom += p.y; return *this; }

	//: Rect -= Point operator.
	CL_Rectf &operator-=(const CL_Pointf &p)
	{ left -= p.x; top -= p.y; right -= p.x; bottom -= p.y; return *this; }

	//: Rect + Rect operator.
	CL_Rectf operator+(const CL_Rectf &r) const
	{ return CL_Rectf(left + r.left, top + r.top, right + r.right, bottom + r.bottom); }

	//: Rect - Rect operator.
	CL_Rectf operator-(const CL_Rectf &r) const
	{ return CL_Rectf(left - r.left, top - r.top, right - r.right, bottom - r.bottom); }

	//: Rect + Point operator.
	CL_Rectf operator+(const CL_Pointf &p) const
	{ return CL_Rectf(left + p.x, top + p.y, right + p.x, bottom + p.y); }

	//: Rect - Point operator.
	CL_Rectf operator-(const CL_Pointf &p) const
	{ return CL_Rectf(left - p.x, top - p.y, right - p.x, bottom - p.y); }

	//: Rect == Rect operator.
	bool operator==(const CL_Rectf &r) const
	{ return (left == r.left && top == r.top && right == r.right && bottom && r.bottom); }

//! Attributes:
public:
	//: X1-coordinate.
	float left;
	
	//: Y1-coordinate.
	float top;
	
	//: X2-coordinate.
	float right;
	
	//: Y2-coordinate.
	float bottom;
	
	//: Returns the width of the rectangle.
	float get_width() const { return right - left; }
	
	//: Returns the height of the rectangle.
	float get_height() const { return bottom - top; }

	//: Returns the size of the rectangle.
	CL_Sizef get_size() const { return CL_Sizef(right - left, bottom - top); }
	
	//: Returns true if point is inside the rectangle.
	bool is_inside(const CL_Pointf &p) const { return (p.x >= left && p.y >= top && p.x <= right && p.y <= bottom); }
	
	//: Returns true if rectangle passed is overlapping or inside this rectangle.
	bool is_overlapped(const CL_Rectf &r) const 
	{
		return (r.left < right && r.right > left && r.top < bottom && r.bottom > top);
	}

	//: Returns another CL_Rectf containing a rotated version of this one.
	//param hotspot: Point to rotate around.
	//param origin: Determines the hotspot point within the rectangle
	//param x, y: Offsets applied negatively to the hotspot point
	//param angle: Angle to rotate in degrees.
	CL_Rectf get_rot_bounds(const CL_Pointf &hotspot, float angle) const;
	CL_Rectf get_rot_bounds(CL_Origin origin, float x, float y, float angle) const;
	
//! Operations:
public:
	//: Sets the size of the rectangle, maintaining top/left position.
	void set_size(const CL_Size &size)
	{
		right = left + size.width;
		bottom = top + size.height;
	}

	//: Calculates and returns the union of two rectangles.
	CL_Rectf calc_union(const CL_Rectf &rect)
	{
		CL_Rectf result;
		if (left   > rect.left)   result.left   = left;   else result.left   = rect.left;
		if (right  < rect.right)  result.right  = right;  else result.right  = rect.right;
		if (top    > rect.top)    result.top    = top;    else result.top    = rect.top;
		if (bottom < rect.bottom) result.bottom = bottom; else result.bottom = rect.bottom;
		return result;
	}

	//: Normalize rectangle. Ensures that left<right and top<bottom.
	void normalize()
	{
		if (left > right)
		{
			float temp = right;
			right = left;
			left = temp;
		}

		if (top > bottom)
		{
			float temp = bottom;
			bottom = top;
			top = temp;
		}
	}
	
	//: Applies an origin and offset pair to this rectangle
	//param origin: The new origin to adjust to from default upper-left position
	//param x, y: Offsets applied negatively to each corner of the rectangle
	void apply_alignment(CL_Origin origin, float x, float y)
	{
		CL_Pointf offset = calc_origin(origin, get_size());
		offset.x -= x;
		offset.y -= y;
		
		left += offset.x;
		top += offset.y;
		right += offset.x;
		bottom += offset.y;
	}
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -