多边形顺时针方向判断公式及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()+"","结果"); }

转载于:https://www.cnblogs.com/sqlite3/archive/2009/01/16/2566987.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值