计算几何 val.1

目录

  • 计算几何 val.1

    • 向量的点积
    • 向量的叉积
    • 一种奇怪的三角剖分求面积
    • 凸包
    • 点绕点旋转
    • 后记

计算几何 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;
} 

点绕点旋转

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

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

后记

就先这么多吧。。。

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

原文地址:https://www.cnblogs.com/lcyfrog/p/11688478.html

时间: 2024-10-11 17:18:12

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

计算几何 val.2

目录 计算几何 val.2 几何单位结构体板子 旋转卡壳 基础概念 求法 模板 半平面交 前置芝士:线段交 S&I算法 模板 最小圆覆盖 随机增量法 时间复杂度 模板 后记 计算几何 val.2 前置芝士:基础操作以及凸包 本文主要写旋转卡壳.半平面交.最小圆覆盖要注意的内容 几何单位结构体板子 不全(我知道 struct point{ double x,y; point(double x=0,double y=0): x(x),y(y){} //构造函数,非常方便 double operato

计算几何 val.3

目录 计算几何 val.3 自适应辛普森法 定积分 引入 辛普森公式 处理精度 代码实现 模板 时间复杂度 练习 闵可夫斯基和 Pick定理 结论 例题 后记 计算几何 val.3 自适应辛普森法 可以用来求多边形的面积并(圆也行) 定积分 定积分的几何意义是函数的曲线上 \(x\) 的一段区间与 \(x\) 轴围成的曲边梯形的带符号面积 表示法为 \[ \int_{a}^{b} f(x) \mathrm{d} x \] 引入 计算方法: 分成一堆小区间 \[ \int_{a}^{b} f(x)

计算几何中的精度问题

转自:北岛知寒 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模板一般就不成问题了.精度问题则不好说,有时候一个精度问题就可能成为一道题的瓶颈,简直"画龙点睛".这些年的题目基本是朝着越来越不卡精度的方向发展了,但是也不乏一些奇怪的题,另外有些常识不管题目卡不卡,都是应该知道的.今天我就开膛回顾下见过且还有印象的精度问题,由于本人见识和记忆均有限,望各位大神瞄过后不吝补充.另外,为了弥补我匮乏的文思,我可能乱扯些不太相关或者尽人皆知的东西凑数.那么,现在开始.

UESTC 1170 红与蓝 计算几何、贪心、红蓝点对

D - EN TARO Artanis Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit Status Practice UESTC 1170 Description 平面上有N个红点和N个蓝点,求红点到蓝点的最近距离 Input 第一行为一个整数N  接下来第N行每行两个整数xi,yi,表示第i个红点的坐标 接下来第N行每行两个整数xi,yi,表示第i个蓝点的坐标(1      

【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流

题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵. 在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放.不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以

【bzoj3630】[JLOI2014]镜面通道 对偶图+计算几何+网络流最小割

题目描述 在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0).通道中有n个外表面为镜面的光学元件,光学元件α为圆形,光学元件β为矩形(这些元件可以与其他元件和通道有交集,具体看下图).光线可以在AB上任一点以任意角度射入通道,光线不会发生削弱.当出现元件与元件,元件和通道刚好接触的情况视为光线无法透过(比如两圆相切).现在给出通道中所有元件的信息(α元件包括圆心坐标和半径xi,yi,ri,β元件包括左下角和右上角坐标x1,y1,x2,y2

计算几何——精度问题

计算几何中的精度问题(转)(谢谢原创) 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模板 一般就不成问题了.精度问题则不好说,有时候一个精度问题就可能成为一道题的瓶颈,简直“画龙点睛”.这些年的题目基本是朝着越来越不卡精度的方向发展 了,但是也不乏一些%^&%题#$%$^,另外有些常识不管题目卡不卡,都是应该知道的.今天我就开膛回顾下见过且还有印象的精度问题,由于本人 见识和记忆均有限,望各位大神瞄过后不吝补充.另外,为了弥补我匮乏的文思,我可能乱扯些不太相关或者尽人

计算几何精度问题(转)

计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模板一般就不成问题了.精度问题则不好说,有时候一个精度问题就可能成为一道题的瓶颈,简直“画龙点睛”.这些年的题目基本是朝着越来越不卡精度的方向发展了,但是也不乏一些%^&%题#$%$^,另外有些常识不管题目卡不卡,都是应该知道的.今天我就开膛回顾下见过且还有印象的精度问题,由于本人见识和记忆均有限,望各位大神瞄过后不吝补充.另外,为了弥补我匮乏的文思,我可能乱扯些不太相关或者尽人皆知的东西凑数.那么,现在开始. 计算几何的精

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

计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模板一般就不成问题了.精度问题则不好说,有时候一个精度问题就可能成为一道题的瓶颈,简直“画龙点睛”.这些年的题目基本是朝着越来越不卡精度的方向发展了,但是也不乏一些%^&%题#$%$^,另外有些常识不管题目卡不卡,都是应该知道的.今天我就开膛回顾下见过且还有印象的精度问题,由于本人见识和记忆均有限,望各位大神瞄过后不吝补充.另外,为了弥补我匮乏的文思,我可能乱扯些不太相关或者尽人皆知的东西凑数.那么,现在开始. 计算几何的精