多边形顺时针方向判断公式及C++代码实现二

#include "stdafx.h"
#include "PolygonInterMul.h"
using namespace System;
using namespace System::Windows::Forms;

//实现类Sales_Item
//构造函数
PolygonInterMul::PolygonInterMul()
{
	  this->Nums=0;
}

//析构函数
PolygonInterMul::~PolygonInterMul()
{
}

//求向量  p1->p2
Vertex PolygonInterMul::getVertex(Top_Point p1,Top_Point p2)
{
	Vertex v1;
	v1.set(0,0,0);
	v1.set(p2.X-p1.X,p2.Y-p1.Y,p2.Z-p1.Z);
	return v1;
}

//求叉积
Vertex PolygonInterMul::getInterMul(Vertex v1,Vertex v2)
{
	Vertex c;
	c.set(0,0,0);
    //c=v1 X v2   求C向量 格式如:c=-2i+0j+4k
    c.I=v1.J*v2.I-v1.K*v2.J;
	c.J=v1.K*v2.I-v1.I*v2.K;
	c.K=v1.I*v2.J-v1.J*v2.I;
	return c;
}

//求两向量的夹角
double PolygonInterMul::getJJ(Vertex v1,Vertex v2)
{
	double cosJ=0;
	double NumMul=0;
	NumMul=(v1.I*v2.I+v1.J*v2.J+v1.K*v2.K);
	double distanceA=System::Math::Sqrt(Math::Pow(v1.I,2)+Math::Pow(v1.J,2)+Math::Pow(v1.K,2));
	double distanceB=System::Math::Sqrt(Math::Pow(v2.I,2)+Math::Pow(v2.J,2)+Math::Pow(v2.K,2));
	cosJ=NumMul/(distanceA*distanceB);

	double J=0;
	J=System::Math::Acos(cosJ)*180/PI;
	J=Math::Round(J);
	J=180-J;
	return J;
}
//三顶点求面积p1->p2->p3  (顶点成逆时针回路)
double PolygonInterMul::getArea(Top_Point p1,Top_Point p2,Top_Point p3)
{
	 double s=0;
     s=(p1.X-p3.X)*(p2.Y-p3.Y)-(p1.Y-p3.Y)*(p2.X-p3.X);
	 return s;
}
//多顶点求面积  (顶点成逆时针回路)   梯形法
double PolygonInterMul::getArea(System::Collections::ArrayList PointList)
{
	double s=0;
	double si=0;
	Top_PointClass bP;
    Top_PointClass curP;
	for(int i=0;i<PointList.Count-2;i++)
	{
		//curP=PointList[i] as Top_PointClass;  ??解决数组的问题
        //bP=PointList[i+1] as Top_PointClass;
        si=(bP.Y+curP.Y)*(bP.X-curP.X)/2;
		s+=si;
	}
	return s;
}

//三顶点顺时针测试
void PolygonInterMul::Test()
{
			//三点式面积计算公式
			Top_Point p1;
			Top_Point p2;
			Top_Point p3;
			Top_Point p4;
			double s;
			//共点   s=0
			p1.set(0,0,0);
			p2.set(0,0,0);
			p3.set(0,0,0);
			p4.set(0,0,0);
			//共点   s=0
			p1.set(2,2,0);
			p2.set(2,2,0);
			p3.set(2,2,0);
			//顺时针  s<0    OK
			p1.set(0,1,0);
			p2.set(1,0,0);
			p3.set(0,0.5,0);  //凹多边形    p3.set(0,-2,0);//凸多边形
			p4.set(-1,0,0);
			//逆时针  s>0    
            p1.set(0,1,0);
			p2.set(0,-1,0);
            p3.set(0,0.5,0);//凹多边形    p3.set(0,-2,0);//凸多边形
			p4.set(1,-1,0);
			
			s=(p1.X-p3.X)*(p2.Y-p3.Y)-(p1.Y-p3.Y)*(p2.X-p3.X);
			MessageBox::Show(s.ToString(),"结果");
			//向量叉积计算公式
			Vertex v1;
			Vertex v2;
            Vertex c;
			double JJ=0;
			v1.set(0,0,0);
			v2.set(0,0,0);
			c.set(0,0,0);

			//v1.set(0,1,0);
			//v2.set(-1,-1,0);
			//v1=p1->p2  ;  v2=p2->p3
			v1=this->getVertex(p1,p2);  
			v2=this->getVertex(p2,p3);
			//c=v1 X v2   求C向量  c=-2i+0j+4k
			/*c.I=v1.J*v2.I-v1.K*v2.J;
			c.J=v1.K*v2.I-v1.I*v2.K;
			c.K=v1.I*v2.J-v1.J*v2.I;*/
			c=this->getInterMul(v1,v2);
            JJ=getJJ(v1,v2);
			if(c.K>0)
			{  //逆时针方向
               JJ=360-JJ;
			}
			MessageBox::Show("c="+c.I.ToString()+"I+"+c.J.ToString()+"J+"+c.K.ToString()+"K   夹角="+JJ.ToString()+"","结果");
			//v1=p2->p3   ; v2=p3->p4
			v1=this->getVertex(p2,p3);
			v2=this->getVertex(p3,p4);
			c=this->getInterMul(v1,v2);
			JJ=getJJ(v1,v2);
			if(c.K>0)
			{  //逆时针方向
               JJ=360-JJ;
			}
			MessageBox::Show("c="+c.I.ToString()+"I+"+c.J.ToString()+"J+"+c.K.ToString()+"K  夹角="+JJ.ToString()+"","结果");
			//v1=p3->p4   ; v2=p4->p1
			v1=this->getVertex(p3,p4);
			v2=this->getVertex(p4,p1);
			c=this->getInterMul(v1,v2);
			JJ=getJJ(v1,v2);
			if(c.K>0)
			{  //逆时针方向
               JJ=360-JJ;
			}
			MessageBox::Show("c="+c.I.ToString()+"I+"+c.J.ToString()+"J+"+c.K.ToString()+"K  夹角="+JJ.ToString()+"","结果");
			//v1=p4->p1   ; v2=p1->p2
			v1=this->getVertex(p4,p1);
			v2=this->getVertex(p1,p2);
			c=this->getInterMul(v1,v2);
			JJ=getJJ(v1,v2);
			if(c.K>0)
			{  //逆时针方向
               JJ=360-JJ;
			}
			MessageBox::Show("c="+c.I.ToString()+"I+"+c.J.ToString()+"J+"+c.K.ToString()+"K  夹角="+JJ.ToString()+"","结果");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值