计算几何学(工程版)

昨天写了计算几何学的东西,今天主要是工程化一下,工程借鉴B站up主

【自动驾驶】自动驾驶planning方向中常用的计算几何学知识 01_哔哩哔哩_bilibili

#pragma once#include <cmath>
#include <iostream>class Point{
public:Point() = default;Point(double x_in, double y_in) : x(x_in), y(y_in) {}Point operator + (const Point& p) const{return {x + p.x, y + p.y};}Point operator - (const Point& p) const{return {x - p.x, y - p.y};}Point operator*(double k)const {return {x * k, y * k};}friend std::ostream &operator << (std::ostream &out, const Point &p){out << "(" << p.x << ", " << p.y << ")";return out;}double DistanceTo(const Point& p) const{double dx = x - p.x;double dy = y - p.y;return std::sqrt(dx * dx + dy * dy);}double modulus() const{return sqrt(x * x + y * y);}double x;double y;
};class Segment{
public:Segment() = default;Segment(Point start_in, Point end_in) : start(start_in), end(end_in), direction(end - start) {}Segment &operator = (const Segment &s){start = s.start;end = s.end;return *this;}Segment operator + (const Segment& rhs)const {return {start + rhs.start, end + rhs.end};}Segment operator - (const Segment& rhs)const {return {start - rhs.start, end - rhs.end};}double Length() const{return direction.modulus();}Point unit_direction() const{double len = Length();if (len != 0) {return {direction.x / len, direction.y / len};} else {// Handle the case where the length is zero (avoid division by zero).throw std::runtime_error("Cannot calculate unit direction for a segment with zero length.");}}Point start;Point end;Point direction;
};class Line{
public:Line() = default;Line(Point p1_in, Point p2_in) : p1(p1_in), p2(p2_in), direction(p2_in - p1_in) {}Point p1;Point p2;Point direction;
};
#pragma once#include "Geometry.h"
#include "utils.h"double ComputeProjectionLength(const Point& p, const Segment& segement){const auto& p1p = p - segement.start;return DotProduct(p1p, segement.unit_direction());
}Point ComputeProjection(const Point& p, const Segment& segment){double projection_length = ComputeProjectionLength(p, segment);return segment.start + segment.unit_direction() * projection_length;
}
#pragma once#include "Geometry.h"
#include "utils.h"// Get distance between point p1 and point p2.
double GetDistance(const Point& p1,  const Point& p2){return p1.DistanceTo(p2);
}// Get distance between point p and a straight line.
double GetDistance(const Point& p, const Line& line){Segment p1p2(line.p1, line.p2);Segment p1p(line.p1, p);return std::abs(CrossProduct(p1p2.direction, p1p.direction)) / p1p2.Length();
}// Get distance between point p and segment(p1,p2).
double GetDistance(const Point& p, const Segment& segment){Segment p1p(segment.start, p);Segment p2p(segment.end, p);const auto c1 = DotProduct(p1p.direction, segment.direction);const auto c2 = DotProduct(p2p.direction, segment.direction);if(c1 <= 0){//distance(p,segment)=distacne(p1,p).return GetDistance(segment.start, p);}if(c2 >= 0){//distance(p,segment)=distacne(p2,p).return GetDistance(segment.end, p);}return std::abs(CrossProduct(segment.direction, p1p.direction)) / segment.Length();
}
#pragma once#include <iostream>
#include "Geometry.h"// Calculates dot product.
double DotProduct(const Point& p1, const Point& p2){return p1.x * p2.x + p1.y * p2.y;
}// Calculates cross product.
double CrossProduct(const Point& p1, const Point& p2) {return p1.x * p2.y - p2.x * p1.y;
}
#include <iostream>
#include "Geometry.h"
#include "Projection.h"
#include "Distance.h"int main(){Point point(3, 4);Segment segment(Point(0.0, 0.0), Point(10.0, 0.0));Point projection = ComputeProjection(point, segment);std::cout << "projection: " << projection << std::endl;Point p1(1, 1);Point p2(3, 5);std::cout << "Distance between p1 and p2: "<< GetDistance(p1, p2) << std::endl;Line line(Point(0, 0), Point(10, 0));Point p(3, 4);std::cout << "Distance between p and line: "<< GetDistance(p, line) << std::endl; Segment seg(Point(5, 5), Point(9, 6));std::cout << "Distance between p and segment: "<< GetDistance(p, seg) << std::endl;return 0;
}

TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/609095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬取猫咪交易网

爬取猫咪品种&#xff0c;价格等在售数据 代码展现&#xff1a; 具体代码&#xff1a; import requests import re import os filename 声音// if not os.path.exists(filename): os.mkdir(filename) def down_load(page): for page in range(page): page …

简易机器学习笔记(五)更换损失函数:交叉熵

前言 我们之前用的是均方差作为我们神经网络的损失函数评估值&#xff0c;但是我们对于结果&#xff0c;比如给定你一张应该是0的照片&#xff0c;它识别成了6&#xff0c;这个时候这个均方差表达了什么特别的含义吗&#xff1f;显然你识别成6并不代表它比识别成1的情况误差更…

各类Java对象

概念的混淆: 新一代的开发者&#xff0c;学习某一概念的不同描述或是案例后&#xff0c;人脑会去抽象、提取其特征。这一过程可能造成语义扩散、概念扭曲。这是一个盲人摸象的过程。 写到这里时&#xff0c;我在想&#xff1a;“盲人摸象”与“抽象”的“象”是不是一个意思呢&…

灵魂三连问:是5G卡吗?支持5G吗?是5G套餐吗

关于5G的问题&#xff0c;小伙伴们的疑问是不是很多&#xff0c;它和4G到底有什么区别呢&#xff1f;什么是5G卡&#xff1f;什么是5G套餐&#xff1f;支持5G吗&#xff1f;什么是5G基站&#xff1f;我想大家现在一定是晕的&#xff0c;下面小编来给大家解惑&#xff01; 1&…

【elfboard linux 开发板】9. 虚拟机扩容和内核编译

1. 虚拟机扩容 需要将虚拟机的快照全都删除&#xff0c;并且将运行的系统关机点击扩展&#xff0c;改为需要的磁盘大小安装gparted工具 sudo apt-get install gparted 如果报错&#xff0c;则按照出错内容修改&#xff0c;一般是出现下载错误&#xff0c;可以使用下列命令&…

PHP 平滑重启 kill -SIGUSR2 <PID>

在 PHP 中&#xff0c;平滑重启通常涉及向 PHP 进程发送特定的信号。以下是使用信号进行平滑重启的一般步骤&#xff1a; 1. 查找 PHP 进程的主进程 ID (PID)&#xff1a; 首先&#xff0c;您需要找到正在运行的 PHP 进程的主进程 ID (PID)。您可以使用 ps 命令来查找 ps a…

Ubuntu22.04安装VTK8.2

1. 安装ccmake 和 VTK 的依赖项&#xff1a; sudo apt-get install cmake-curses-gui sudo apt-get install freeglut3-dev2.下载VTK-8.2.0库 VTK官方网址 自己选择合适的版本进行下载&#xff0c;解压到VTK文件夹下&#xff0c;再新建文件下名为build 3. 配置VTK 进入buil…

【Python百宝箱】模拟未见之境:精准工具畅游分子动力学风景

分子演绎&#xff1a;模拟工具的综合探索 前言 在当今科学研究中&#xff0c;分子动力学模拟成为解析原子和分子行为的关键工具之一。本文将深入探讨几种领先的分子动力学模拟工具&#xff0c;包括MDTraj、ASE&#xff08;原子模拟环境&#xff09;、OpenMM和CHARMM。这些工具…

控制器转盘错误

目录 起因 经过(调试) 点焊机数据修改 结果 今天来记录设备的维修记录,下面来根据起因,经过,结果来说明情况!!!,希望对读者的你有帮助!!!

强化学习Double DQN方法玩雅达利Breakout游戏完整实现代码与评估pytorch

1. 实验环境 1.1 硬件配置 处理器&#xff1a;2*AMD EPYC 7773X 64-Core内存&#xff1a;1.5TB显卡&#xff1a;8*NVIDIA GeForce RTX 3090 24GB 1.2 工具环境 Python&#xff1a;3.10.12Anaconda&#xff1a;23.7.4系统&#xff1a;Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-…

软件测试|解决‘pip‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

前言 很多Python初学者在使用Python时&#xff0c;会遇到环境的问题&#xff0c;比如无法使用pip命令安装第三方库的问题&#xff0c;如下图&#xff1a; 当出现错误信息 "pip 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件" 时&#xff0c;这通常…

echarts柱状图加单位,底部文本溢出展示

刚开始设置了半天都不展示单位&#xff0c;后来发现是被挡住了&#xff0c;需要调高top值 // 基于准备好的dom&#xff0c;初始化echarts实例var myChart echarts.init(document.getElementById("echartD"));rankOption {// backgroundColor: #00265f,tooltip: {…

树定义及遍历

1、定义树 可以参考链表&#xff0c;链表遍历不方便&#xff0c;如果单链表有多个next指针&#xff0c;则就形成了树。 Java: public class TreeNode {int val;TreeNode left, right;TreeNode(int val) { this.val val; this.left null;this.right null;} } Python&#…

WIN32 桌面应用编程综合实验一学习记录

文章目录 引用传递和指针传递的区别和联系如何创建一个空的WINDOWS桌面项目C编程中函数声明、定义和链接的基本概念 引用传递和指针传递的区别和联系 case ID_SETTING_FONT:GetDrawFont(hWnd, gs_logFont, &gs_TextColor); break;logFont 和 pColor 的用法体现了 C 中两种…

stm32的规则采样与注入采样的理解

规则与注入转换 在STM32中&#xff0c;规则采样&#xff08;Regular Conversion&#xff09;和注入采样&#xff08;Injected Conversion&#xff09;是用于模数转换的两种不同模式。 规则采样&#xff08;Regular Conversion&#xff09;&#xff1a;规则采样是STM32中最常用…

面试算法105:最大的岛屿

题目 海洋岛屿地图可以用由0、1组成的二维数组表示&#xff0c;水平或竖直方向相连的一组1表示一个岛屿&#xff0c;请计算最大的岛屿的面积&#xff08;即岛屿中1的数目&#xff09;。例如&#xff0c;在下图中有4个岛屿&#xff0c;其中最大的岛屿的面积为5。 分析 将岛屿…

力扣-34. 在排序数组中查找元素的第一个和最后一个位置

文章目录 力扣题目代码 力扣题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算…

山东名岳轩印刷包装携专业包装袋盛装亮相2024济南生物发酵展

山东名岳轩印刷包装有限公司盛装亮相2024第12届国际生物发酵展&#xff0c;3月5-7日山东国际会展中心与您相约&#xff01; 展位号&#xff1a;1号馆F17 山东名岳轩印刷包装有限公司是一家拥有南北两个生产厂区&#xff0c;设计、制版、印刷&#xff0c;营销策划为一体的专业…

python运行报错_ModuleNotFoundError: No module named ‘xxx‘,调用自己定义的文件报错。

问题描述&#xff1a;cifar10.py文件调用non_stationary.py文件的方法 目录结构&#xff1a; project_directory/ └── continuum/├── dataset_scripts/│ └── cifar10.py├── __init__.py├── continuum.py└── non_stationary.py# cifar10.pyfrom continuum…

JavaSec基础 反射修改Final修饰的属性及绕过高版本反射限制

反射重拾 半年没碰java了 先写点基础回忆一下 反射弹计算器 public class Test {public static void main(String[] args) throws Exception {Class<?> clazz Class.forName("java.lang.Runtime");clazz.getDeclaredMethod("exec", String.cla…