首页 > 其他分享 >简易二维计算几何

简易二维计算几何

时间:2023-09-07 17:34:26浏览次数:34  
标签:std const Point text double 简易 二维 几何 return

\(\text{C++}\) 中的 \(\text{complex}\) 库

先判断该题是浮点数据还是整型数据

浮点用 long double 或者 double

整型用 long long 或者 int

计算过程出现小数务必使用浮点

using Point = std::complex<double>;

读入 \(n\) 个点

int n;
std::cin >> n;
std::vector<Point> a(n);
for (int i = 0; i < n; i++) {
    int x, y;
    std::cin >> x >> y;
    a[i] = Point(x, y);
}

\(\text{complex}\) 有一点点类似 \(\text{pair}\),\(\text{pair}\) 有 \(\text{first}\) 和 \(\text{second}\),\(\text{complex}\) 有 \(\text{real}\) 和 \(\text{imag}\)

Point p(1, 0);
double x = std::real(p);
double y = std::imag(p);

Point p(1, 0);
double x = p.real();
double y = p.imag();

叉乘

auto cross(const Point &a, const Point &b) {
    return std::imag(std::conj(a) * b);
}

点乘

auto dot(const Point &a, const Point &b) {
    return std::real(std::conj(a) * b);
}

向量变为 \(k\) 倍

double k = 2;
Point p(1, 1);
p *= k;
// (2, 2)

\(a,b\) 两点距离

Point a(1, 0), b(0, 1);
double dis = std::abs(a - b);

\(\pi\)

const double Pi = std::acos(-1.0);

平方 \(x^{2}+y^{2}\)

Point a(1, 1);
double d = std::norm(a);

设定 \(x,y\)

Point a(1, 0);
a.real(2);
a.imag(2);

向量旋转,逆时针转 \(rad\) 弧度

Point rotate(const Point &p, const double &rad) {
    return p * Point(std::cos(rad), std::sin(rad));
}

三点构三角形面积

double area(const Point &a, const Point &b, const Point &c) {
    return std::abs(cross(b - a, c - a)) / 2.0;
}

浮点判长度 \(x,y\) 相等

一般 \(\text{EPS} = 10^{-9}\),\(\text{EPS}\) 为浮点修正

constexpr double EPS = 1E-9;
double x, y;
cin >> x >> y;
bool equ = (std::abs(x - y) <= EPS);

输出,没说保留几位就保留多一点

std::cout << std::fixed << std::setprecision(15);

\(\text{arg}\)

Point p(1, 1);
std::cout << std::arg(p); // 返回 std::atan(p.imag() / p.real())

\(\text{Line}\)
这里的线都视为有方向的,从 \(a\) 点到 \(b\) 点

struct Line {
    Point a, b;
    Line() = default;
    Line(const Point &a, const Point &b) : a(a), b(b) {}
};

Point a(1, 1), b(2, 2);
Line l(a, b);

\(\text{sign}\) 符号判定

int sign(const double &x) {
    return x < -EPS ? -1 : x > EPS ? 1 : 0;
}

\(\text{onLeft}\) 判定

// 1->点在左侧 -1->点在右侧 0->点在线上
int onLeft(const Point &p, const Line &l) {
    return sign(cross(l.b - l.a, p - l.a));
}

标签:std,const,Point,text,double,简易,二维,几何,return
From: https://www.cnblogs.com/kiddingma/p/17685594.html

相关文章

  • 动态规划在二维数组上的运用
    力扣连接:https://leetcode.cn/problems/unique-paths/题目一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例1:输入:m=3,n=......
  • 【ROS2机器人入门到实战】简易雷达原理介绍
    1.简易雷达原理介绍写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn你好,我是爱吃鱼香ROS的小鱼。在正式开始制作我们的简易......
  • 【ROS2机器人入门到实战】ROS2硬件实战(自制简易雷达)
    第15章ROS2硬件实战(自制简易雷达)写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn你好,我是小鱼。本章是ROS2硬件实战教程......
  • Revit API创建几何实体Solid并找到与之相交的元素
    几何实体的创建方法之一:构成封闭底面,指定拉伸方向与拉伸高度。GeometryCreationUtilities//自创几何实体相交法[TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]publicclassFindIntersectWallsByGeometry:IExternalCommand{publicResult......
  • 一次尝试:一种基于Common Lisp的简易单词本命令行工具
    绪论背景英语的学习给现代中国学生带来了极大的挑战。学习英语的一种常规做法是记录纸质笔记。然而,常规的纸质笔记具有书写慢、不易修改的特点……(编不下去了)。为了简化英语单词笔记记录、查看的操作,本文基于一种简单的数据管理方法,提出一种新型单词本,即lisp-dictionary命令行工......
  • Vue3实现批量打印二维码与条形码
    (二维码与条形码在vue3中的使用)欢迎阅览本篇文章这篇文章是我在工作途中对批量生成二维码的一些见解,例如vue-qr(二维码)与jsbarcode(条形码)在vxe-table表格中的使用,二维码与条形码的批量生成与打印(打印时一页一个码)等。注意!本篇文章的所有代码均使用setup语法糖与TypeScript,请确保......
  • 从头开始:将新项目上传至Git仓库的简易指南
    无论您是一个经验丰富的开发者还是一个刚刚起步的新手,使用Git来管理您的项目是一个明智的选择。Git是一个强大的版本控制系统,它可以帮助您跟踪项目的变化、合并代码以及与团队成员协作。在本文中,我们将为您提供一步步的指南,教您如何将一个现有的项目上传至仓库。步骤1:创建远程仓库......
  • 【Python-装饰器】无参数简易装饰器示例合集
    无参数装饰器案例​ 一些简易的不携带参数的装饰器合集,用于学习和巩固装饰器方面的知识,配合vscode的Debug功能或者pythontutor网站的运行流程可视化来查看装饰器的工作原理以及运行时机。1.计时器装饰器#计时器装饰器:用于测量函数执行时间。importtimedeftimer(func):......
  • 基于springboot的简易聊天系统
    系统使用技术:springboot前端技术:thymeleaf、js、css、layui开发工具:idea数据库:mysql5.7项目介绍:该系统基于springboot,mysql数据库,页面美观,可以在此基础上进行二次开发。下面我们来看看部分相关功能。系统登录:聊天可以选择某个好友进行聊天,聊天内容可以是文字、表情、图片,或者带有格......
  • 利用控件生成二维码
    Sub生成二维码()DimwbAsWorkbookDimshtAsWorksheetSetwb=Application.ThisWorkbookSetsht=wb.Worksheets(1)'RandomizeWithsht'删除旧条码控件.Shapes.SelectAllSelection.DeleteFori=1To......