纯小白蓝桥杯备赛笔记--DAY14(计算几何)

文章目录

    • 计算几何基础
      • 平面几何距离
      • 圆的周长和面积
      • 圆与圆之间的关系:
      • 海伦公式计算三角形面积
      • 点到直线的距离
    • 点积和叉积
      • 例题:
    • 点和线的关系
      • 点的表示形式和代码
      • 判断点在直线的那边
      • 点到线的垂足
      • 点到线的距离
      • 例题-1242
      • 例题-1240
      • 升级--点到线段的距离--1285
    • 任意多边形面积的计算
      • 平面向量
      • 向量积
      • 求任意多边形的面积:
    • 二维计算几何基础

计算几何基础

平面几何距离

在这里插入图片描述

  • 曼哈顿距离:
int dist(int x1,int y1,int x2,int y2)
{int dx=abs(x1-x2);int dy=abs(y1-y2);return dx+dy;
}
  • 欧几里得距离:
double dist(double x1,double y1,double x2,double y2)
{double dx=x1-x2;double dy=y1-y2;return sqrt(dx*dx+dy*dy);
}

其中,pow函数是比较慢的,这里没有必要使用。

圆的周长和面积

在这里插入图片描述

圆与圆之间的关系:

在这里插入图片描述

海伦公式计算三角形面积

在这里插入图片描述

点到直线的距离

在这里插入图片描述

  • 那么向量如何求解这个问题:
    在这里插入图片描述
  • 例题:1286
#include<bits/stdc++.h>
using namespace std;
//求距离
double dist(double x1,double y1,double x2,double y2)
{double dx=x1-x2,dy=y1-y2;return sqrt(dx*dx+dy*dy);} 
void solve()
{double xa,ya,xb,yb,xc,yc;cin>>xa>>ya>>xb>>yb>>xc>>yc;//把向量处理出来,ca,cbdouble xca=xa-xc,yca=ya-yc;double xcb=xb-xc,ycb=yb-yc;//叉乘 double ans=abs(xca*ycb-xcb*yca)/dist(xa,ya,xb,yb);cout<<fixed<<setprecision(2)<<ans<<endl; 
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int i;cin>>i;while(i--)solve();return 0;
}
  • 总结:
  1. 封装函数,按照输入的组别来处理。
  2. 在这个函数中处理出两条边叉乘的结果。
  3. 最终的结果是叉乘结果的绝对值除以两者之间的距离。
  4. 求距离再次封装一个函数:使用欧几里得算法。
  5. 注意使用double类型以及保留小数位数。
  • 例题:求三角形面积–1231
#include<bits/stdc++.h>
using namespace std;
using ll =long long;
//求距离
double dist(double x1,double y1,double x2,double y2)
{double dx=x1-x2,dy=y1-y2;return sqrt(dx*dx+dy*dy);} 
void solve()
{double x1,y1,x2,y2,x3,y3;cin>>x1>>y1>>x2>>y2>>x3>>y3;long double a=dist(x1,y1,x2,y2);long double b=dist(x1,y1,x3,y3);long double c=dist(x2,y2,x3,y3);//开了一次根号,再求一次根号很容易导致精度误差 long double p=(a+b+c)/2;long double ans=sqrt(p*(p-a)*(p-b)*(p-c));cout<<fixed<<setprecision(2)<<ans<<endl;
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int i;cin>>i;while(i--)solve();return 0;
}

点积和叉积

  • 概念:
    在这里插入图片描述
  • 点积的代码实现:
#include<bits/stdc++.h>
using namespace std;struct Point{//定义点的结构体 double x,y;Point(){}Point(double x,double y):x(x),y(y){}Point operator+(Point  p){return Point(x+p.x,y+p.y);}Point operator-(Point  p){return Point(x-p.x,y-p.y);}Point operator*(double a){return Point(x*a,y*a);}Point operator/(double a){return Point(x/a,y/a);}Point operator*(Point  p){return Point(x*p.x+y*p.y);}//点积 }; 
typedef Point Vector;
int main()
{Vector a(1.0,3.0);Vector b(2.0,4.0);double dot_product=a*b;//使用重载的*运算符计算点积cout<<dot_product<<endl;return 0; }  
  • 叉积在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 代码实现:
#include<bits/stdc++.h>
using namespace std;struct Point{//定义点的结构体 double x,y;Point(){}Point(double x,double y):x(x),y(y){}
//乘法 Point operator*(double a){return Point(x*a,y*a);}
//点乘 Point operator*(Point  p){return Point(x*p.x+y*p.y);}//点积 double cross(const Point &p)const{return x*p.y-y*p.x;} }; 
typedef Point Vector;
int main()
{Vector a(1.0,3.0);Vector b(2.0,4.0);double dot_product=a*b;//使用重载的*运算符计算点积cout<<dot_product<<endl;double cross_product=a.cross(b);cout<<cross_product<<endl;return 0; }  

例题:

在这里插入图片描述

  • 怎么判断两条边是否垂直呢?
    点积为0即可。
#include<bits/stdc++.h>
using namespace std;struct Point{//定义点的结构体 double x,y;Point():x(0),y(0) {} //初始化 //两点相减,得到向量double operator-(const Point &p)const{return x-p.x,y-p.y};Point(double x,double y):x(x),y(y){}
//点积double dot(const Point &p)const{return x*p.x-y*p.y;}  
//	判断当前的向量和另一向量是否垂直bool ischui(const Point &p)const{return fabs(dot(p))<1e-10;//点积为0即垂直 } 
}; int main()
{int n,k,count=0;cin>>n>>k;for(int i=0;i<n;i++){Point start,turn,end;cin>>start.x>>start.y;cin>>turn.x>>turn.y;cin>>end.x>>end.y;
//		计算两个向量Point v1=turn-start;Point v2=end-turn;
//		检查是否垂直if(ischui(v2)){count++;} 
//		计算上取整int result=(count+k-1)/k;cout<<result<<end;return 0; } }  

点和线的关系

点的表示形式和代码

//使用pair存储
using Point =pair<int,int>;
//使用结构体
struct Point{int x,y;
}; 

判断点在直线的那边

在这里插入图片描述

点到线的垂足

在这里插入图片描述

点到线的距离

在这里插入图片描述

例题-1242

#include<bits/stdc++.h>
using namespace std;
struct Point{double x;double y;
};
inline double cross(const Point& p1,const Point& p2)
{return p1.x*p2.y-p2.x*p1.y;
}
int main()
{int n;Point p1,p2,p3;cin>>n;while(n--){cin>>p1.x>>p1.y>>p2.x>>p2.y>>p3.x>>p3.y;cout<<(cross(p1,p2)+cross(p2,p3)+cross(p1,p3)==0?"Yes":"No")<<endl;}return 0;
}

inline表示建议编译器将cross函数的实现直接插入到调用它的地方,以提高性能。

例题-1240

#include <bits/stdc++.h>
using namespace std;void solve(){double xa,ya,xb,yb,xc,yc;cin>>xa>>ya>>xb>>yb>>xc>>yc;double xAB=xb-xa,yAB=yb-ya;double xBC=xb-xc,yBC=yb-yc;double p=xAB*yBC-xBC*yAB;if(p==0){cout<<"IN"<<"\n";}else if(p>0){cout<<"R"<<"\n";}else{cout<<"L"<<"\n";}
}int main()
{int t;cin>>t;while(t--)solve();return 0;
}

总结:遇到直线用向量比较好。

升级–点到线段的距离–1285

?:这时候还能不能做垂线呢?
能。且点到直线的距离有一个垂足,判断垂足是否在线段AB内。
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;double dist(double x1,double y1,double x2,double y2){double dx=x1-x2,dy=y1-y2;return sqrt(dx*dx+dy*dy);
}int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--){double xa,ya,xb,yb,xc,yc;cin>>xa>>ya>>xb>>yb>>xc>>yc;if((yb-ya)/(xb-xa)!=(yc-yb)/(xc-xb)){double xCA=xa-xc,yCA=ya-yc;double xCB=xb-xc,yCB=yb-yc;double ans=abs(xCA*yCB-xCB*yCA)/dist(xa,ya,xb,yb);cout<<fixed<<setprecision(2)<<ans<<"\n";}else{double d1=dist(xa,ya,xc,yc);double d2=dist(xb,yb,xc,yc);cout<<fixed<<setprecision(2)<<min(d1,d2)<<"\n";}}return 0;
}
  • 题解逻辑;
  • 当斜率不相等时,利用点到直线的距离公式求距离。
  • 当斜率相等时,也就是说c在直线AB上,求ca和cb的最小值。

任意多边形面积的计算

平面向量

在这里插入图片描述
在这里插入图片描述

向量积

  • 内积:在这里插入图片描述
  • 外积:在这里插入图片描述

求任意多边形的面积:

在这里插入图片描述

  • 求三角形的面积
#include<bits/stdc++.h>
using namespace std;
using ll =long long;
//求距离
double dist(double x1,double y1,double x2,double y2)
{double dx=x1-x2,dy=y1-y2;return sqrt(dx*dx+dy*dy);} 
void solve()
{double x1,y1,x2,y2,x3,y3;cin>>x1>>y1>>x2>>y2>>x3>>y3;long double a=dist(x1,y1,x2,y2);long double b=dist(x1,y1,x3,y3);long double c=dist(x2,y2,x3,y3);//开了一次根号,再求一次根号很容易导致精度误差 long double p=(a+b+c)/2;long double ans=sqrt(p*(p-a)*(p-b)*(p-c));cout<<fixed<<setprecision(2)<<ans<<endl;
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int i;cin>>i;while(i--)solve();return 0;
}

二维计算几何基础

参考文献

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于级联H桥的多电平逆变器PWM控制策略的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 级联H桥&#xff08;CHB&#xff09;多电平逆变器是一种通过多个H桥单元级联实现更高电压等级和更高质量输出波形的电力电子转换装置。这种逆变器在高压大功率场合应用广泛&am…

软考123-上午题-【软件工程】-系统设计

一、系统设计 1-1、概要设计 设计软件系统总结结构数据结构及数据库设计编写概要设计文档评审 1-1-1、设计软件系统总结结构 其基本任务是采用某种设计方法&#xff0c;将一个复杂的系统按功能划分成模块&#xff1b; 确定每个模块的功能&#xff1b;确定模块之间的调用关系…

【LeetCode: 680. 验证回文串 II + 贪心 + 边界处理】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

PaddleDetection 项目使用说明

PaddleDetection 项目使用说明 PaddleDetection 项目使用说明数据集处理相关模块环境搭建 PaddleDetection 项目使用说明 https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.7/configs/ppyoloe/README_cn.md 自己项目&#xff1a; https://download.csdn.net/d…

基于GSP工具箱的NILM算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于GSP工具箱的NILM算法matlab仿真。GSP是图形信号处理的缩写&#xff0c;GSP非常适合对未知数据进行分类&#xff0c;尤其是当训练数据非常短时。GSPBox的基本理论是谱图论和…

牛客 NC36 在两个长度相等的排序数组中找到上中位数【中等 模拟 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/6fbe70f3a51d44fa9395cfc49694404f 思路 直接模拟2个数组有顺序放到一个数组中&#xff0c;然后返回中间的数参考答案java import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 pu…

神经网络背后的数学原理

原文地址&#xff1a;The Math Behind Neural Networks 2024 年 3 月 29 日 深入研究现代人工智能的支柱——神经网络&#xff0c;了解其数学原理&#xff0c;从头开始实现它&#xff0c;并探索其应用。 神经网络是人工智能 &#xff08;AI&#xff09; 的核心&#xff0c;为…

在线拍卖系统|基于Springboot的在线拍卖系统设计与实现(源码+数据库+文档)

在线拍卖系统目录 基于Springboot的在线拍卖系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 用户功能模块 5.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a…

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示汉字的功能

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示汉字的功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍LCD1602字符型液晶显示器介绍一、LCD1602字符型…

搜维尔科技:【煤矿安全仿真】煤矿事故预防处置VR系统,矿山顶板灾害,冲击地压灾害等预防演练!

产品概述 煤矿事故预防处置VR系统 系统内容&#xff1a; 事故预防处置VR系统的内容包括&#xff1a;火灾的预防措施、火灾预兆、防灭火系统、火灾案例重现、顶板事故预兆、顶板事故原因、顶板事故案例重现、瓦斯概念及性质、瓦斯的涌出形式、瓦斯预兆、瓦斯爆炸条件及预防措…

spiiii

数据手册里面有这么一段解释&#xff0c;就是说如果我们开启了看门狗&#xff0c;那么LSI就会跟随强制打开&#xff0c;等待LSI稳定之后就可以自动为独立看门狗提供时钟了。所以这里的第一步开启时钟不需要我们写代码来执行 2.写入预分频器和重装寄存器 在写入这两个寄存器之前…

基于一阶微分的图像增强-梯度法(不丢弃任何像素变化--信息的提取作用)

首先我大致说一下前一小节的内容&#xff1a;反锐化掩模与高提升滤波处理 图像的锐化方法&#xff0c;其实有很多。锐化的定义提升突变像素的灰度级&#xff0c;减少变化缓慢像素的灰度级。 为什么可以利用模糊图像来进行锐化呢&#xff1f;因为模糊图像的模糊位置通常都是原…