您的位置:首页 > 编程语言 > C语言/C++

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

2009-01-16 00:18 435 查看
#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()+"","结果");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: