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

📄 1233.txt

📁 AUTOCAD用VC开发-》判断多边形的方向
💻 TXT
字号:

//采用计算每条线段的方位角的转向的方法判断多边形的节点的旋转方向
//返回值的含义 = 2PI 正向
//             = -2Pi 逆向
//其他  交叉
double PolyLineDirection(AcGePoint3dArray ptArr)
{
	double dRotaionAngle = 0.0;
	if (ptArr.length() < 3)
	{
		return dRotaionAngle;
	}

	double rtAngle = 0.0,dbltmp = 0.0;

	AcGePoint3d pnt3d1,pnt3d2;
	AcGePoint3dArray pntArr = ptArr;
	pnt3d1 = pntArr.first();
	pnt3d2 = pntArr.last();
	
	if(pnt3d1.distanceTo(pnt3d2) < 0.05)//小于5厘米,认为是一个点
	{
		pntArr.append(pntArr.at(1));//补充到第二个点,下面计算时重复一条边,使其方位角还原
	}
	else
	{
		pntArr.append(pntArr.at(0));
		pntArr.append(pntArr.at(1));
	}
	
	
	pnt3d1 = pntArr.at(0);//第一条线
	pnt3d2 = pntArr.at(1);
	rtAngle = acutAngle_zy(pnt3d1,pnt3d2);//方向
	dRotaionAngle = 0.0;

	int it = pntArr.length();
	for(int i = 1; i <= pntArr.length()- 2;i++)//下面的线,最后一条线其实就是第一条线
	{
		pnt3d1 = pntArr.at(i);
		pnt3d2 = pntArr.at(i+1);
		
		dbltmp = acutAngle_zy(pnt3d1,pnt3d2);
//		if (fabs(dbltmp) > 10000000)
//		{
//			int t = 0;
//		}
		rtAngle = dbltmp - rtAngle;//转向角
		if (rtAngle > PI)
		{
			rtAngle -= 2*PI;
		}
		else if (rtAngle < -PI)
		{
			rtAngle += 2*PI;
		}

		dRotaionAngle += rtAngle;//转向之角的和
		rtAngle = dbltmp;
		//dRotaionAngle+=rtAngle;//所有转角的和,也就是一共转过多少角度,
		   //如果是一个不交叉的多边形,那么此值最后应该是2Pi或者 -2Pi
		
	}
//	if (fabs(dRotaionAngle)>10)
//		return 32432;
	return dRotaionAngle;
}


double acutAngle_zy(AcGePoint3d p1, AcGePoint3d p2)
{
	double dAngle = 0.0;
	ads_point pt1,pt2;
	pt1[X] = p1.x;
	pt1[Y] = p1.y;
	pt1[Z] = 0.0;
	pt2[X] = p2.x;
	pt2[Y] = p2.y;
	pt2[Z] = 0.0;
	dAngle = acutAngle(pt1,pt2);
	//if (p2.y - p1.y < 0)
	//	dAngle = dAngle + PI;
	return dAngle;

}

⌨️ 快捷键说明

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