空间点、线和面位置关系(C++小学期)

程序设计小学期还要复习高数+线代,刺激

题目(2020/07/07)

第 8 天 : 空 间 点 、 线 和 面 第8天:空间点、线和面 8线

实现三维解析几何中的点、直线和平面类

  1. 能够实现直线的不同创建方式(例如,两个点确定一条直线,两个相交的平面确定一条直线,空间曲线的点斜式)和平面的不同创建方式(例如,三个不共线的点确定一个平面,一个点和一个法向量确定一个平面);
  2. 能够计算相应的距离:两点之间的距离,点到直线的距离,点到平面的距离;
  3. 能够计算空间直线的单位方向向量(长度为1),空间平面的单位法向量 (长度为1);
  4. 能够判断点和线的关系,线和线的关系,点和平面的关系,线和平面的关
    系,平面和平面的关系。

提示:

1.点、直线和平面分别用类来封装,每个类的数据为该表示该类需要的参
数,例如,对于空间平面的一般方程为ax+by+cz+d=0,那么私有数据成 员为a,b,c和d;
2.空间直线和平面的不同创建方式定义为对应类的成员函数;
3.空间点和点、点和直线、点和平面、直线和直线、直线和平面、平面和平面位置关系的判断定义为一般的函数;
4.要在main函数中对上述功能进行调用和验证。

直线方面

两点式:

设两点为 A ( x 1 , x 2 , x 3 ) A\left( x_{1},x_{2},x_{3}\right) A(x1,x2,x3) B ( x 1 , x 2 , x 3 ) B\left(x_{1},x_{2},x_{3}\right) B(x1,x2,x3),那么有方程为
x − x 1 x 2 − x 1 = y − y 1 y 2 − y 1 = z − z 1 z 2 − z 1 \dfrac {x-x_{1}}{x_{2}-x_{1}}=\dfrac {y-y_{1}}{y_{2}-y_{1}}=\dfrac {z-z_{1}}{z_{2}-z_{1}} x2x1xx1=y2y1yy1=z2z1zz1
一般式:
{ Π 1 : A 1 x + B 1 y + C 1 z + D 1 = 0 Π 2 : A 2 X + B 2 Y + C 2 z + D 2 = 0 \begin{cases}\Pi _{1}:A_{1}x+B_{1}y+C_{1}z+D_{1}=0\\ \Pi _{2}:A_{2}X+B_{2}Y+C_{2}z+D_{2}=0\end{cases} {Π1:A1x+B1y+C1z+D1=0Π2:A2X+B2Y+C2z+D2=0
点斜式:

方向向量: S → = ( m , n , p ) \overrightarrow {S}=\left( m,n,p\right) S =(m,n,p)

固定点: M 0 ( x 0 , y 0 , z 0 ) M_{0}\left( x_{0},y_{0},z_{0}\right) M0(x0,y0,z0)

有: M 0 M → = ( x − x 0 , y − y 0 , z − z 0 ) \overrightarrow {M_{0}M}=\left( x-x_{0},y-y_{0},z-z_{0}\right) M0M =(xx0,yy0,zz0)

x − x 0 m = y − y 0 n = z − z 0 p \dfrac {x-x_{0}}{m}=\dfrac {y-y_{0}}{n}=\dfrac {z-z_{0}}{p} mxx0=nyy0=pzz0

平面方面

标准式:

固定点: M 0 ( x 0 , y 0 , z 0 ) M_{0}\left( x_{0},y_{0},z_{0}\right) M0(x0,y0,z0)

A ( x − x 0 ) + B ( y − y 0 ) + C ( z − z 0 ) = 0 A\left( x-x_{0}\right) +B\left( y-y_{0}\right) +C\left( z-z_{0}\right)=0 A(xx0)+B(yy0)+C(zz0)=0
A x + B y + C z − A x 0 − B y 0 − C z 0 = 0 Ax+By+Cz-Ax_{0}-By_{0}-Cz_{0}=0 Ax+By+CzAx0By0Cz0=0
两点间距离公式 (送分 )
d = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 + ( z 2 − z 1 ) 2 d=\sqrt {\left( x_{2}-x_{1}\right) ^{2}+\left( y_{2}-y_{1}\right) ^{2}+\left( z_{2}-z_{1}\right) ^{2}} d=(x2x1)2+(y2y1)2+(z2z1)2
求点到线距离: (仅知道线上两点)

海伦公式:
S = p ( p − a ) ( p − b ) ( p − c ) S=\sqrt {p\left( p-a\right) \left( p-b\right) \left( p-c\right) } S=p(pa)(pb)(pc)
公式描述:

公式中a,b,c分别为三角形三边长,p为半周长,S为三角形的面积。

点到面距离:
d = ∣ A x 0 + B y 0 + C z 0 + D ∣ A 2 + B 2 + C 2 d=\dfrac {\left| Ax_{0}+By_{0}+Cz_{0}+D\right| }{\sqrt {A^{2}+B^{2}+C^{2}}} d=A2+B2+C2 Ax0+By0+Cz0+D
空间直线的单位方向向量:
e = A B → ∣ A B → ∣ e=\dfrac {\overrightarrow {AB}}{\left| \overrightarrow {AB}\right| } e=AB AB
空间平面的单位法向量:
( a t , b t c , t ) ( t = a 2 + b 2 + c 2 ) \left( \dfrac {a}{t},\dfrac {b}{t}\dfrac {c}{,t}\right) \left( t= \sqrt {a^{2}+b^{2}+c^{2}}\right) (ta,tb,tc)(t=a2+b2+c2 )
已知三个点求平面方程:
在这里插入图片描述
ps. 此图片来源于C++里已知三个三维点,求他们的平面方程,怎么做?

判断一些关系

点线位置关系:

海伦公式:

S = p ( p − a ) ( p − b ) ( p − c ) S=\sqrt {p\left( p-a\right) \left( p-b\right) \left( p-c\right) } S=p(pa)(pb)(pc)

公式描述:

公式中a,b,c分别为三角形三边长,p为半周长,S为三角形的面积。

线线位置关系:
e x 1 e x 2 = e y 1 e y 2 = e z 1 e z 2 = 1 ( 线 线 重 合 ) \dfrac {e_{x1}}{e_{x2}}=\dfrac {e_{y1}}{e_{y2}}=\dfrac {e_{z1}}{e_{z2}}=1\left( 线线重合\right) ex2ex1=ey2ey1=ez2ez1=1(线线)
e x 1 e x 2 = e y 1 e y 2 = e z 1 e z 2 ≠ 1 ( 线 线 平 行 ) \dfrac {e_{x1}}{e_{x2}}=\dfrac {e_{y1}}{e_{y2}}=\dfrac {e_{z1}}{e_{z2}}\neq 1\left( 线线平行\right) ex2ex1=ey2ey1=ez2ez1=1(线线)
其 他 : 相 交 且 不 平 行 其他:相交且不平行
点面位置关系:

点到面距离:
d = ∣ A x 0 + B y 0 + C z 0 + D ∣ A 2 + B 2 + C 2 d=\dfrac {\left| Ax_{0}+By_{0}+Cz_{0}+D\right| }{\sqrt {A^{2}+B^{2}+C^{2}}} d=A2+B2+C2 Ax0+By0+Cz0+D
线面位置关系:
e 1 → ⋅ n 1 → + e 2 → ⋅ n 2 → + e 3 → ⋅ n 3 → = 0 ( 线 面 平 行 ) \overrightarrow {e_{1}}\cdot \overrightarrow {n_{1}}+\overrightarrow {e_{2}}\cdot \overrightarrow {n_{2}}+\overrightarrow {e_{3}}\cdot \overrightarrow {n_{3}}=0\left( 线面平行\right) e1 n1 +e2 n2 +e3 n3 =0(线)
e 1 → n 1 → = e 2 → n 2 → = e 3 → n 3 → = 0 ( 线 面 垂 直 ) \dfrac {\overrightarrow {e_{1}}}{\overrightarrow {n_{1}}}=\dfrac {\overrightarrow {e_{2}}}{\overrightarrow {n_{2}}}=\dfrac {\overrightarrow {e_{3}}}{\overrightarrow {n_{3}}}=0\left( 线面垂直\right) n1 e1 =n2 e2 =n3 e3 =0(线)
面面位置关系:
n x 1 n x 2 = n y 1 n y 2 = n z 1 n z 2 ≠ 0 ( 面 面 平 行 ) \dfrac {n_{x_{1}}}{n_{x_{2}}}=\dfrac {n_{y_{1}}}{n_{y_{2}}}=\dfrac {n_{z_{1}}}{n_{z_{2}}}\neq 0\left( 面面平行\right) nx2nx1=ny2ny1=nz2nz1=0()
{ n x 1 = n x 2 n y 1 = n y 2 n z 1 = n z 2 ( 面 面 垂 直 ) \begin{aligned}\begin{cases}n_{x_{1}}=n_{x_{2}}\\ n_{y_{1}}=n_{y_{2}}\\ n_{z_{1}}=n_{z_{2}}\end{cases}\\ \left( 面面垂直\right) \end{aligned} nx1=nx2ny1=ny2nz1=nz2()

给出点线面的类定义:

class point
{
	public:
		double x,y,z;   
		void input(){cin>>x>>y>>z;};
		void output(){cout<<"该点为:"<<"("<<x<<","<<y<<","<<z<<")"<<endl;};
		void dist();//求两点之间的距离
};
class line:public point//继承 
{
	public:
		int m,n,p;//点斜式方向向量分量
    	int x,y,z;//点斜式点的坐标分量 
    	point i,j;//每一条线由两个点确定 
    	void Two_point_formula();//两点式
    	void Intersection_plane();
    	void P_oblique_type();
    	void D_point_to_line();
    	void L_vector();
};
class plane
{
    public:
    	double a,b,c,d;  
    	void setm();//赋值
    	void points_form_plane();//三点成面
    	void dot_method();//点法式
    	void showm();//方程式
    	void D_point_to_plane();//点到平面的距离
    	void n();//单位法向量
};

求两点之间的距离函数:

void point::dist()//求两点之间的距离
{
	double l;
	point m,n;
	cout<<"请输入第一个点的坐标(x1,y1,z1): "<<endl;
	m.input(); m.output();
	cout<<"请输入第二个点的坐标(x2,y2,z2): "<<endl;
	n.input(); n.output();
	l=sqrt((n.x-m.x)*(n.x-m.x)+(n.y-m.y)*(n.y-m.y)+(n.z-m.z)*(n.z-m.z));
	cout<<"两点之间的距离为= "<<l;
}

点到线(由两个点来表示直线)的距离

void line::D_point_to_line()//点到线(由两个点来表示直线)的距离
{//海伦公式 
	point y;
	point d1,d2;
	y.input();y.output();
	d1.input();d1.output();
	d2.input();d2.output();
    double i1,i2,i3;
    double p,s,l;
    i1=sqrt((d1.x-d2.x)*(d1.x-d2.x)+(d1.y-d2.y)*(d1.y-d2.y)+(d1.z-d2.z)*(d1.z-d2.z));
    i2=sqrt((d1.x-y.x)*(d1.x-y.x)+(d1.x-y.x)*(d1.y-y.y)+(d1.z-y.z)*(d1.z-y.z));
    i3=sqrt((d2.x-y.x)*(d2.x-y.x)+(d2.y-y.y)*(d2.y-y.y)+(d2.z-y.z)*(d2.z-y.z));
    p=(i1+i2+i3)/2;
    s=sqrt(p*(p-i1)*(p-i2)*(p-i3));
    l=2*s/i1;
    cout<<l<<endl;
}

其他靠自己了😅

英语学习:

平面:plane 输入:input,输出:output,距离:dist(distance)
点到线的距离:D_point_to_line(Distancefrom point to line)
点到平面的距离:D_point_to_plane(Distancefrom point to plane)
直线单位方向向量:L_vector(Linearunit direction vector)
点线位置关系:P_line_position(Point line position relationship)
线线位置关系:Line_position(Line position relation)

点面位置关系:point_surface_Position(Positionrelation of point and surface)
线面位置关系:line_surface_Position(Positionrelation of line and surface)
面面位置关系:Surface_position(Surface position relation)

点斜式:P_oblique_type(Pointoblique type)
点法式:dot_method(dotmethod)
三点成面:points_form_plane(Threepoints form a plane)
两点式:Two_point_formula(Twopoint formula)
相交平面:Intersection_plane(Intersectionplane)
读取shape文件可以使用开源库GDAL(Geospatial Data Abstraction Library),GDAL支持读取shape文件并提供了丰富的API。 以下是使用GDAL读取shape文件中线和面的示例代码: ```c++ #include "gdal_priv.h" #include "ogr_api.h" #include "ogr_geometry.h" int main() { // 打开shape文件 GDALAllRegister(); GDALDataset* poDS = (GDALDataset*)GDALOpenEx("path/to/shapefile.shp", GDAL_OF_VECTOR, NULL, NULL, NULL); // 获取图层 OGRLayer* poLayer = poDS->GetLayer(0); // 读取线 poLayer->ResetReading(); OGRFeature* poFeature = poLayer->GetNextFeature(); while(poFeature) { OGRGeometry* poGeometry = poFeature->GetGeometryRef(); if(poGeometry->getGeometryType() == wkbLineString) { OGRLineString* poLine = (OGRLineString*)poGeometry; int nPoints = poLine->getNumPoints(); for(int i = 0; i < nPoints; i++) { double x = poLine->getX(i); double y = poLine->getY(i); // 处理线上的 } } poFeature->Destroy(); poFeature = poLayer->GetNextFeature(); } // 读取面 poLayer->ResetReading(); poFeature = poLayer->GetNextFeature(); while(poFeature) { OGRGeometry* poGeometry = poFeature->GetGeometryRef(); if(poGeometry->getGeometryType() == wkbPolygon) { OGRPolygon* poPolygon = (OGRPolygon*)poGeometry; int nRings = poPolygon->getNumInteriorRings() + 1; for(int i = 0; i < nRings; i++) { OGRLinearRing* poRing = i == 0 ? poPolygon->getExteriorRing() : poPolygon->getInteriorRing(i - 1); int nPoints = poRing->getNumPoints(); for(int j = 0; j < nPoints; j++) { double x = poRing->getX(j); double y = poRing->getY(j); // 处理面上的 } } } poFeature->Destroy(); poFeature = poLayer->GetNextFeature(); } // 关闭文件 GDALClose(poDS); return 0; } ``` 这段代码可以读取shape文件中的第一个图层(如果有多个图层,可以使用GetLayer(i)获取第i个图层),并分别读取线和面上的。需要注意的是,读取面时需要分别处理面的外环和内环。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值