【计算几何】叉积

news2025/1/14 18:29:30

叉积

海伦公式求三角形面积

已知三角形三条边分别为a,b,c,设 p = a + b + c 2 p =\frac{a+b+c}{2} p=2a+b+c,
那么三角形的面积为:
p ( p − a ) ( p − b ) ( p − c ) \sqrt{p(p-a)(p-b)(p-c)} p(pa)(pb)(pc)
缺点:在开根号的过程中精度损失

概念

两个向量的乘积,设有p1,p2两个坐标,p1表示从(0,0)点出发,到(x1,y1)的坐标,p2表示从(0,0)点出发,到(x2,y2)的坐标。
计算公式:
p 1 × p 2 = ( x 1 x 2 y 1 y 2 ) p1\times p2=\begin{pmatrix} x1 &x2 \\ y1 &y2 \end{pmatrix} p1×p2=(x1y1x2y2)
=x1y2-x2y1
=-p2×p1(不满足交换律)

设p0p1和p0p2是任意向量,已知三个p点的坐标,要求他们的叉积
p0p1向量的坐标是(x1-x0,y1-y0)
p0p2向量的坐标是(x2-x0,y2-y0)
再对这两个向量求叉积就行了:
( x 1 − x 0 x 2 − x 0 y 1 − y 0 y 2 − y 0 ) \begin{pmatrix} x1-x0 &x2-x0 \\ y1-y0 &y2-y0 \end{pmatrix} (x1x0y1y0x2x0y2y0)
结果是:
(x1-x0)(y2-y0)-(x2-x0)(y1-y0)

方向:
如果p1×p2>0,p1在p2顺时针方向上
如果p1×p2=0,p1和p2共线
如果p1×p2<0,p1在p2的逆时针方向

用叉积判断两个向量的位置关系

1.给定具有共同端点的两个有向线段 p 0 p 1 → \overrightarrow{p_0p_1} p0p1 p 1 p 2 → \overrightarrow{p_1p_2} p1p2 ,请问 p 0 p 1 → \overrightarrow{p_0p_1} p0p1 是否在 p 0 p 2 → \overrightarrow{p_0p_2} p0p2 的瞬时针方向上?
2.给定两个有向线段 p 0 p 1 → \overrightarrow{p_0p_1} p0p1 p 1 p 2 → \overrightarrow{p_1p_2} p1p2 ,如果我们首先沿着p0p1的方向走,然后沿着p1p2走,请问在p1点,是左转还是右转?
3.给定两个向量 p 1 p 2 → \overrightarrow{p_1p_2} p1p2 p 3 p 4 → \overrightarrow{p_3p_4} p3p4 ,如何判断他们是否相交?

(1)用向量 p 0 p 1 → \overrightarrow{p_0p_1} p0p1 × p 0 p 2 → \overrightarrow{p_0p_2} p0p2 ,如果>0就在顺时针方向上
(2)构造 p 0 p 2 → \overrightarrow{p_0p_2} p0p2 这个向量,如果 p 0 p 1 → \overrightarrow{p_0p_1} p0p1 × p 0 p 2 → \overrightarrow{p_0p_2} p0p2 >0说明是向左,否则向右
(3)分情况讨论:
1.若是普通相交的情况,比如下图:
Pulpit rock

先判断 p 1 p 2 → \overrightarrow{p_1p_2} p1p2 p 1 p 3 → \overrightarrow{p_1p_3} p1p3 的叉积,以及 p 1 p 2 → \overrightarrow{p_1p_2} p1p2 p 1 p 4 → \overrightarrow{p_1p_4} p1p4 的叉积是否异号
Pulpit rock

再判断 p 3 p 4 → \overrightarrow{p_3p_4} p3p4 p 3 p 1 → \overrightarrow{p_3p_1} p3p1 的叉积,以及 p 3 p 4 → \overrightarrow{p_3p_4} p3p4 p 3 p 2 → \overrightarrow{p_3p_2} p3p2 的叉积是否异号
Pulpit rock

如果都异号的话(相乘小于0),那么说明相交
2.如果有一个点与其中一个向量共线
如图, p 3 p 2 → \overrightarrow{p_3p_2} p3p2 p 3 p 4 → \overrightarrow{p_3p_4} p3p4 共线
Pulpit rock
那么我们只需判断p2的横纵坐标在不在p3和p4的横纵坐标之间即可
min ⁡ \min_{} min ( x p 3 x_{p3} xp3 , x p 4 x_{p4} xp4 )<= x p 2 x_{p2} xp2 <= max ⁡ \max_{} max ( x p 3 x_{p3} xp3 , x p 4 x_{p4} xp4 ) && min ⁡ \min_{} min ( y p 3 y_{p3} yp3 , y p 4 y_{p4} yp4 )<= y p 2 y_{p2} yp2 <= max ⁡ \max_{} max ( y p 3 y_{p3} yp3 , y p 4 y_{p4} yp4 )

物理意义

用这两个向量为两个边作一个平行四边形,平行四边形的有向面积就是叉积的结果

求凸多边形面积

求形如下图的凸n边形的面积
Pulpit rock

我们可以把这个n边形从一个点开始向其他的点连线分成n-2个三角形
Pulpit rock

因为每个三角形是叉积的绝对值的一半,所以依次求每个三角形的面积即可

long long cj(int x1,int y1,int x2,int y2){
	return x1*y2-x2*y1;
}
	for(int i=2;i<n;i++){
		int x1=p[i].x -p[1].x ;
		int y1=p[i].y -p[1].y ;
		int x2=p[i+1].x -p[1].x ;
		int y2=p[i+1].y -p[1].y ;
		int op=abs(cj(x1,y1,x2,y2))/2;
		ans+=op;
	}

求凹多边型面积

求形如下图的凹n边形的面积
Pulpit rock

如果按逆时针走的话我们可以发现:
当从p2走到p3的时候我们是往左,p3走到p4的时候往左,但是在p4走到p1的时候是往右,而 Δ p 3 p 4 p 1 \Delta p3p4p1 Δp3p4p1 是凹进去的,所以我们可以先按顺序算叉积相加(不取绝对值),最后的结果取绝对值,最后的结果就是面积(如下图,绿色的面积是正的,红色的面积是负的,相加取绝对值就是最后的面积)
Pulpit rock

long long cj(int x1,int y1,int x2,int y2){
	return x1*y2-x2*y1;
}
	for(int i=2;i<n;i++){
		int x1=p[i].x -p[1].x ;
		int y1=p[i].y -p[1].y ;
		int x2=p[i+1].x -p[1].x ;
		int y2=p[i+1].y -p[1].y ;
		int op=cj(x1,y1,x2,y2)/2;
		ans+=op;
	}
    cout<<abs(ans)<<endl;

以任意点为扇心的三角形剖分

可以在多边形内找一个点,然后连向多边形的n个点,组成的所有的三角形的面积就是总面积

Pulpit rock

任意的点与多边形的n个点组成的三角形剖分

在平面内任意找一点,如果在外部,如下图:
Pulpit rock

那么我们可以发现,依次求叉积相加的结果的绝对值依旧等于三角形的面积(红色面积是负数,绿色面积是正数)
Pulpit rock

求任意多边形的面积公式

那么为了方便计算,我们可以把这个点设为原点,那么化简后的面积公式为:
A= 1 2 \frac{1}{2} 21 ∑ i = 1 n \sum_{i=1}^{n} i=1n
$
\begin{bmatrix}
x_{i} &x_{i+1} \
y_{i} &y_{i+1}
\end{bmatrix}$ (i=1…n)

例题:多边形的面积

原题链接:https://www.luogu.com.cn/problem/P1183

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=110;
int n;
struct name{
	int x,y;
}p[N];
long long cj(int x1,int y1,int x2,int y2){
	return x1*y2-x2*y1;
}
signed main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p[i].x>>p[i].y;
	}
	int ans=0;
	for(int i=0;i<n;i++){
		int id1=i%n;
		int id2=(i+1)%n;
		int op=cj(p[id1].x ,p[id1].y ,p[id2].x ,p[id2].y );
		ans+=op;
	}
	cout<<abs(ans)/2<<endl;
	return 0;
}

求多边形重心

给定一个简单多边形,求其重心
输入:多边形的顶点坐标(按逆时针顺序排列)
输出:重心点C的坐标
三角形的重心公式是:
x=(x1+x2+x3)/3
y=(y1+y2+y3)/3

将他分为n-2个三角形,对于每个三角形求出他的面积和重心坐标的积,所有的积相加之后除以总面积即可
设每个点与 p 1 p_{1} p1 相连
x 0 i x_{0i} x0i =( x 1 x_{1} x1 + x i x_{i} xi + x i + 1 x_{i+1} xi+1 )/3
y 0 i y_{0i} y0i =( y 1 y_{1} y1 + y i y_{i} yi + y i + 1 y_{i+1} yi+1 )/3
s i s_{i} si =( p 1 p i → \overrightarrow{p_1p_i} p1pi × p 1 p i + 1 → \overrightarrow{p_1p_{i+1}} p1pi+1 )/2
X=( ∑ i = 2 n − 1 \sum_{i=2}^{n-1} i=2n1 s i s_{i} si× x 0 i x_{0i} x0i )/ s 总 s_{总} s
Y=( ∑ i = 2 n − 1 \sum_{i=2}^{n-1} i=2n1 s i s_{i} si× y 0 i y_{0i} y0i )/ s 总 s_{总} s

原博客网站:https://demooo.top/algorithm/%E8%AE%A1%E7%AE%97%E5%87%A0%E4%BD%95/chaji.html

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

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

相关文章

DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释)

目录 那年深夏 引入 1.什么是深度优先搜索&#xff08;DFS&#xff09;&#xff1f; 2.什么是栈&#xff1f; 3.什么是递归&#xff1f; 图解过程 问题示例 1、全排列问题 2、迷宫问题 3、棋盘问题&#xff08;N皇后&#xff09; 4、加法分解 模板 剪枝 1.简介 2.剪枝的…

Jupyter notebook折叠隐藏cell代码块 (hidden more than code cell in jupyter notebook)

Nbextensions 中的 hidden input 可以隐藏cell 我们在notebook中嵌入了一段画图的代码&#xff0c;影响代码阅读&#xff0c;搜一下的把这段代码隐藏。 我们使用了 jupyter notebook配置工具 Nbextensions。找到hidden input&#xff0c;这样只会隐藏输入的代码&#xff0c;而…

Tkinter的Radiobutton控件

Tkinter的Radiobutton是一个含有多个选项的控件&#xff0c;但是只能选择其中的一个选项 使用方法 R1tk.Radiobutton(root,textA,variablevar,valueA,commandprintf) R1.pack() R2tk.Radiobutton(root,textB,variablevar,valueB,commandprintf) R2.pack() R3tk.Radiobutton(ro…

【Linux】同步与互斥

目录&#x1f308;前言&#x1f338;1、Linux线程同步&#x1f368;1.1、同步概念与竞态条件&#x1f367;1.2、条件变量&#x1f33a;2、条件变量相关API&#x1f368;2.1、初始化和销毁条件变量&#x1f367;2.2、阻塞等待条件满足&#x1f383;2.3、唤醒阻塞等待的条件变量&…

2023 年第一弹, Flutter 3.7 发布啦,快来看看有什么新特性

核心内容原文链接&#xff1a; https://medium.com/flutter/whats-new-in-flutter-3-7-38cbea71133c 2023 年新春之际&#xff0c; Flutter 喜提了 3.7 的大版本更新&#xff0c;在 Flutter 3.7 中主要有改进框架的性能&#xff0c;增加一些很棒的新功能&#xff0c;例如&#…

初识网络爬虫

爬虫简介 网络爬虫又称网络蜘蛛、网络机器人&#xff0c;它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页&#xff0c;并将所需要的数据抓取下来。通过对抓取的数据进行处理&#xff0c;从而提取出有价值的信息。 爬虫简单来说就是是通…

Mongodb基础操作

打开Mongodb服务&#xff0c;打开Robo 3T&#xff0c;链接服务并创建数据库&#xff1a; 创建表&#xff08;集合&#xff09;&#xff1a; 双击打开一个界面&#xff1a; 添加数据 查询book表&#xff1a; 添加属性名&#xff08;新数据&#xff09;&#xff1a; 查询&#xf…

推荐算法入门:序列召回(二)

召回&#xff1a;输入一个用户的&#xff08;点击&#xff09;序列&#xff0c;通过某种方法&#xff08;序列建模的方法&#xff09;&#xff0c;把用户输入的序列变为向量&#xff0c;用用户向量&#xff0c;在所有的item的向量进行快速检索&#xff0c;依次达到序列召回的效…

Linux使用YUM源安装Docker

安装环境查看Linux版本&#xff0c;如图&#xff1a;下载docker yum源登录阿里云开源镜像站&#xff0c;地址如下&#xff1a;阿里云开源镜像站搜索docker&#xff0c;如图&#xff1a;打开docker-ce&#xff0c;如图&#xff1a;复制docker-ce源地址&#xff0c;如下&#xff…

高并发环境如何有效缓解带宽压力

网络带宽是指在单位时间&#xff08;一般指的是1秒钟&#xff09;内能传输的数据量。网络和高速公路类似&#xff0c;带宽越大&#xff0c;就类似高速公路的车道越多&#xff0c;其通行能力越强。   在持续的多用户、高并发的情况下&#xff0c;缓解带宽压力可以避免客户端卡…

IO和NIO

什么是I/O模型: 通常情况下I/O操作是比较耗时的&#xff0c;所以为了高效的使用硬件&#xff0c;应用程序可以专门设置一个线程进行I/O操作&#xff0c;而另外一个线程则利用CPU的空闲去做其他计算&#xff0c;这种为提高应用执行效率而采用的I/O操作方法称为I/O模型&#xff…

【笔记】ASP.NET Core技术内幕与项目实现:基于DDD与前后端分离

最近在写论文&#xff0c;想使用ASP.NET Core Web API技术&#xff0c;但对它还不是很熟&#xff0c;鉴权组件也没用过&#xff0c;于是在网上查找资料&#xff0c;发现了杨中科老师写的这本书&#xff08;微信读书上可以免费看&#xff09;&#xff0c;说起来我最初自学C#时看…

C++:类中const修饰的成员函数

目录 一.const修饰类的成员函数 1.问题引出&#xff1a; 代码段&#xff1a; 2.问题分析 3.const修饰类的成员函数 二. 类的两个默认的&运算符重载 三. 日期类小练习 一.const修饰类的成员函数 1.问题引出&#xff1a; 给出一段简单的代码 代码段&#xff1a; #in…

springcloud3 Sentinel的搭建以及作用

一 sentinel的概念 1.1 sentinel Sentinel是分布式系统流量控制的哨兵&#xff0c;阿里开源的一套服务容错的综合性解决方案。 主要用来处理&#xff1a; 服务降级 服务熔断 超时处理 流量控制 sentinel 的使用可以分为两个部分: 核心库&#xff08;Java 客户端&#…

【软件工程】用例图、状态图与活动图

题目要求&#xff1a; 一、投诉人对广州市燃气行业相关单位的经营和服务不满意或存在意见时&#xff0c;对燃气处或市政园林局服务监督处进行投诉。 二、燃气处投诉专管员受理直接来自投诉人或由服务监督处转来的相关投诉。 三、燃气处投诉专管员落实相关单位&#xff08;或…

DlhSoft Gantt Chart Light Library 4.3.47 Crack

DlhSoft Gantt Chart Light Library 4.3.47 改进了 Microsoft Project XML 文件的加载和图像的导出。 2023 年 1 月 24 日 - 10:09新版本 特征 改进了 Microsoft Project XML 文件的加载和从“ScheduleChartDataGrid”导出图像。 添加了新的“TotalResourceEffort”和“TotalRe…

USART 数据流控制

USART 数据流控制 也就是 USART_HardwareFlowControl 一、流控制的作用 这里讲到的 “流”&#xff0c;指的是数据流&#xff1b;在数据通信中&#xff0c;流控制是管理两个节点之间数据传输速率的过程&#xff0c;以防止出现接收端的数据缓冲区已满&#xff0c;而发送端依然继…

3.5动态规划--凸多边形的最优三角剖分

写在前面 尽管这是一个几何问题&#xff0c;但本质上与3.1-矩阵连乘极为相似 定义dp数组的含义&#xff1a;t[i][j]表述以点Vi-1&#xff0c;Vi&#xff0c;...&#xff0c;Vj为顶点的最优三角形剖分的最优权函数值 我们要计算的最优值在 t[1][n] 递归结构&#xff1a;凸多…

通过Moonbeam的Connected Contracts互连合约从Axelar转移Token至Centrifuge

将Moonbeam预编译智能合约功能与波卡指定技术交互&#xff0c;再结合Axelar通用消息传递&#xff08;GMP&#xff09;&#xff0c;能够实现其他链无法完成的独特交互。阅读本文了解Connected Contracts互连合约如何通过只与单条链交互连接Axelar的EVM链发送Token至Centrifuge等…

四、新图片、新视频预测(Datawhale组队学习)

文章目录配置环境预测新图像载入图像并进行预处理导入训练好的模型前向预测将分类结果写入原图中预测新视频导入训练好的模型视频预测单帧图像分类预测可视化方案一&#xff1a;原始图像预测结果文字可视化方案二&#xff1a;原始图像预测结果文字各类别置信度柱状图预测摄像头…