纯小白蓝桥杯备赛笔记--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.mzph.cn/news/809379.shtml

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

相关文章

玩机进阶教程------手机定制机 定制系统 解除系统安装软件限制的一些步骤解析

定制机 在于各工作室与商家合作定制rom中有一些定制机。限制用户私自安装第三方软件。或者限制解锁 。无法如正常机登陆账号等等。定制机一般用于固定行业或者一些部门。专机专用。例如很多巴枪扫描机型等等。或者一些小牌机型。对于没有官方包的机型首先要导出各个分区来制作…

R语言绘制一次和二次相关性热图

在数据探索的过程中&#xff0c;我们往往会对数据与数据的相关性进行分析&#xff0c;例如我们常用的corrplot包&#xff0c;或者psych包中的corr.test函数&#xff0c;对两两变量间的相关性进行分析。我们常常会看到这样的相关性热图&#xff1a; 但有时变量间的关系并非线性…

在线课程平台LearnDash评测 – 最佳 WordPress LMS插件

在我的LearnDash评测中&#xff0c;我探索了流行的 WordPress LMS 插件&#xff0c;该插件以其用户友好的拖放课程构建器而闻名。我深入研究了各种功能&#xff0c;包括课程创建、测验、作业、滴灌内容、焦点模式、报告、分析和管理工具。 我的评测还讨论了套餐和定价选项&…

Python+Django+Html网页版人脸识别考勤打卡系统

程序示例精选 PythonDjangoHtml人脸识别考勤打卡系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoHtml网页版人脸识别考勤打卡系统》编写代码&#xff0c;代码整洁&#xf…

详解小度Wi-Fi内部芯片及电路原理图分析

小度随身WiFi是一款便携式USB路由器&#xff0c;它实现了用户跨终端联网&#xff0c;随身携带&#xff0c;可以在室内实现免费WiFi覆盖。外形美观&#xff0c;小巧便携。 这一款小度WiFi采用的主芯片是MT7601UN&#xff0c;一款高度集成的Wi-Fi单芯片&#xff0c;支持150 Mbp…

蓝桥杯——玩具蛇

题目 小蓝有—条玩具蛇&#xff0c;一共有16节&#xff0c;上面标着数字1至16。每—节都是一个正方形的形状。相邻的两节可以成直线或者成90度角。 小蓝还有一个44的方格盒子&#xff0c;用于存放玩具蛇&#xff0c;盒子的方格上依次标着字母A到Р共16个字母。 小蓝可以折叠自…

力扣HOT100 - 240. 搜索二维矩阵 II

解题思路&#xff1a; 从左下角开始&#xff0c;根据条件删除行和列。 class Solution {public boolean searchMatrix(int[][] matrix, int target) {int row matrix.length - 1;int col matrix[0].length - 1;int l 0;while (row > 0 && l < col) {if (targ…

【JavaScript】DOM编程-什么是事件

今天几号 实现效果&#xff1a; 在这个示例中我们的事件三要素都是什么呢&#xff1f; &#xff08;1&#xff09;事件源&#xff0c;事件被触发的对象 谁&#xff1a;按钮 &#xff08;2&#xff09;事件类型&#xff0c;如何触发&#xff0c;什么事件&#xff0c;比如鼠标…

python+requests+pytest+allure自动化框架

1.核心库 requests request请求 openpyxl excel文件操作 loggin 日志 smtplib 发送邮件 configparser unittest.mock mock服务 2.目录结构 base utils testDatas conf testCases testReport logs 其他 2.1base base_path.py 存放绝对路径,dos命令或Jenkins执行…

数据仓库的ELT/ETL

ETL 和 ELT 有很多共同点&#xff0c;从本质上讲&#xff0c;每种集成方法都可以将数据从源端抽取到数据仓库中&#xff0c;两者的区别在于数据在哪里进行转换。 01 ETL ETL – 抽取、转换、加载 从不同的数据源抽取信息&#xff0c;将其转换为根据业务定义的格式&#xff0…

【C 数据结构】静态链表

文章目录 【 1. 基本原理 】1.1 静态链表中的节点1.2 备用链表 【 2. 静态链表的创建 】2.1 实例1 - 创建静态链表&#xff0c;指定值2.2 实例2 - 创建静态链表&#xff0c;默认值 【 3. 静态链表 添加元素 】【 4. 静态链表 删除元素 】【 5. 静态链表 查找元素 】【 6. 静态链…

华为ensp中PPPOE (点对点协议)原理和配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月12日6点30分 PPPoE&#xff08;PPP over Ethernet&#xff09;是一种将PPP协议封装到以太网帧中的链路层协议。它可以使以太网网络中的多台主机连接到远端的宽带接…

每日一题---OJ题: 旋转数组

片头 嗨! 小伙伴们,咱们又见面啦,今天我们一起来学习一道OJ题---旋转数组 emmm,看上去好像没有那么难,我们一起来分析分析 比如: 数组里面有7个元素,分别为 1, 2, 3, 4, 5, 6, 7 , 现在我们将数组中的元素向右轮转3个位置 第一次轮转:将最后一个元素"7"放在第一个…

Centos7 k8s 集群 - Rook Ceph 安装

环境准备 基础环境 系统名称操作系统CPU内存硬盘Kubernete 版本Docker版本IPmasterCentos74c4gsdb 20G1.17.023.0.1192.168.1.128node01Centos74c4gsdb 20G1.17.023.0.1192.168.1.129node02Centos74c4gsdb 20G1.17.023.0.1192.168.1.130node03Centos74c4gsdb 20G1.17.023.0.1…

ssm+vue的实验室课程管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的实验室课程管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

RabbitMQ消息模型之Simple消息模型

simple消息模型 生产者 package com.example.demo02.mq.simple;import com.example.demo02.mq.util.ConnectionUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;import java.io.IOException;/*** author Allen* 4/10/2024 8:07 PM* versi…

绝地求生:AUG爆裂弹球黑货箱:街机动漫风格大家会喜欢吗?

大好&#xff0c;我闲游盒&#xff01; 4.10更新后&#xff0c;AUG的新成长型也出来了&#xff0c;更新后我觉得AUG变好用了一点&#xff0c;不知道大家有没有感觉出来&#xff1f; 宝箱概率 本期主角 AUG-爆裂弹球&#xff08;紫色配粉红色&#xff09; 本次的AUG我才升到5级…

从 SQLite 3.4.2 迁移到 3.5.0(二十)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite---调试提示&#xff08;十九&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ SQLite 版本 3.5.0 &#xff08;2007-09-04&#xff09; 引入了一个新的操作系统接口层&#xff0c; 与所有先前版本的 SQLi…

通过WebShell登录SQL Server主机并使用SSRS报表服务

背景信息 RDS SQL Server提供了WebShell功能&#xff0c;允许用户通过Web界面登录到RDS SQL Server实例的操作系统中&#xff0c;并在该操作系统中执行命令、上传下载文件等操作。WebShell功能方便用户对RDS SQL Server实例的管理和维护&#xff0c;特别是在无法使用SSH客户端的…

社交网络的未来图景:探索Facebook的发展趋势

随着科技的不断进步和社会的快速变迁&#xff0c;社交网络作为连接人与人之间的重要纽带&#xff0c;扮演着日益重要的角色。而在众多社交网络中&#xff0c;Facebook作为老牌巨头&#xff0c;一直在探索着新的发展路径&#xff0c;引领着社交网络的未来图景。本文将深入探索Fa…