计算几何公式(点到直线距离,点到线段距离等)

这篇具有很好参考价值的文章主要介绍了计算几何公式(点到直线距离,点到线段距离等)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参照学校大佬的模板整理出文章来源地址https://www.toymoban.com/news/detail-622228.html

定义

const double eps=1e-18;
//记录点的横纵坐标
struct Pot{
	double x,y;
};
//记录线段的起始点和终点
struct Line{
	Pot st,ed;
};
//记录圆的圆心和半径
struct Circle{
	Pot p;
	double r;
};

判断小数大小和正负

//判断小数的正负,如果绝对值小于精度就返回0,小于0就返回-1,否则返回1
int sign(double x){
	if(fabs(x)<eps)return 0;
	if(x<0)return -1;
	return 1;
}
//比较小数的大小,如果x-y小于精度那么认为他们相等,如果x<y就返回-1,x大于y就返回1
int dcmp(double x,double y){
	if(fabs(x-y)<eps)return 0;
	if(x<y)return -1;
	return 1;
}

两个点的坐标加减乘除运算

Pot operator + (Pot a,Pot b){
	return {(a.x+b.x),(a.y +b.y )};
}
//两个点相减的坐标
Pot operator - (Pot a,Pot b){
	return {(a.x -b.x ),(a.y -b.y )};
}
//判断两个点是否坐标相等
bool operator == (Pot a,Pot b){
	if(dcmp(a.x,b.x)==0&&dcmp(a.y,b.y)==0)return 1;
	return 0;
}

两个向量运算


//求一个向量长度乘c之后的向量
Pot operator * (Pot a,double c){
	return {(a.x*c),(a.y *c)};
}
//求一个向量除以c之后的向量
Pot operator / (Pot a,double c){
	return {(a.x/c),(a.y /c)};
}
//向量a在向量b上的投影与b长度的乘积
//a*b=|a||b|cos(c)
double dot(Pot a,Pot b){
	return a.x*b.x+a.y *b.y  ;
}
//向量a与b张成的平行四边形的有向面积,b在a的逆时针方向为正
//a*b=|a||b|sin(c)
double cross(Pot a,Pot b){
	return a.x *b.y -b.x *a.y ;
}

点到点的距离

//a到原点的距离
double get_length(Pot a){
	return sqrt(dot(a,a));
}
//点a和点b之间的距离
double dist(Pot a,Pot b){
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

点到线的距离

//点p到直线ab的距离
double dist_to_line(Pot p,Pot a,Pot b){
	Pot v1=b-a,v2=p-a;
	return fabs(cross(v1,v2)/get_length(v1));
}
//点p到线段ab的距离
double dist_to_seg(Pot p,Pot a,Pot b){
	if(a==b)return get_length(p-a);
	Pot v1=b-a,v2=p-a,v3=p-b;
	if(sign(dot(v1,v2))<0)return get_length(v2);
	if(sign(dot(v1,v3))>0)return get_length(v3);
	return dist_to_line(p,a,b);
}

两直线交点,判断线段是否相交

//求两直线的交点,v为p的向量,w为q的向量
Pot get_Line_inter(Pot p,Pot v,Pot q,Pot w){
	Pot u=p-q;
	double t=cross(w,u)/cross(v,w);
	return p+v*t;
}
//判断两线段是否相交
bool xiangjiao(Pot a1,Pot a2,Pot b1,Pot b2){
	double c1=cross(a2-a1,b1-a1),c2=cross(a2-a1,b2-a1);
	double c3=cross(b2-b1,a2-b1),c4=cross(b2-b1,a1-b1);
	return sign(c1)*sign(c2)<=0&&sign(c3)*sign(c4)<=0;
}

返回点aob形成的角的角度

//返回角aOb的角度,返回的是弧度
double get_angle(Pot a,Pot b){
	return acos(dot(a,b)/get_length(a)/get_length(b));
}

已知三点坐标求形成的三角形面积

//返回三个点构成的三角形面积的两倍
double area(Pot a,Pot b,Pot c){
	return cross(b-a,c-a);
}

已知三条边长求三角形面积

//三条边长求三角形面积
double helen(double a,double b,double c){
	double p=(a+b+c)/2;
	return sqrt(p*(p-a)*(p-b)*(p-c));
}

一个点绕原点顺时针旋转x度

//返回三个点构成的三角形面积的两倍
double area(Pot a,Pot b,Pot c){
	return cross(b-a,c-a);
}

判断点是否在线段上

//判断点p是否在线段ab上
bool on_seg(Pot p,Pot a,Pot b){
	return sign(cross(p-a,p-b))==0&&sign(dot(p-a,p-b))<=0;
}

n个点组成的多边形的面积

//n个点从0到n-1求多边形面积
double Polygon_area(Pot p[],int n){
	double s=0;
	for(int i=1;i+1<n;i++){
		s+=cross(p[i]-p[0],p[i+1]-p[i]);
	}
	return s/2;
}

点在直线上的投影

//点p在直线ab上的投影
Pot get_line_pro(Pot p,Pot a,Pot b){
	Pot v=b-a;
	return a+v*(dot(v,p-a)/dot(v,v));
}




到了这里,关于计算几何公式(点到直线距离,点到线段距离等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 空间解析几何 | 向量、数量积、向量积、混合积、距离公式

       注: 通过公式我们可以发现,两个向量的 数量积 就是一个 数量 。 数量积 又称为 点积 或者 内积 。 ex: 在直角坐标系 {O; i , j , k } 中,设 α = (a1, a2, a3), β = (b1, b2, b3),     α • β = (a1 i + a2 j + a3 k ) •  (b1 i + b2 j + b3 k ) = a1b1 + a2b2 + a3b3    即两向量的数量积之和等于它

    2023年04月09日
    浏览(25)
  • Python-opencv计算两条直线或者线段角度

    通过斜率关系计算,公式如下图: 需注意在求斜率时不要出现竖直情况,python计算会报错,但按理说应该可以计算出无穷的,此处先放这吧,等后期有时间再来解释这里原因。 通过余弦定理计算三点角度: 若三边为a,b,c ,则如图所示,在△ABC中: 使用前提:分母不要有

    2024年02月15日
    浏览(31)
  • 使用opencv计算图片上任意一点到图片中心点距离为半径绘制圆形,计算FOV

    一、计算公式 图片坐标:Point(x,y) 半径 :r = ( x − i m a g e . c o l s / 2 ) 2 + ( y − i m a g e . r o w s / 2 ) 2 sqrt {(x - image.cols/2)^2 + (y - image.rows/2)^2} ( x − ima g e . co l s /2 ) 2 + ( y − ima g e . ro w s /2 ) 2 ​ 二、以 R R R 为半径在图像上绘制圆形,如下图所示: 三、实现代码

    2024年01月16日
    浏览(34)
  • 两空间线段最短距离计算

           本文中向量 叉乘用 x 表示 点乘用 * 表示       见上图,假设两线段分别为PQ和ST,线段UV为其最短距离所在的直线上,UV的长度为两线段间的最短距离。      先获取两线段PQ及ST的法向量 PUB=PQ x ST(叉乘)      再计算d=PUB*UV(点积)来判断两线段(所在直线)是否共

    2024年02月16日
    浏览(26)
  • 【Python】计算几何:德劳内三角剖分算法 | 利用 scatter 绘制散点图 | 实现外接圆生成 | scipy库的 Dealunay 函数 | 实战: A-B间欧氏距离计算

       猛戳!跟哥们一起玩蛇啊  👉 《一起玩蛇》🐍 💭 写在前面 :本章我们将介绍的是计算机和领域的 Delaunay 三角剖分算法(即德劳内三角剖分),它是一种用于将点集划分成三角形网格的算法。点集的三角剖分属于计算几何学科范畴,对数值分析、有限元分析与图形学

    2024年02月02日
    浏览(32)
  • 【计算几何】Python:德劳内三角剖分算法 | 利用 scatter 绘制散点图 | 实现外接圆生成 | scipy库的 Dealunay 函数 | 实战: A-B间欧氏距离计算

       猛戳!跟哥们一起玩蛇啊  👉 《一起玩蛇》🐍 💭 写在前面 :本章我们将介绍的是计算机和领域的 Delaunay 三角剖分算法(即德劳内三角剖分),它是一种用于将点集划分成三角形网格的算法。点集的三角剖分属于计算几何学科范畴,对数值分析、有限元分析与图形学

    2024年02月03日
    浏览(29)
  • 【计算几何】判断一条线段和一段圆弧是否相交 & C++代码实现

    最近做项目,需要判断一条线段是否和一段圆弧相交,网上也没找到很好的解答(最主要是没有直接可以搬来用的代码,或者思路写得太过高深,我看不懂),于是决定自己想一个方法,写一个博客,将实现思路和完整代码都分享出来 线段可用两个点表示,点的对象如下所示

    2024年02月01日
    浏览(52)
  • 根据经纬度计算地球上两点之间的距离——Haversine公式介绍及计算步骤

    目录 摘要 1.半正矢公式(Haversine Formula)介绍 2.半正矢公式应用 3.半正矢公式计算 3.1 主要思路 3.2 计算步骤 3.2.1 平面向量计算方法 3.2.2 空间向量计算方法 写本文的出发点是需要在Qlik中根据经纬度计算地球上两点间的距离。我在社区上搜到了相关公式的分享,这个公式叫做

    2023年04月10日
    浏览(34)
  • PCL 点到三角形的距离(3D)

    给定三角形ABC和点P,设Q为描述ABC上离P最近的点。求Q的一个方法:如果P在ABC内,那么P的正交投影点就是离P最近的点Q。如果P投影在ABC之外,最近的点则必须位于它的一条边上。在这种情况下,Q可以通过计算线段AB、BC和CA中离P最近的点,并返回离P最近的计算点来获得。虽然

    2024年04月11日
    浏览(35)
  • 空间分析实战指南:点到多边形的最短距离

    在我们最近的项目中,出现了一个新的需求:需要验证现场拍摄的照片的经纬度与实际地块之间的最短距离,以确保业务员在地块的一公里范围内进行拍照。 实现这个功能有两种方式,一种是在前台APP中校验,一种是在后台进行校验,接下来我会分别介绍这两种方式。 在我

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包