#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()+"","结果");
}
多边形顺时针方向判断公式及C++代码实现二
于 2009-01-16 00:18:00 首次发布