首页 > 其他分享 >计算点二维A到线段B的垂线距离

计算点二维A到线段B的垂线距离

时间:2023-06-10 09:01:28浏览次数:45  
标签:ya double 线段 xa xb1 二维 dx yb1 垂线

#include <iostream>
#include <cmath>

using namespace std;

// 计算距离函数
double distance(double x1, double y1, double x2, double y2) {
    return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}

// 计算点 A 到线段 B 的垂线距离
double perpendicularDistance(double xa, double ya, double xb1, double yb1, double xb2, double yb2) {
    // 将线段 B 表示为向量 AB
    double dx = xb2 - xb1;
    double dy = yb2 - yb1;

    // 如果 AB 的长度为 0,说明线段 B 是一个点,返回该点和 A 的距离
    if (dx == 0 && dy == 0) {
        return distance(xa, ya, xb1, yb1);
    }

    // 计算向量 AP 和 AB
    double v1x = xa - xb1;
    double v1y = ya - yb1;
    double v2x = dx;
    double v2y = dy;

    // 如果 A 在 B 的延长线上,返回距离 AB 两端点最近的距离
    if (v1x * v2x + v1y * v2y <= 0) {
        return distance(xa, ya, xb1, yb1);
    }

    // 如果 A 在 B 另一端的延长线上,同样返回距离 AB 两端点最近的距离
    if ((xa - xb2) * dx + (ya - yb2) * dy >= 0) {
        return distance(xa, ya, xb2, yb2);
    }

    // 否则,将 AP 投影在 AB 上得到 BP
    double t = (v1x * v2x + v1y * v2y) / (dx * dx + dy * dy);
    double bx = xb1 + t * dx;
    double by = yb1 + t * dy;

    // 返回 AP 在 BP 上的投影距离
    return distance(xa, ya, bx, by);
}

int main() {
    double xa = 1.0, ya = 2.0;
    double xb1 = 3.0, yb1 = 4.0, xb2 = 5.0, yb2 = 6.0;
    double distance = perpendicularDistance(xa, ya, xb1, yb1, xb2, yb2);
    cout << "The perpendicular distance between point A and line segment B is: " << distance << endl;
    return 0;
}

标签:ya,double,线段,xa,xb1,二维,dx,yb1,垂线
From: https://www.cnblogs.com/jobgeo/p/17470742.html

相关文章

  • HZOI 大根堆 线段树合并
    题目描述给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点。每个点有一个权值v_i。你需要将这棵树转化成一个大根堆。确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i>v_j。请计算可选的最多的点数,注意这些点不必形成......
  • 二维码测试点__肖sir__测试点整理
    二维码测试点==================================================功能测试1.扫描成功是否做出正确响应2.扫描失败是否有提示3.扫码进入页面显示是否正确,跳转链接是否正确4.保存扫码图片,是否支持长按图片识别进入5.只扫描部分时,是否扫描成功6.扫描模糊的二维码,能否扫描成功......
  • LeetCode----二维网格DFS
    1算法模板voiddfs(int[][]grid,intr,intc){//判断basecase//如果坐标(r,c)超出了网格范围,直接返回if(!inArea(grid,r,c)){return;}//访问上、下、左、右四个相邻结点dfs(grid,r-1,c);dfs(grid,r+1,c);......
  • 线段树合并学习笔记
    前言我是一个什么什么傻卵啊啊啊啊啊啊啊啊,连线段树合并都学不明白qaq正文权值线段树含义:是用来维护好多好多桶的线段树.桶是一个用来计数的东西.与普通线段树的区别普通线段树是用来维护区间和、积、最值等一系列的东西.权值线段树是用来维护某个区间内的数出现了......
  • 在前端生成H5二维码海报
    海报图片生成前后端都能实现,个人喜欢在前端生成,主要是前端可以用html+css去实现海报样式,便于调试,对于熟悉前端代码的小伙伴来说再好不过。以下是在vue项目中的实现,非vue前端同理。思路及步骤:1.用html实现海报效果制作海报模板图,用js二维码库生成二维码,用CSS的绝对定位实现二......
  • 题解 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
    传送门如题目所言,这就是个线段树合并的板子题。题目大意题目描述首先村落里的一共有\(n\)座房屋,并形成一个树状结构。然后救济粮分\(m\)次发放,每次选择两个房屋\((x,y)\),然后对于\(x\)到\(y\)的路径上(含\(x\)和\(y\))每座房子里发放一袋\(z\)类型的救济粮。然......
  • Luogu P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
    [Vani有约会]雨天的尾巴/【模板】线段树合并题目背景深绘里一直很讨厌雨天。灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地里的粮食被弄得一片狼藉。无奈......
  • Codeforces 1566G - Four Vertices(线段树分治)
    交了整整2页,本来想用随机化卡过去的,后来发现我的实现跑得太慢就写正常做法了。首先发现最优答案对应的四个点只可能有以下两种可能:\(a,b\)间有边,\(c,d\)间有边,此时答案是\(a,b\)边权值加\(c,d\)边权值。\(a\)与\(b,c,d\)三个点间都有边,此时答案是三条边权值之和。......
  • m基于遗传优化的凸松弛算法完成从二维人体图像中提取三维姿态的matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要      三维姿态估计是计算机视觉领域中一个非常重要的问题,它在许多应用中都具有重要的作用,如人机交互、姿态识别、动作捕捉等。在过去的几年中,随着深度学习技术的发展,基于深度学习的方法取得了......
  • m基于遗传优化的凸松弛算法完成从二维人体图像中提取三维姿态的matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要三维姿态估计是计算机视觉领域中一个非常重要的问题,它在许多应用中都具有重要的作用,如人机交互、姿态识别、动作捕捉等。在过去的几年中,随着深度学习技术的发展,基于深度学习的方法取得了很大的进展,但是这些方法仍......