计算几何(三)

您所在的位置:网站首页 怎么求有几条线段的平行线 计算几何(三)

计算几何(三)

2024-07-16 03:39| 来源: 网络整理| 查看: 265

直线

我们以前学的直线的常用表示有:

一般式 a x + b y + c = 0 ax+by+c=0 ax+by+c=0点斜式 y − y 0 = k ( x − x 0 ) y-y_0=k(x-x_0) y−y0​=k(x−x0​)截距式 y = k x + b y=kx+b y=kx+b两点式 ( y − y 1 ) / ( y 2 − y 1 ) = ( x − x 1 ) / ( x 2 − x 1 ) (y-y_1)/(y_2-y_1)=(x-x_1)/(x_2-x_1) (y−y1​)/(y2​−y1​)=(x−x1​)/(x2​−x1​)

但是很明显上面的形式保存的直线形式较为单一,因此我们使用直线的向量方程——点向式,用一个点和方向向量表示直线: ρ = p 0 + v t ρ= p_0+vt ρ=p0​+vt。

方向向量的求法:已知直线上的两点便可确定方向向量,进而确定一条直线

struct Line{ Point p,q; //传入两点,默认p是起点 Vector v; //由p,q确定的方向向量 Line(){} Line(Point a,Point b){ p=a,q=b,v=q-p; } Point point(double t){ //点P=p+v*t return p+v*t; } };

我们不难发现点向式不但表示了直线,当限制某一参数时,该直线就变成了射线或线段

由此我们也传入线段的几个常用函数,那么" L i n e Line Line"就是万能的线,并不局限直线

struct Line{ Point p,q; //默认p是起点 Vector v; //由p,q确定的方向向量 Line(){} Line(Point a,Point b){ //构造函数 p=a,q=b,v=q-p; } Point point(double t){ //点P=p+v*t return p+v*t; } Point spos(){ //线段起点 return p; } Point tpos(){ //线段终点 return q; } double length(){ //线段长度 return sqrt(dis(v)); } void print(){ printf("Line:(%lf,%lf)->(%lf,%lf)\n",p.x,p.y,q.x,q.y); } }; 点与线

点到直线的距离

一说到点到直线的距离,我们很容易想起这个公式:设有直线 A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0,某坐标 ( X 0 , Y 0 ) (X_0,Y_0) (X0​,Y0​),那么该点到这直线的距离就为: 在这里插入图片描述

但是我们的直线是用点向式保存的,因此我们必须通过向量来求点到直线的距离。如图当我们以 p p p点为起点向 ( x 0 , y 0 ) (x_0,y_0) (x0​,y0​)构建一个向量,那么该向量与直线的方向向量叉乘绝对值的几何意义是如下平行四边形的面积,那么已知底边长度,所求的高 h h h就是点到直线的距离: 在这里插入图片描述

double disToLine(Point p,Line l){ Vector v=p-l.p; return fabs(l.v^v) / dis(l.v); }

点到线段的距离

我们对线段做一个平行线,当 p p p在平行线区域内时很明显直接利用点到直线的距离公式。但是当点在平行线外时,到线段的距离就是到 A A A点的距离或者到 B B B点的距离,但是要根据向量之间的夹角判断在哪边,我们作向量 A p Ap Ap,设它与 v v v之间的夹角为 α α α,同理设向量 B p Bp Bp和 v v v的夹角为 β β β,如下图红线均为向量 A p Ap Ap,蓝线均为向量 B p Bp Bp,那么当 p p p点在 A A A点左边时,一定有 α > 90 α>90 α>90°,其他两种情况均不是;同理当且仅当 β β β在 B B B点右边时,一定有 β < 90 β



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3