计算几何 val.1

本文并不是入门文章,供有高中数学基础的阅读

主要写一些重要的点和注意事项吧

向量的点积

  • 如果两个向量同向(共线),那么它们的数量积为他们的模长之积。
  • 如果两个向量夹角 \(<90^\circ\) ,那么它们的数量积为正。
  • 如果两个向量夹角 \(=90^\circ\) ,那么他们的数量积为 \(0\) 。
  • 如果两个向量夹角 \(>90^\circ\) ,那么它们的数量积为负。
  • 如果两个向量反向(共线),那么它们的数量积为他们的模长之积的相反数

这个可以判断它们的夹角

向量的叉积

几何意义:两向量由平行四边形法则围成的面积

叉乘满足的基本的性质如下:

  1. \(\vec{a}×\vec{a}=0\) 因为夹角是0, 所以平行四边形面积也是0, 即叉积长度为0
  2. \(\vec{a}×\vec{b}=−(\vec{b}×\vec{a})\), 等式两边的叉积等大反向, 模长因为平行四边形不变而相同, 方向因为右手法则旋转方向相反而相反
  3. \((λ\vec{a})×\vec{b}=λ(\vec{a}×\vec{b})\), 这点比较好想, 因为: ①正数λλ数量乘不会影响a的方向, 所以左右的叉积方向一样; 负数\(λ\)使得\(a\)反向了, 但也使得左右叉积方向相反. ②对a进行缩放, 平行四边形面积也同等缩放.
  4. \((\vec{a}+\vec{b})×\vec{c}=\vec{a}×\vec{c}+\vec{b}×\vec{c}\)

\(\vec{a}×\vec{b}\) 的正负可以理解为 \(\vec{a}\)转到\(\vec{b}\)的逆时针形成的角,\(\leq \pi\)为正,否则为负

可以判断一些东西(凸包),求距离

一种奇怪的三角剖分求面积

在这里学到的

\(S_{ABCDEF}=\frac{\overrightarrow{OA}\times \overrightarrow{OB}+\overrightarrow{OB}\times \overrightarrow{OC}+\dots +\overrightarrow{OF}\times \overrightarrow{OA}}{2}\)

凸包

用最少的周长覆盖所有点的多边形

性质:一定没有凹陷(可以用叉积判了)

叉积坐标公式的证明:

\[T_1=\sqrt{x_1^2+y_1^2},T_2=\sqrt{x_2^2+y_2^2}
\]

\[S=T_1*T_2*\sin\theta=\sin\alpha-\beta=\sin\alpha\cos\beta-\cos\alpha\sin\beta
\]

\[=(\frac{y_2}{T_2}*\frac{x_1}{T_1}-\frac{x_2}{T_2}*\frac{y_1}{T_1})*T_1*T_2
\]

\[=x_1*y_2-y_1*x_2
\]

具体方法是先求下凸壳然后再求上凸壳,注意一号点要进去两次比较最后一个点和第一个点,来判断是否弹出最后加进去的点

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
struct point{
double x,y;
double operator * (point b){
return x*b.y-y*b.x;
}
point operator - (point b){
point re;re.x=x-b.x,re.y=y-b.y;return re;
}
point operator + (point b){
point re;re.x=x+b.x,re.y=y+b.y;return re;
}
double dis(){
return sqrt(x*x+y*y);
}
};
const int N = 10021;
point p[N],h[N];
int cmp(point a,point b){
return a.x==b.x?a.y<b.y:a.x<b.x;
}
int n;
int stk[N],tp=0,used[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
sort(p+1,p+n+1,cmp);
stk[++tp]=1;
for(int i=2;i<=n;i++){
while( tp>1 && (p[stk[tp]]-p[stk[tp-1]])*(p[i]-p[stk[tp]]) <=0 ) used[stk[tp--]]=0;//小于等于为去除凸包边上的点
used[i]=1;
stk[++tp]=i;
}//下凸壳
int ntp=tp;
for(int i=n-1;i>=1;i--){
if(!used[i]){
while(tp>ntp&&(p[stk[tp]]-p[stk[tp-1]])*(p[i]-p[stk[tp]])<=0){
used[stk[tp--]]=0;
}
used[i]=1;
stk[++tp]=i;
}
}//上凸壳
for(int i=1;i<=tp;i++){
h[i]=p[stk[i]];
}//tp和1是同一点
double ans=0;
for(int i=2;i<=tp;i++){
ans+=(h[i]-h[i-1]).dis();
}
printf("%.2f",ans);
return 0;
}

点绕点旋转

考虑成 点+向量之差等于要求的点

向量之差也等于绕中心旋转的向量的差,三角恒等变换算一算就行

后记

就先这么多吧。。。

明天目标:旋转卡壳+半平面交

计算几何 val.1的更多相关文章

  1. 计算几何 val.3

    目录 计算几何 val.3 自适应辛普森法 定积分 引入 辛普森公式 处理精度 代码实现 模板 时间复杂度 练习 闵可夫斯基和 Pick定理 结论 例题 后记 计算几何 val.3 自适应辛普森法 可 ...

  2. 计算几何 val.2

    目录 计算几何 val.2 几何单位结构体板子 旋转卡壳 基础概念 求法 模板 半平面交 前置芝士:线段交 S&I算法 模板 最小圆覆盖 随机增量法 时间复杂度 模板 后记 计算几何 val. ...

  3. ACM 计算几何中的精度问题(转)

    http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...

  4. POJ 1066 Treasure Hunt(计算几何)

    题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁 ...

  5. POJ 2318 TOYS(计算几何)

    题目大意:有一个矩形盒子,盒子里会有一些木块线段,并且这些线段是按照顺序给出的,有n条线段,把盒子分层了n+1个区域,然后有m个玩具,这m个玩具的坐标是已知的,问最后每个区域有多少个玩具 解题思路:因 ...

  6. TOYS - POJ 2318(计算几何,叉积判断)

    题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数.   分析:做的第一道计算几何题目....使用叉积判断方 ...

  7. POJ 1556 计算几何+最短路

    代码1: #include<iostream> #include<stdio.h> #include<string> #include<string.h> ...

  8. 【BZOJ5316】[JSOI2018]绝地反击(网络流,计算几何,二分)

    [BZOJ5316][JSOI2018]绝地反击(网络流,计算几何,二分) 题面 BZOJ 洛谷 题解 很明显需要二分一个答案. 那么每个点可以确定的范围就是以当前点为圆心,二分出来的答案为半径画一个 ...

  9. POJ - 2031 Building a Space Station(计算几何+最小生成树)

    http://poj.org/problem?id=2031 题意 给出三维坐标系下的n个球体,求把它们联通的最小代价. 分析 最小生成树加上一点计算几何.建图,若两球体原本有接触,则边权为0:否则边 ...

随机推荐

  1. iptables规则备份和恢复、firewalld的9个zone、以及firewalld关于zone和service的操作 使用介绍

    第7周第5次课(5月11日) 课程内容: 10.19 iptables规则备份和恢复10.20 firewalld的9个zone10.21 firewalld关于zone的操作10.22 firewa ...

  2. Oracle SQL command slash

    We know that there is "commit" in oracle to submit all data in the session and used very c ...

  3. Scheme实现数字电路仿真(1)——组合电路

    EDA是个很大的话题,本系列只针对其中一小部分,数字电路的仿真,叙述一点概念性的东西,并不会过于深入,这方面的内容实则是无底洞.本系列并不是真的要做EDA,按照SICP里的相关内容,采用Lisp的方言 ...

  4. Linux下设置mysql不区分大小写

    一.通过命令查看mysql是否是区分大小写的 show variables like '%case_table%'; lower_case_table_names=1(说明是不区分大小写的) lowe ...

  5. HDU3849-By Recognizing These Guys, We Find Social Networks Useful(无向图的桥)

    By Recognizing These Guys, We Find Social Networks Useful Time Limit: 2000/1000 MS (Java/Others)     ...

  6. art-template循环无法显示出数据

    art-template循环遍历无法显示数据原因 1.语法问题:循环语句导致的问题 2.插件问题: 用标准语法时循环数据如果引入第一个插件,会导致数据显示不出来只有引入第二个插件才可循环出数据 用原生 ...

  7. 大数据学习笔记——Sqoop完整部署流程

    Sqoop详细部署教程 Sqoop是一个将hadoop与关系型数据库之间进行数据传输,批量数据导入导出的工具,注意,导入是指将数据从RDBMS导入到hadoop而导出则是指将数据从hadoop导出到R ...

  8. Ansible-上部

    Ansible概述 Ansible是一个配置管理系统configuration management systempython 语言是运维人员必须会的语言ansible 是一个基于python 开发的 ...

  9. Enumeration接口和Iterator接口的区别有哪些?

    Enumeration速度是Iterator的2倍,同时占用更少的内存.但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象.同时, ...

  10. 使用 Vue + axios 时,返回状态200,返回值被浏览器拦截

    目录 一.前言 二.解决方案 1. 在全局定义 2. 单独定义 一.前言 在使用 Vue + TypeScript + axios 时,后端已经配置了Cors的前提下,但是在请求接口的时候,返回状态为 ...