已知旋转中心点,始点和末点,怎样求旋转角度及判断顺逆时针?

BC菜鸟 2018-06-19 11:28:13
以点O(x0,y0)为旋转中心,点A(x1,y1)旋转到点B(x2,y2),怎样求旋转角度及判断顺逆时针?(C++)
...全文
1214 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
BC菜鸟 2018-06-20
  • 打赏
  • 举报
回复
根据项象判断,还是有问题。。
BC菜鸟 2018-06-20
  • 打赏
  • 举报
回复
double DrawEditSrv::getRotateAngle(const QPointF ¢erP, const QPointF &startP, const QPointF &endP)
{
	double doA = sqrt((startP.x() - centerP.x())*(startP.x() - centerP.x()) + (startP.y() - centerP.y())*(startP.y() - centerP.y()));
	double doB = sqrt((endP.x() - centerP.x())*(endP.x() - centerP.x()) + (endP.y() - centerP.y())*(endP.y() - centerP.y()));
	double dAB = sqrt((startP.x() - endP.x())*(startP.x() - endP.x()) + (startP.y() - endP.y())*(startP.y() - endP.y()));

	//角度(弧度值)    cos0 = (0B^2 + OA^2 - AB^2)/(2 * 0B * OA) 
	double angle = acos((doB*doB + doA*doA - dAB*dAB) / (2 * doB*doA));//	正值为顺时针

	//判断旋转顺逆时针
	double angleA = acos((doA*doA + (startP.x() - centerP.x())*(startP.x() - centerP.x()) - (startP.y() - centerP.y())*(startP.y() - centerP.y())) / (2 * doA*(startP.x() - centerP.x())));
	double angleB = acos((doB*doB + (endP.x() - centerP.x())*(endP.x() - centerP.x()) - (endP.y() - centerP.y())*(endP.y() - centerP.y())) / (2 * doA*(endP.x() - centerP.x())));
	//判断项象  (注:T面 Y坐标从上到下递减)
	if (startP.y() < centerP.y() && endP.y() < centerP.y())
	{
		//AB点都在第一二项象
		if (angleB > angleA)
			angle = -angle;
	}
	else if (startP.y() > centerP.y() && endP.y() > centerP.y())
	{
		//AB点都在第三四项象
		if (angleA > angleB)
			angle = -angle;
	}
	else if ((startP.x() > centerP.x() && startP.y() > centerP.y()) && (endP.x() > centerP.x() && endP.y() < centerP.y()))//A在四,B在一,逆
		angle = -angle;
	else if ((startP.x() < centerP.x() && startP.y() < centerP.y()) && (endP.x() < centerP.x() && endP.y() > centerP.y()))//A在二,B在三,逆
		angle = -angle;

	return angle;
}
图离游 2018-06-20
  • 打赏
  • 举报
回复
提供一下求顺时针问题的思路。求OA与正方向x轴的逆时针旋转角度a,OB与正方形x轴的逆时针旋转角度b。 旋转角度为c=b-a。c>0则为逆时针旋转,c<0则为顺时针旋转。
图离游 2018-06-20
  • 打赏
  • 举报
回复
其实是数学问题。 以O为坐标原点,A坐标为(x1-x0,y1-y0),B坐标为(x2-x0,y2-y0) 现在你可以画个坐标系了,把O(0,0)和上面两个点标出来。考虑到四个象限,你就能总结出判断顺时针逆时针的方法。 至于AOB的角度,用余弦定理即可。
图离游 2018-06-20
  • 打赏
  • 举报
回复
引用 7 楼 真相重于对错的回复:
我觉得这样的题,应该去百度作业上问?
百度作业只会给出具体某道题目的解答。但这种问题写代码,是要归纳的。而且百度作业可能没什么人会去答
真相重于对错 2018-06-20
  • 打赏
  • 举报
回复
我觉得这样的题,应该去百度作业上问?
图离游 2018-06-20
  • 打赏
  • 举报
回复
还有一个问题,实际上由A旋转到B,两个方向都可以。如果结果>180°,要获得<180°的结果,用360°-上法得出结果,方向取反就ok了。 例如顺时针转210°=逆时针转150°。
图离游 2018-06-20
  • 打赏
  • 举报
回复


tanα = ∆y/∆x .然后可以求出小于90度的α。 如果在第一象限,如B,则与X轴正方形角度为∠Box = α
如果在第二象限,如A,则与X轴正方形角度为∠Aox = 180° - α
第三象限为 180° + α
第四象限为 360° - α

这样就能得到任一点与X轴正方形的角度β。可以根据点横纵坐标正负值得到其在哪个象限。
βB - βA 就是你要的结果。结果>0 则为逆时针旋转,<0 则为顺时针旋转。

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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