#include "stdafx.h"#include "PolygonInterMul.h"using namespace System;using namespace System::Windows::Forms;//实现类Sales_Item//构造函数PolygonInterMul::PolygonInterMul(){ this->Nums=0;}//析构函数PolygonInterMul::~PolygonInterMul(){}//求向量 p1->p2Vertex 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=0p1.set(0,0,0);p2.set(0,0,0);p3.set(0,0,0);p4.set(0,0,0);//共点 s=0p1.set(2,2,0);p2.set(2,2,0);p3.set(2,2,0);//顺时针 s<0 OKp1.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->p3v1=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->p4v1=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->p1v1=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->p2v1=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()+"","结果");}#include "stdafx.h"#include "PolygonInterMul.h" 你的当前访问异常,请进行认证后继续阅读剩余内容。 提交