[算法] A LITTLE 计算几何

news/2024/9/24 21:09:27

叉积

有两个平面向量a, b,那么有 a $ \times $ b $ = x_a \times y_b - x_b \times y_a $;

这是有方向的,且遵守右手定则,正代表 a 逆时针转到 b,负代表顺时针;

凸包

求凸包,我用的 $ Graham $ 扫描法;

首先把最底下的点找出来,然后按照其它点对于这个点的角度排序,然后用一个类似于单调栈的东西维护一下即可;

时间复杂度: $ \Theta(n \log n) $

例题:Luogu P2742

点击查看代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;
int n;
struct poi{double x, y;double operator ^(const poi &A) const {return x * A.y - y * A.x;}
}e[500005], s[500005];
int cnt;
double dis(poi x) {return sqrt(x.x * x.x + x.y * x.y);
}
bool cmp(poi x, poi y) {poi a = {x.x - e[1].x, x.y - e[1].y};poi b = {y.x - e[1].x, y.y - e[1].y};double c = a ^ b;if (c > 0.0) return 1;else if (c == 0.0 && dis(a) <= dis(b)) return 1;else return 0;
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {cin >> e[i].x >> e[i].y;if (i != 1 && (e[1].y > e[i].y || (e[1].y == e[i].y && e[1].x > e[i].x))) swap(e[1], e[i]);}sort(e + 2, e + 1 + n, cmp);s[1] = e[1];cnt = 1;for (int i = 2; i <= n; i++) {poi a = {s[cnt].x - s[cnt - 1].x, s[cnt].y - s[cnt - 1].y};poi b = {e[i].x - s[cnt].x, e[i].y - s[cnt].y};while(cnt > 1 && ((a ^ b) <= 0.0)) {cnt--;a = {s[cnt].x - s[cnt - 1].x, s[cnt].y - s[cnt - 1].y};b = {e[i].x - s[cnt].x, e[i].y - s[cnt].y};}s[++cnt] = e[i];}s[++cnt] = e[1];double ans = 0.0;for (int i = 2; i <= cnt; i++) {ans += dis({s[i].x - s[i - 1].x, s[i].y - s[i - 1].y});}cout << fixed << setprecision(2) << ans;return 0;
}

旋转卡壳

以求凸包直径为例,我们的这个算法就是拿一组平行线去卡凸包,最后看哪个最大即可;

用双指针维护一下,每次找凸包的一条边,然后找最远的点即可;

时间复杂度:$ \Theta(n) $

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)

需求1.使用osg三维引擎进行动力学模型仿真性能测试;  2.打开动力学仿真模型文件,.k后缀的模型文件,测试加载解析过程;  3.解决第三方company的opengl制作的三维引擎,绘制面较多与弹丸路径模拟较卡顿的问题;  4.测试时,使用的模型为公开模型,基础面数量达到160多万…

【入门岛第1关】linux 基础知识

目录闯关任务 完成SSH连接与端口映射并运行hello_world.py 闯关任务 完成SSH连接与端口映射并运行hello_world.py 1 在远程主机上建立hello_python.py程序并运行,查看程序运行的端口: import socket import re import gradio as gr# 获取主机名 def get_hostname():hostname …

DOTS计算Voronoi图形生成,根据点自动划分区域生成多边形

如图,生成Voronoi图形,代码如下。using UnityEngine; using Unity.Mathematics; using Unity.Jobs; using Unity.Collections; using Unity.Profiling;[ExecuteInEditMode] public class VoronoiTextureBurstJobComponent : MonoBehaviour {[SerializeField][Min(1)] uint _s…

Vue2+3基础

。第一个Vue程序 使用script进行Vue全局设置: 指定Vue实例挂载的位置 , Vue和js一样,都需要在script里写 第一步创建vue实例 1.为什么要new vue(),直接调用Vue不行吗?不行,因为如果直接调用Vue()会报如下错误: 2.关于vue构造函数:optionsoptions翻译为多个选项 Vue…

任务4:制作二维码

该二维码链接到游戏“植物大战僵尸”,寓教于乐。 提升趣味性和互动性的同时,学生们参与到课堂当中,发挥主体作用,感受到自然界植物的多样性,对土壤的作用有了更深刻的理解。

封装的练习题目1

1.使用面向对象的思想,编写自定义描述狗的信息。设定属性包括:品种,年龄,心 情,名字;方法包括:叫,跑。 要求: 1)设置属性的私有访问权限,通过公有的 get,set 方法实现对属性的访问 2)限定心情只能有“心情好”和“心情不好”两种情况,如果无效输入进行提示, 默认…

五款免费可视化工具全解析:选择你的最佳搭档

1. 山海鲸可视化 介绍: 山海鲸可视化是一款免费的国产可视化报表软件,与许多其他宣传免费的软件不同,山海鲸的报表功能完全免费并且没有任何限制,就连网站管理后台这个功能也是免费的。同时山海鲸可视化还提供了种类丰富的可视化图表、三维模型、模板可供使用,软件采用点击…