首页 > 代码库 > cocos2d-x 求相交矩阵

cocos2d-x 求相交矩阵

cocos2d-x有判断矩阵相交的方法 CCRect::intersectsRect(CCRect& rect)但可惜没有提供求两个相交矩阵的方法,我作了总结,代码如下:
CCRect Tools::intersectsRect(const CCRect &rectA, const CCRect &rectB)
{
	CCPoint ori;    //左下角顶点     cocos2dx的CCRect是以左下角为原点,w,h为参数(宽和高),并不是左上角是top,右下角为bottom
	CCPoint topM;	//右下角顶点
	float width = 0.f, height = 0.f;

	if (rectA.intersectsRect(rectB))
	{
		ori.x = max(rectA.getMinX(), rectB.getMinX()); //左下角x坐标取两个矩形ori顶点x坐标大的
		ori.y = max(rectA.getMinY(), rectB.getMinY()); //左下角y坐标取两个矩形ori顶点y坐标大的

		topM.x = min(rectA.getMaxX(), rectB.getMaxX()); //右上角x坐标取两个矩形右上角顶点x坐标小的
		topM.y = min(rectA.getMaxY(), rectB.getMaxY());

		width = topM.x - ori.x;
		height = topM.y - ori.y;

		return CCRectMake(ori.x, ori.y, width, height);
	}
	return CCRectMake(0, 0, -1.f, -1,f);
}
注意:CCRect的构造函数是CCRect(ori.x, ori.y, w, h)  ,它的示意图如下:


求矩形相交并不简单,因为要考虑好多可能性,如下:

这4种情况只是其中的一些,它们都不一样,那我们是不是要分情况一一写出代码呢?那代码写一千行都不够,这时可能很多人要打退堂鼓开始网上搜现成的或抱大牛大腿了。值得注意的是求矩形相交是曾出现在计算机二级考试和初中生计算机大赛中的题目,如果有这么麻烦就不会出现作为考题了,你仔细观察下就会发现,其实不用这么麻烦,无论相交矩形怎么摆,他们的顶点(ori)和对角线上的点都符合一定规律,所以才有了这么简洁的代码。规律见注释