商务合作:179001057@qq.com

空间平面法向量求法(转)

技术2022-05-11  0


某平台价值19860元的编程课程资料免费领取【点我领取】


一、法向量定义

定义:如果,那么向量叫做平面的法向量。平面的法向量共有两大类(从方向上分),无数条。

二、平面法向量的求法

     1、内积法

在给定的空间直角坐标系中,设平面 的法向量=(x,y,1)[或=(x,1,z)或=(1,y,z)],在平面内任找两个不共线的向量,。由,得·=0且·=0,由此得到关于x,y的方程组,解此方程组即可得到。

     2、

任何一个x,y,z的一次方程的图形是平面;反之,任何一个平面的方程是x,y,z的一次方程。Ax+By+Cz+D=0(A,B,C不同时为0),称为平面的一般方程。其法向量=(A,B,C);若平面与3个坐标轴的交点为P(a,0,0),P(0,b,0),P(0,0,c),则平面方程为:,称此方程为平面的截距式方程,把它化为一般式即可求出它的法向量。

     3、外积法

设,为空间中两个不平行的非零向量,其外积×为一长度等于||||sinθ,(θ为 两者交角,且0 <θ> <π,而与> , , 皆垂直的向量。通常我们采取“右手定则”,也就是右手四指由 的方向转为 的方向时,大拇指所指的方向规定为 ×的方向, ×= -×。

设=(x1,y1,z1),=(x2,y2,z2),则×=

(注:1、二阶行列式:;2、适合右手定则。)

Code public double[] GetTriangleFunction(ESRI.ArcGIS.Geometry.IPoint point1, ESRI.ArcGIS.Geometry.IPoint point2, ESRI.ArcGIS.Geometry.IPoint point3) { try { double a = 0, b = 0,c=0;    //方程参数 double x1 = 0, x2 = 0, x3 = 0, y1 = 0, y2 = 0, y3 = 0, z1 = 0, z2 = 0, z3 = 0;      //各点坐标值 double[] returnValue = new double[3];                 x1 = point1.X * 1000;                 y1 = point1.Y * 1000;                 z1 = point1.Z * 1000;                 x2 = point2.X * 1000;                 y2 = point2.Y * 1000;                 z2 = point2.Z * 1000;                 x3 = point3.X * 1000;                 y3 = point3.Y * 1000;                 z3 = point3.Z * 1000; //向量I1 double[] I1 = new double[3];                 I1[0] = x2 - x1;                 I1[1] = y2 - y1;                 I1[2] = z2 - z1; //向量I2 double[] I2 = new double[3];                 I2[0] = x3 - x1;                 I2[1] = y3 - y1;                 I2[2] = z3 - z1; double X1 = I1[0]; double Y1 = I1[1]; double Z1 = I1[2]; double X2 = I2[0]; double Y2 = I2[1]; double Z2 = I2[2];                 a = Y1 * Z2 - Y2 * Z1;                 b = X2 * Z1 - X1 * Z2;                 c = X1 * Y2 - X2 * Y1;                 returnValue[0] = a;                 returnValue[1] = b;                 returnValue[2] = c; return returnValue;             } catch (Exception e) { throw e;             }         }

 

OPENGL里面就这样实现

void getNormal(GLfloat gx[3],GLfloat gy[3], GLfloat gz[3],GLfloat *ddnv) {     GLfloat w0,w1,w2,v0,v1,v2,nr,nx,ny,nz;     w0=gx[0]-gx[1]; w1=gy[0]-gy[1];w2=gz[0]-gz[1];     v0=gx[2]-gx[1]; v1=gy[2]-gy[1];v2=gz[2]-gz[1];     nx=(w1*v2-w2*v1);ny=(w2*v0-w0*v2);nz=(w0*v1-w1*v0);     nr=(GLfloat)sqrt(nx*nx+ny*ny+nz*nz); //向量单位化。     ddnv[0]=nx/nr; ddnv[1]=ny/nr;ddnv[2]=nz/nr; }


最新回复(0)