IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> double变量去重、巧求截距、根据坐标求多边形面积(坐标要顺/逆时针输入) -> 正文阅读

[C++知识库]double变量去重、巧求截距、根据坐标求多边形面积(坐标要顺/逆时针输入)

double变量去重、截距表示、根据坐标求多边形面积(几何题了属于是)

C:直线(填空题)

在这里插入图片描述
答案:40257

double判断相等,还是要防止爆精度

double去重,先排序再相邻比较,比较保险

#include <iostream>
#include <algorithm>
#include <math.h>
#include <vector>
#include <set>
#define double long double
#define pdd pair<double,double>
#define EPS 1e-8
using namespace std;
struct cur{
	double k,b;
	cur(double x,double y):k(x),b(y){}
/*	bool operator==(const cur& n)const{
		return (fabs(n.k-k)<EPS)&&(fabs(n.b-b)<EPS);
	}*/
		bool operator<(const cur& n)const{
			if(n.k!=k)return k<n.k;
			return b<n.b;
	}
};
vector<cur> s;
//set<pdd> s;
signed main() {
		 	for(int x1=0;x1<20;x1++){
		 		for(int y1=0;y1<21;y1++){
		 			for(int x2=0;x2<20;x2++){	
		 				for(int y2=0;y2<21;y2++){
		 					if(x1!=x2&&y1!=y2){
					 		double k=(double)(y2-y1)/(x2-x1);
					 		double b=(double)y1-k*x1;
					 		//b=1.0*(x1*y2-x2*y1)/(x1-x2);
					 		//s.insert(make_pair(k,b));
					 		s.push_back(cur(k,b));
					 		}
		 				}
		 			}
		 		}
		 	}
	
	 int m=s.size();
	sort(s.begin(),s.end());
	 int res=1;
	 for(int i=1;i<m;i++){
	 	if(fabs(s[i].k-s[i-1].k)>EPS||fabs(s[i].b-s[i-1].b)>EPS)res++;
	 }
	 cout<<res+21+20;
	return 0;
}
/*1、防止double爆精度,不用set去重,即使重载==也不行!!! 
还是在vector数组里先排序再判断相邻元素是否相等比较保险 
而且用set存储自定义类型需要重载<,因为set是会自动排序的,

2、如果非要用set且不是比较double时,可以用pair<>来做数据类型,会自动比较
这题如果防止b爆精度就可以*/

巧求截距

上题中,如果直接通过b=y1-k*x1,就必须特地为double变量去重,但是如果b=1.0*(x1*y2-x2*y1)/(x1-x2)这样求截距,可直接通过set<pair<double,double> > ,set自动去重
b=1.0*(x1*y2-x2*y1)/(x1-x2)
其实是根据三角形的面积,回忆一下高中的叉积,常用来求三角形面积
在这里插入图片描述
process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAU2VsdmFnZ2lh,size_20,color_FFFFFF,t_70,g_se,x_16)

SOBA=SObA-SObB=b*(x1-x2)/2
SOBA就是通过叉积来求=|OA|*|OB|/2=x1*y2-x2*y1(坐标交叉相乘相减)

根据坐标求多边形面积

两两坐标与原点构成一个小三角形,也是利用叉积分别求每个小三角形面积
在这里插入图片描述
图片内容来自这里

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int N=105;
struct node{
	int x,y;
	//node(int x,int y):x(x),y(y){}
}; 
node a[N];
signed main() {
	int n;//多边形n个顶点对应的n个坐标 
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i].x>>a[i].y; 
	} 
	a[n]=a[0];//不忘最后一个点与第一个顶点生成的向量
	double sum=0;
	for(int i=1;i<=n;i++){
		sum+=(a[i].x*a[i-1].y-a[i-1].x*a[i].y);//最后一起 /2 
	} 
	sum/=2;
	cout<<sum;
	return 0;
}
/*不过该方法有个缺陷就是输入多边形顶点坐标时必须按顺时针或者逆时针
输入,不然的话就会计算错误,得0 
从(0,0)开始顺时针输入,则用公式x2*y1-x1*y2 
从(0,0)开始逆时针输入,则用公式x1*y2-x2*y1 ,比较习惯这个公式 
*/

不过该方法有个缺陷就是输入多边形顶点坐标时必须按顺时针或者逆时针输入,不然的话就会计算错误,得0
从(0,0)开始顺时针输入,则用公式x2y1-x1y2
从(0,0)开始逆时针输入,则用公式x1y2-x2y1 ,比较习惯这个公式

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:27:40  更:2022-04-07 22:27:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:01:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码