两点间距离、点到直线距离、点到线段距离、线段到线段距离

article/2025/9/1 2:15:28

两点之间的距离

直接运用两点间距离公式 (x2-x1)^ 2+(y2-y1)^ 2开根号

//两点间距离
double getDistancePP(Point a,Point b)
{
//这个代码是部分代码,有些逻辑没有展现完全,大家往下看!Point c(b.x-a.x,b.y-a.y);//返回一个新的点return  c.abs();//取模
}

点到直线距离

通常给出3个点,其中两个点构成一条直线,求另外一个点到直线的距离,我们将点与点的关系转换为向量之间关系进而利用向量知识求出点到直线距离!

点到直线距离,我们可以利用外积的取模公式的几何意义,|axb|=|a|x|b|sinθ=所围成平行四边形面积,先求出向量a✖向量b的模,然后除以平行四边形底边边长|a|,最后用平行四边形面积除以底边边长就是高,也就是点到直线距离!

图解

在这里插入图片描述
不明白外积模的几何意义点击下方超链接
外积知识点大全

实现代码

//点到直线距离(利用外积平行四边形)
double getDistancePL(Point a,Point b,Point c)
{Vector ab(b.x-a.x,b.y-a.y);Vector ac(c.x-a.x,c.y-a.y);return cross(ab,ac)/ab.abs();//cross函数求两个向量的外积模,abs函数求向量模
}

点到线段距离

点到线段距离有一点复杂,因为线段不像直线那样可以无限延申,线段有端点,这就导致了点到线段距离可以分为3种情况!

第一种:点到线段距离等于点到直线的距离
图示
在这里插入图片描述

第二种:点到线段距离等于点到左端点的距离
图示
在这里插入图片描述

第三种:点到线段等于点到右端点的距离
图示
在这里插入图片描述

如何判断θ大小呢?

我们利用内积大小判断 a·b=|a|x|b|cosθ
如果a·b>0则θ在0~90°之间
如果a·b<0则θ在90°~180°之间

实现代码

//点到线段距离
double getDistancePS(Point a,Point b,Point c)
{//定义4个向量Vector ab(b.x-a.x,b.y-a.y);Vector ba(a.x-b.x,a.y-b.y);Vector ac(c.x-a.x,c.y-a.y);Vector bc(c.x-b.x,c.y-b.y);//dot函数用于求内积if(dot(ab,ac)<0.0) return getDistancePP(a,c);//到左端点距离if(dot(ba,bc)<0.0) return getDistancePP(b,c);//到右端点距离return getDistancePL(a,b,c);//点到直线距离
}

线段到线段距离

有了点到线段距离,求解线段到线段距离就容易多了!

首先、两个线段4个端点,我们分别用其中一个线段的一个端点,求出到另外一个线段的距离,在求出另一个端点到线段的距离,在更换线段,依次类推,我们求出4个不同的点到线段的距离,然后取最小值即可!

在代码中有一点我们暂时不考虑,就是两个线段相交的时候,那么他们的距离应该为0!

放在下一节学完两条线段相交的判定后直接添加一个if语句即可!

实现代码

//线段到线段的距离
double getDistanceSS(Point a,Point b,Point c,Point d)
{//从4个点到2线段距离中取最小return min(min(getDistancePS(c,d,a),getDistancePS(c,d,b)),min(getDistancePS(a,b,c),getDistancePS(a,b,d)));
}

完整代码

#include <bits/stdc++.h>using namespace std;class Point
{public:double x,y;Point(double x=0,double y=0):x(x),y(y) {}//向量加法Point operator+(Point p){return Point(x+p.x,y+p.y);}//向量减法Point operator-(Point p){return Point(x-p.x,y+p.y);}//向量伸缩Point operator*(double a){return Point(x*a,y*a);}Point operator/(double a){return Point(x/a,y/a);}//向量大小double abs(){return sqrt(norm());}//向量范数double norm(){return x*x+y*y;}bool operator<(const Point &p) const{return x!=p.x?x<p.x:y<p.y;}bool operator==(const Point &p)const{return x-p.x<1e-10&&y-p.y<1e-10;}};typedef Point Vector;//向量内积
double dot(Vector a,Vector b)
{return a.x*b.x+a.y*b.y;
}//向量外积
double cross(Vector a,Vector b)
{return abs(a.x*b.y-a.y*b.x);
}//正交
bool isOrthogonal(Vector a,Vector b)
{return a.x*b.x+a.y*b.y==0;
}
//平行
bool isParallel(Vector a,Vector b)
{return a.x*b.y-a.y*b.x==0;
}//投影
Point project(Point a,Point b,Point c)
{Vector ab(b.x-a.x,b.y-a.y);Vector ac(c.x-a.x,c.y-a.y);double  r=dot(ab,ac)/ab.norm();//比例Vector h(ab*r);return Point(a.x+h.x,a.y+h.y);
}//映象Point reflect(Point a,Point b,Point c)
{//c到ab的投影点Point r=project(a,b,c);Vector cr(r.x-c.x,r.y-c.y);//cr扩大二倍Vector cr_2=cr*2;//上面重载过*//向量加法return Point(c.x+cr_2.x,c.y+cr_2.y);
}//两点间距离
double getDistancePP(Point a,Point b)
{Point c(b.x-a.x,b.y-a.y);return  c.abs();
}//点到直线距离(利用外积平行四边形)
double getDistancePL(Point a,Point b,Point c)
{Vector ab(b.x-a.x,b.y-a.y);Vector ac(c.x-a.x,c.y-a.y);return cross(ab,ac)/ab.abs();
}//点到线段距离
double getDistancePS(Point a,Point b,Point c)
{//定义4个向量Vector ab(b.x-a.x,b.y-a.y);Vector ba(a.x-b.x,a.y-b.y);Vector ac(c.x-a.x,c.y-a.y);Vector bc(c.x-b.x,c.y-b.y);if(dot(ab,ac)<0.0) return getDistancePP(a,c);if(dot(ba,bc)<0.0) return getDistancePP(b,c);return getDistancePL(a,b,c);
}//线段到线段的距离
double getDistanceSS(Point a,Point b,Point c,Point d)
{//从4个点到2线段距离中取最小return min(min(getDistancePS(c,d,a),getDistancePS(c,d,b)),min(getDistancePS(a,b,c),getDistancePS(a,b,d)));
}
int main()
{int x0,y0,x1,y1,x2,y2,x3,y3;cin>>x0>>y0>>x1>>y1>>x2>>y2;Point a(x0,y0);Point b(x1,y1);cout<<"a,b两点间距离"<<getDistancePP(a,b)<<endl;Point c(x2,y2);cout<<"c点到直线ab距离"<<getDistancePL(a,b,c)<<endl;cout<<"c点到线段ab的距离"<<getDistancePS(a,b,c)<<endl;cin>>x3>>y3;Point d(x3,y3);cout<<"线段ab到线段cd的距离"<<getDistanceSS(a,b,c,d)<<endl;return 0;
}

线段的逆时针方向(顺时针、正上方、正下方、线段上)、相交判断
–>click–>click


http://chatgpt.dhexx.cn/article/H8PL4PW6.shtml

相关文章

两平行平面间的距离

两平行平面方程为AxByCzD10&#xff0c;AxByCzD20 转载于:https://www.cnblogs.com/qiu-hua/p/8006040.html

两条平行线相交于一点

2019独角兽企业重金招聘Python工程师标准>>> 欧几里德几何说&#xff0c;两条平行的直线永远无法相交&#xff0c;爱因斯坦站在宇宙空间的角度猜测两条平行线有可能能相交&#xff0c;但到底如何相交&#xff0c;爱因斯坦也没有给出证明&#xff0c;科学家们至今也无…

【opencv】两条平行线之间的距离

问题&#xff1a;一张输入图片&#xff0c;图片上有两条平行线&#xff0c;求出这两条平行线之间的距离 解决思路&#xff1a; 1. 对图像中的直线进行细化 2. 提取直线的轮廓坐标 3. 对轮廓上的坐标进行直线集合&#xff0c;从而得到直线方程 4. 计算两条直线之间的距离 …

OpenCV计算两条平行线之间的距离

代码来自www.opencvchina.com #include "cv.h" #include "highgui.h" #include "cxcore.h" #include <stdlib.h> #include <stdio.h>#ifndef LINESDISHEADER#define LINESDISHEADER//对输入图像进行细化 void ThinImage(IplImage* s…

用vue实现tab切换

用vue实现tab切换 html代码 <div id"app"><ul class"tab-tilte"><li click"cur0" :class"{active:cur0}">html</li><li click"cur1" :class"{active:cur1}">css</li><li…

tab切换(用jQuery实现)?

页面中经常用到的tab栏&#xff0c;来分类展示内容 我认为掌握tab栏切换算是从静态页面到动态页面所迈出的第一步&#xff0c;并且在以后的工作中(jQuery框架开发)会作为jQuery中的常用事件和方法&#xff0c;反复的使用&#xff0c;所以掌握tab栏切换至关重要&#xff01;&am…

JQUERY实现TAB切换

博主是一枚前端小菜鸟&#xff0c;因为挺长时间没接触页面布局了&#xff0c;居然连tab栏切换都给忘了&#xff0c;后来博主看了一些前端资料还有书&#xff0c;发现网上的很多方法都杂乱无章&#xff0c;看的云里雾里的&#xff0c;冗余代码太多&#xff0c;这让新手小白会很苦…

React实现tab切换

下面来编写一个tab选项卡切换效果&#xff0c;效果如下图所示&#xff1a; 下面我放上该组件的代码&#xff1a; import React, { Component } from react; import { Link } from react-router; import ../scss/base.scss; import ../scss/tab.scss;class TabController exten…

vue实现Tab切换功能

在项目开发中&#xff0c;我们经常会碰到Tab切换的功能&#xff0c;而在Vue中想实现这样的功能也应该有很多种&#xff0c;常用的三种应该是 Tab路由切换、Tab动态组件切换、通过v-show设置Tab显示隐藏。每种方法实现起来其实都不难&#xff0c;看看官网介绍或看几篇博客应该就…

tab切换效果

1.效果图 2.分析步骤 1.首先写vue先引入&#xff1a;<script src"https://cdn.jsdelivr.net/npm/vue2.6.14/dist/vue.js"></script> 2.接着写静态布局 3.挂载dom 4.添加指令 5.肯定要储存数据 6. 最后效果实现 3.代码块部分 按步骤操作 1.首先&#xf…

vue中如何实现tab切换功能?

一、v-show控制内容切换 1&#xff09;简单版原理&#xff1a;用点击事件改变num值作为开关&#xff0c;控制tab样式和内容显示隐藏。 2&#xff09;数据渲染原理&#xff1a;主要利用v-for绑定的index来控制&#xff0c;跟上面差不多。 二、组件切换。 知识点主要是vue中is的…

点击tabs切换不同的内容

1.通过v-for遍历posts,然后渲染数据 2.定义currentTabs变量 3.运用computed计算属性 4.点击按钮时&#xff0c;切换下边的内容 5.点击切换tabs时&#xff0c;高亮当前tabs 4.将切换tabs的文件封装成组件&#xff0c;可以使用keep-alive进行缓存数据 5.使用keep-alive触发的生命…

Tab选项卡切换

Tab选项卡切换 基本代码 HTML代码&#xff1a; <div id"notice" class"notice"><!-- 标题--><div id"notice-tit" class"notice-tit"><ul><li><a href"#">公告</a></li>…

【JS实现tab切换】

JavaScript实现tab切换。 点击科技显示图一, 点击探索显示图二。 body部分&#xff1a; <div class"box"><ul><li class"active">科技</li><li>探索</li></ul><ol><li class"active">科…

Tab页面切换

页面效果如图 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" content"widthdevice-…

Vue实现Tab切换效果

通过Vue实现简单的Tab切换 实现思路是点击上方的标题&#xff0c;下方的内容随之发生改变&#xff0c;上方和下方用的是两个块&#xff0c;是兄弟节点&#xff0c;所以需要点击tab标题和下方内容一一对应&#xff0c;基予两个模块若下标相同是一个内容实现的。Tab切换第一步先…

html的tab切换

离开学还有10天了&#x1f630; 今天再水一篇博客 &#xff08;如图&#xff09; 通过点击来切换tab。 具体思路十分简单&#xff0c;将这些都先包含进一个大的div 先是html部分 <div class"body1"><div class"game"><ul><li>…

Vue实现选项卡切换,tab切换

1、实现tab切换就是 单击一个选项卡显示其对应的内容&#xff0c;且被点击的选项卡改变颜色&#xff0c;下面有两种实现方法&#xff08;都不要忘了vue.js的目录要写正确&#xff09; 2、第一种方法效果图 这个没什么可说的&#xff0c;直接看代码吧&#xff08;两种方式&…

最简单的Tab切换

HTML <div class"main"><div class"btn"><!-- Tab标题 --><span class"active spanList">课程介绍</span><span class"spanList">用户故事</span><span class"spanList">…

简单的tab选项卡切换

Tab选项卡切换 我们在网页上经常能看到的一个现象点击某一文字就会跳转出宁一个页面、而在同一个页面中点击头部内容&#xff0c;主体内容也会随之改变。前者是a 标签所实现的效果&#xff0c;而后者则是tab选项卡的切换。接下来我们一起来看看tab选项卡怎么个切换方法&#x…