如何判断一个矩形能否放入另一个矩形中???

gongzhi493712874 2010-08-02 12:52:06
加精
如何判断一个矩形能否放入另一个矩形中???
...全文
7841 107 打赏 收藏 转发到动态 举报
写回复
用AI写文章
107 条回复
切换为时间正序
请发表友善的回复…
发表回复
Iam_magicHu 2012-12-26
  • 打赏
  • 举报
回复
没有看各位大神的思路,看了下楼主的问题,个人觉得只要小的那个矩形的对角线长度小于大矩形的宽度就可以了,个人意见
cuixiping 2012-12-18
  • 打赏
  • 举报
回复
引用 104 楼 go_and_see 的回复:
引用 103 楼 cuixiping 的回复:实际应用例子: 现在有一块81x59的材料,能否从中剪切一块88x13的材料来呢? 哦,原来是工人师傅,失敬。对了,别的工人师傅从来不这样做,人家直接拿了板子比划就可以了。
看来你是直接拿了板子比划的白领,久仰久仰啊!
边走边瞧 2012-12-17
  • 打赏
  • 举报
回复
引用 102 楼 cuixiping 的回复:
不知道你的中文是怎么学的,人家说矩形,你楞是扯到多边形去了。
放心,俺的中文不是体育老师教的。
边走边瞧 2012-12-17
  • 打赏
  • 举报
回复
引用 103 楼 cuixiping 的回复:
实际应用例子: 现在有一块81x59的材料,能否从中剪切一块88x13的材料来呢?
哦,原来是工人师傅,失敬。对了,别的工人师傅从来不这样做,人家直接拿了板子比划就可以了。
cuixiping 2012-12-17
  • 打赏
  • 举报
回复
引用 100 楼 go_and_see 的回复:
实际应用中,没见过矩形只用边长来描述的。俺前面说过了,脱离了实际存储方式,算法没有意义。
还真是无语,实际应用中怎么就不能用边长描述矩形呢? 非常非常常用,如果你认为没有,那只能说明你坐井观天了。 我觉得,你是不是完全误解了题目的意思呢?人家不是要判断一个矩形是否在另一个矩形内,而是能否放入,不知道你是怎么理解的,你觉得这是一回事吗? 实际应用例子: 现在有一块81x59的材料,能否从中剪切一块88x13的材料来呢?
cuixiping 2012-12-17
  • 打赏
  • 举报
回复
引用 101 楼 go_and_see 的回复:
引用 98 楼 cuixiping 的回复:我认为不需要求点是否在凸多边形内。 即使是按你说的,求一点是否在凸多边形内,请问这个点的坐标从何而来?你自己理解不明确,又不肯出代码。 按我的思路,最终是得出一个只有边长参数的不等式,代入边长参数,不等式成立则能够放入。 不知道你的数据结构怎么学的,能想到用边长来描述多边形,也算极品。
不知道你的中文是怎么学的,人家说矩形,你楞是扯到多边形去了。
边走边瞧 2012-12-17
  • 打赏
  • 举报
回复
引用 98 楼 cuixiping 的回复:
我认为不需要求点是否在凸多边形内。 即使是按你说的,求一点是否在凸多边形内,请问这个点的坐标从何而来?你自己理解不明确,又不肯出代码。 按我的思路,最终是得出一个只有边长参数的不等式,代入边长参数,不等式成立则能够放入。
不知道你的数据结构怎么学的,能想到用边长来描述多边形,也算极品。
边走边瞧 2012-12-17
  • 打赏
  • 举报
回复
引用 98 楼 cuixiping 的回复:
我认为不需要求点是否在凸多边形内。 即使是按你说的,求一点是否在凸多边形内,请问这个点的坐标从何而来?你自己理解不明确,又不肯出代码。 按我的思路,最终是得出一个只有边长参数的不等式,代入边长参数,不等式成立则能够放入。
如果矩形用坐标来表示,则两个矩形为: [(x1, y1),(x2,y2), (x3, y3), (x4,y4)] [(x5, y5),(x6,y6), (x7, y7), (x8,y8)] 于是问题就转化为一个点是否在另外4个点内,有疑问吗。 代码来了,满足你的好奇心。 这段是计算点是否在多边形内的,屏幕坐标、地理坐标和平面坐标均适用。

	size_t nSize = m_vcArea.size();
	if (nSize <= 0)
	{
		nArea = -1;	// out of range
		return false;
	}
	if (nArea < 0 || (UINT)nArea > nSize-1)
	{
		nArea = -1;	// out of range
		return false;
	}

	int nRet = -1;

	for(size_t i=nArea; i< nSize; i++)
	{
		int nLeft = 0;
		UINT nCount = 0;
		int nCurrent = 0;
		double dX1, dY1, dX2, dY2;

		if (m_vcArea[i].bEnabled == false) continue;
		size_t nPoints = m_vcArea[i].vcPoints.size();
		for(UINT j=0;j<nPoints;j++)
		{
			if (j != nPoints-1)
			{
				dX1 = m_vcArea[i].vcPoints[j].first;
				dY1 = m_vcArea[i].vcPoints[j].second;
				dX2 = m_vcArea[i].vcPoints[j+1].first;
				dY2 = m_vcArea[i].vcPoints[j+1].second;
			}
			else
			{
				dX1 = m_vcArea[i].vcPoints[nPoints-1].first;
				dY1 = m_vcArea[i].vcPoints[nPoints-1].second;
				dX2 = m_vcArea[i].vcPoints[0].first;
				dY2 = m_vcArea[i].vcPoints[0].second;
			}
			if (j == 0)
			{
				nLeft = OnLeft(dX1, dY1, dX2, dY2, dX, dY);
				nCurrent = nLeft;
			}
			else
				nCurrent = OnLeft(dX1, dY1, dX2, dY2, dX, dY);
			if (nCurrent != nLeft) break;
			if (nLeft == 0 || nCurrent == 0)
			{
				nArea = (int)i;
				strName = m_vcArea[i].areaName;
				return true;
			}
			nCount++;
		}
		if (nCount == nPoints)
		{
			nArea = (int)i;
			strName = m_vcArea[i].areaName;
			return true;
		}
这段是OnLeft的实现:

	double dResult = (dX2-dX1)*(dY-dY1)-(dY2-dY1)*(dX-dX1);
	bool bLeft = false;
	if (dResult >= -0.00000001 && dResult <= 0.0000001)
		return 0;
	if (dResult >  0.0f)
		return -1;
	if (dResult <  0.0f)
		return 1;
	return -2;
实际应用中,没见过矩形只用边长来描述的。俺前面说过了,脱离了实际存储方式,算法没有意义。
龙泉剑 2012-12-17
  • 打赏
  • 举报
回复
楼主没有说清楚啊,根据你的问题有两层意思: 1、一个矩形是否能够容纳下另一个矩形,这个根据面积判断 2、一个矩形是否在另一个矩形内,这个根据坐标判断
cuixiping 2012-12-17
  • 打赏
  • 举报
回复
引用 95 楼 go_and_see 的回复:
引用 94 楼 cuixiping 的回复:题目再描述一下: 已知矩形M的边长为a,b(a>=b);矩形N的边长为p,q(p>=q).求证矩形N能否被放入矩形M之中。 不争论了,钻牛角尖没意思。顺便说一下你推导的方程最终是一元二次方程,极值可以由区间范围确定。俺的代码就不帖了,思路说过了,求一点是否在凸多边形内。有兴趣你实现一遍,方法比较多,效率高、代码简洁的办法建议使用向量。
我认为不需要求点是否在凸多边形内。 即使是按你说的,求一点是否在凸多边形内,请问这个点的坐标从何而来?你自己理解不明确,又不肯出代码。 按我的思路,最终是得出一个只有边长参数的不等式,代入边长参数,不等式成立则能够放入。
gal1024 2012-12-14
  • 打赏
  • 举报
回复
表示一看回复就晕了
阿麦 2012-12-14
  • 打赏
  • 举报
回复
B能不能放入A? 如果B的长边不大于A的长边,并且B的短边不大于A的短边,就可以;否则不行
边走边瞧 2012-12-13
  • 打赏
  • 举报
回复
引用 94 楼 cuixiping 的回复:
题目再描述一下: 已知矩形M的边长为a,b(a>=b);矩形N的边长为p,q(p>=q).求证矩形N能否被放入矩形M之中。
不争论了,钻牛角尖没意思。顺便说一下你推导的方程最终是一元二次方程,极值可以由区间范围确定。俺的代码就不帖了,思路说过了,求一点是否在凸多边形内。有兴趣你实现一遍,方法比较多,效率高、代码简洁的办法建议使用向量。
cuixiping 2012-12-13
  • 打赏
  • 举报
回复
引用 88 楼 go_and_see 的回复:
引用 87 楼 cuixiping 的回复:1楼的说法且不靠谱、不严谨、无意义,他的回答等于是把题目重复了一遍。 1L所说的算法俺以前实现过,算不算不靠谱?多种方法都试过,算不算知道答案?人家一句话描述了建模,怎么等于把题目重复了一遍呢。 你似乎也是在建模,但转换为代码的话,还要很多工作要做。比如屏幕坐标旋转、平移,相对坐标计算。时间复杂度俺没计算,目测一下不低。
并不需要屏幕坐标旋转、平移,相对坐标计算。 楼主没有讲已知条件是什么,是8个顶点坐标呢,还是两矩形的边长。 如果已知是顶点坐标,要先把边长算出来再进行下一步。 这个题的结果,只跟矩形的边长有关,与矩形所在的位置和角度无关,因此无须你说的那些运算。 把你的方法的代码贴出来看看吧? 题目再描述一下: 已知矩形M的边长为a,b(a>=b);矩形N的边长为p,q(p>=q).求证矩形N能否被放入矩形M之中。
binflash 2012-12-13
  • 打赏
  • 举报
回复
又学到东西了
E次奥 2012-12-12
  • 打赏
  • 举报
回复
给外部矩形做内切圆,内切圆的直径大于等于内部矩形的对角线。 这样的话,内部矩形可以任意放置在外部矩形中。
wick1605 2012-12-12
  • 打赏
  • 举报
回复
又看到高手回复了
liangbina07 2012-12-12
  • 打赏
  • 举报
回复
所以问题比较复杂,还要考虑怎么放的问题了!每一类都有一个临界值的存在了。
边走边瞧 2012-12-12
  • 打赏
  • 举报
回复
引用 87 楼 cuixiping 的回复:
1楼的说法且不靠谱、不严谨、无意义,他的回答等于是把题目重复了一遍。
1L所说的算法俺以前实现过,算不算不靠谱?多种方法都试过,算不算知道答案?人家一句话描述了建模,怎么等于把题目重复了一遍呢。 你似乎也是在建模,但转换为代码的话,还要很多工作要做。比如屏幕坐标旋转、平移,相对坐标计算。时间复杂度俺没计算,目测一下不低。
cuixiping 2012-12-12
  • 打赏
  • 举报
回复
引用 77 楼 go_and_see 的回复:
引用 73 楼 cuixiping 的回复:别只读作者第一帖,后面几帖也看看吧。别人跟着误解你也跟着误解…… 多说一句:既然发到数据结构和算法版块,你觉得人家问的是几何题,还算法?说句不好听的,如果是几何题,人家有必要问么。
这90%是几何问题,剩下的10%是编程问题,重难点就在几何问题,把这个几何分析不清楚,编程无从谈起。 你知道这题目的答案了没?
加载更多回复(77)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧