皮克定理和多边形面积及应用

news2024/11/21 2:27:59

欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

皮克定理

皮克定理:皮克定理是指一个计算所有顶点坐标为整数的多边形面积公。该公式可以表示为S=a+b÷2-1,其中a表示多边形内部的坐标为整数的点数,b表示多边形边上且坐标为整数的点数,S表示多边形的面积。

举个简单的例子。
在这里插入图片描述
上图中,边上的整格点数量b=12, 内部点数量a = 4
那么三角形面积S = 4+12/2-1 = 9

多边形面积算法

对于多边,可以任选一个点O,然后把多边形顶点按照逆时针排序,遍历所有点和后一个点与O连成一个三角形,计算出所有三角形面积,并求和即可。
在这里插入图片描述
如上图所示,绿线为多边形,通过分割成多个三角形来计算面积。
计算面积时利用向量叉乘即可。
这个算法对于非凸多边形也适用。

面积公式应用

http://poj.org/problem?id=1654

题目大意

一个多边形起点从0点出发,每次沿8个方向中的1个方向,行走不超过1个格子。求最后合围区域面积。

代码

需要用c++提交
需要用c++提交
需要用c++提交

#include<stdio.h>
#include<cmath>
#include <algorithm>
#include <vector>


using namespace std;

int gcd(int a, int b) {
	if (a < 0 || b < 0)return gcd(abs(a), abs(b));
	if (a > b)return gcd(b, a);
	if (a == 0)return b;
	return gcd(b % a, a);
}
typedef long long lld;
int dir[10][2] = {
	{-1,-1},
	{0,-1},
	{1,-1},
	{-1,0},
	{0,0},
	{1,0},
	{-1,1},
	{0,1},
	{1,1},
};
// 2A = 2s+p-2
char str[1000000 + 10];
void solve() {
	int T;
	scanf("%d", &T);
	while (T--) {
		scanf("%s", str);
		pair<lld, lld> pre(0, 0), now;
		lld area = 0;
		for (int i = 0; str[i] != '5'; ++i) {
			int d = str[i] - '1';
			now.first = pre.first + dir[d][0];
			now.second = pre.second+ dir[d][1];
			area += pre.first * now.second - pre.second * now.first;
			pre = now;
		}

		if(area<0)area = -(area);
		printf("%lld",area/2);
		if (area & 1) {
			printf(".5");
		}
		puts("");
	}
}

int main() {
	solve();
	return 0;
}

皮克定理应用一

http://poj.org/problem?id=2954

题目大意

给定1个三角形,顶点都是整数,求内部整数点数量。

思路

通过顶点求出面积。
三条边的坐标,可以求出3条边经过整点的数量。
利用公式即可求出内部点。

代码

需要用c++提交
需要用c++提交
需要用c++提交

#include<stdio.h>
#include<cmath>
#include <algorithm>
#include <vector>


using namespace std;

int gcd(int a, int b) {
	if (a < 0 || b < 0)return gcd(abs(a), abs(b));
	if (a > b)return gcd(b, a);
	if (a == 0)return b;
	return gcd(b % a, a);
}
// 2A = 2s+p-2
void solve() {
	int x1, y1, x2, y2, x3, y3;
	while(scanf("%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3) != EOF) {
		if (x1 == 0 && x2 == 0 && x3 == 0 && y1 == 0 && y2 == 0 && y3 == 0)break;
		int edgePoints = 0;
		pair<int, int>p0(x2 - x1, y2 - y1);
		pair<int, int>p1(x3 - x2, y3 - y2);
		pair<int, int>p2(x1 - x3, y1 - y3);
		int area = abs(p0.first*p1.second - p0.second*p1.first);
		edgePoints += gcd(p0.first, p0.second);
		edgePoints += gcd(p1.first, p1.second);
		edgePoints += gcd(p2.first, p2.second);

		int innerPoint = (area - edgePoints) / 2 +1;
		printf("%d\n", innerPoint);
		
	}
}

int main() {
	solve();
	return 0;
}

皮克定理应用二

http://poj.org/problem?id=1265

题目大意

给定机器人每次行走的向量,求最后合围区域的内部点,边界点,和面积。

思路

通过顶点求出面积。
每条边上的顶点可以单独求出。
利用公式即可求出内部点。

代码

需要用c++提交
需要用c++提交
需要用c++提交

#include<stdio.h>
#include<cmath>
#include <algorithm>
#include <vector>


using namespace std;

int gcd(int a, int b) {
	if (a < 0 || b<0)return gcd(abs(a), abs(b));
	if (a > b)return gcd(b, a);
	if (a == 0)return b;
	return gcd(b % a, a);
}
// 2A = 2s+p-2
void solve() {
	int T;
	scanf("%d", &T);
	int N;
	for (int k = 1; k <= T;++k) {
		scanf("%d", &N);
		int edgePoints = 0;
		pair<int, int> p0(0,0);
		pair<int, int> pre=p0, now;
		int area = 0;
		for (int i = 0; i < N; ++i) {
			scanf("%d %d", &now.first, &now.second);

			edgePoints += gcd(now.first, now.second);
			now.first += pre.first;
			now.second += pre.second;
			area += pre.first * now.second - pre.second * now.first;
			pre = now;
		}

		area = abs(area);
		int innerPoint = (area + 2 - edgePoints) / 2;
		printf("Scenario #%d:\n", k);
		printf("%d %d %.1f\n\n", innerPoint, edgePoints, area*1.0/2);
	}
}

int main() {
	solve();
	return 0;
}

/*
2
4
1 0
0 1
-1 0
0 -1
7
5 0
1 3
-2 2
-1 0
0 -3
-3 1
0 -3

*/

本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。

在这里插入图片描述

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

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

相关文章

Python list列表添加元素的3种方法

实际开发中&#xff0c;经常需要对​ Python 列表 ​进行更新&#xff0c;包括向列表中添加元素、修改表中元素以及删除元素。本节先来学习如何向列表中添加元素。 使用运算符可以将多个序列连接起来&#xff1b;列表是序列的一种&#xff0c;所以也可以使用进行连接&#xff0…

Linux配置成代理服务器

Linux配置成代理服务器 什么是代理服务器 把Linux配置成代理服务器 开放的代理服务器 升级需要账号密码的代理服务器 Linux系统使用代理服务器 临时通过代理访问 永久通过代理访问 Windows系统使用代理服务器 什么是代理服务器 代理服务器&#xff08;Proxy Server&am…

《动手学深度学习 Pytorch版》 4.5 权重衰减

4.5.1 范数与权重衰减 整节理论&#xff0c;详见书本。 4.5.2 高维线性回归 %matplotlib inline import torch from torch import nn from d2l import torch as d2l# 生成一些数据&#xff0c;为了使过拟合效果更明显&#xff0c;将维数增加到 200 并使用一个只包含 20 个样…

vue3中使用el-upload + tui-image-editor进行图片处理

效果如下 看之前请先看上一篇《vue3中使用组件tui-image-editor进行图片处理》中的 1、第一步安装 2、第二部封装组件 本篇只是在这基础上结合el-upload使用组件 3、第三步结合el-upload使用组件 <template><el-dialog:title"dialogTitle":modelValue&qu…

004-Windows下开发环境搭建

Windows下开发环境搭建 文章目录 Windows下开发环境搭建项目介绍版本控制工具Git 与 SVNWindow下安装Git Qt 开发工具静态编译Qt环境安装 串口模拟器比较工具SQLite 数据库查看小工具预告 关键字&#xff1a; Qt、 Qml、 开发环境、 Windows、 C 项目介绍 欢迎来到我们的 …

Elastic Universal Profiling™ 是一种连续分析解决方案,现已正式上市

作者&#xff1a;Israel Ogbole, Stephanie Boomsma 在软件无处不在且影响深远的世界中&#xff0c;效率的重要性不仅仅局限于业务范围。 高效的软件不仅有利于企业&#xff0c;而且有利于企业。 这对全球也有好处。 通过将计算效率作为核心目标&#xff0c;并为专业人员提供正…

WebGL光照介绍——平行光、环境光下的漫反射

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色&#xff08;漫反射和环境反射同时存在时&#xff09;计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ&#xff08;以便…

数据结构--哈希表,哈希函数(或者散列表、散列函数)

目录 哈希表的定义 处理冲突的方法--拉链法 散列查找 常见的散列函数&#xff08;构造哈希函数&#xff09; 除留余数法 直接定址法 数字分析法 平方取中法 处理冲突的方法--开放定址法 &#xff08;1&#xff09;线性探测法&#xff1a; &#xff08;2&#xff09…

笔记:Android 应用启动流程

1.点击图标&#xff0c;启动app 点击图标&#xff0c;实际是封装了一个 Intent 然后调用了 startActivity 方法 ComponentName componentName new ComponentName("包名", "activity 名称"); Intent intent new Intent(Intent.ACTION_MAIN); intent.set…

【问题处理】GIT合并解决冲突后,导致其他人代码遗失的排查

GIT合并解决冲突后&#xff0c;导致其他人代码遗失的排查 项目场景问题描述分析与处理&#xff1a;1. 警告分析2. 文件分析3. 问题关键4. 验证 解决策略总结 &#x1f4d5;作者简介&#xff1a;战斧&#xff0c;从事金融IT行业&#xff0c;有着多年一线开发、架构经验&#xff…

【Nacos】Nacos服务注册服务端源码分析(一)

上篇简单看了下Nacos客户端在服务注册时做了什么。 本篇开始分析Nacos在服务注册时&#xff0c;服务端的相关逻辑。 建议先阅读这篇文章&#xff1a;支持 gRPC 长链接&#xff0c;深度解读 Nacos 2.0 架构设计及新模型 回顾一下&#xff0c;上篇我们看了Nacos在服务注册时&a…

四种常用的自动化测试框架

一直想仔细研究框架&#xff0c;写个流水账似的测试程序不难&#xff0c;写个低维护成本的测试框架就很难了&#xff0c;所以研究多种测试框架还是很有必要的&#xff0c;知道孰优孰劣&#xff0c;才能在开始编写框架的时候打好基础&#xff0c;今天读到了KiKi Zhao的翻译文章&…

reverse_iterator 逆序迭代器

在上一篇 C迭代器 iterator&#xff08;与逆序迭代器&#xff09; 中&#xff0c;我们看到了迭代器的基本用法。 现在我们看看一个奇怪的现象 意料之外的减法运算 无符号数的 0 减 1 变成了什么&#xff1f; &#xff1f;已知 size_t 一般为 unsigned long long 类型。 #…

区块链(4):区块链去中心化

1 区块链白皮书中的公有链&#xff0c;私有链&#xff0c;联盟链概念介绍 区块链系统根据应用场景和设计体系的不同&#xff0c;一般分为公有链、联盟 链和专有链(私有链)。其中: 公有链的各个节点可以自由加入和退出网络&#xff0c;并参加链上数据的读 写&#xff0c;运行时…

SpringBoot+MyBatis flex实现简单增删改查

一&#xff1a;创建SpringBoot项目 SpringBoot版本选择2.7.15 勾选相关的选项&#xff0c;并点击Create 项目创建完成 二.pom文件添加相关的依赖 <dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starte…

排序——直接插入排序折半插入排序

文章目录 前言一、排序的基本概念1. 排序的定义2. 排序的分类1) 稳定排序2) 不稳定排序 二、插入排序1. 直接插入排序1&#xff09;直接插入排序算法分析 2. 直接插入排序代码3. 直接插入排序时间复杂度4. 折半插入排序5. 折半插入排序代码 总结 前言 排序的基本概念数据结构稳…

从数字化到智能化再到智慧化,智慧公厕让城市基础配套更“聪明”

随着科技的迅猛发展&#xff0c;城市生活方式与配置设施的方方面&#xff0c;面也在不断的改变和升级。智慧公厕作为城市基础配套设施的一部分&#xff0c;从数字化到智能化再到智慧化&#xff0c;正逐渐展现出其独特的魅力和优势。实现了公共厕所建设、使用与管理方式的全面变…

【AI】机器学习——支持向量机(非线性及分析)

5. 支持向量机(线性SVM) 文章目录 5.4 非线性可分SVM5.4.1 非线性可分问题处理思路核技巧核函数特点 核函数作用于SVM 5.4.2 正定核函数由 K ( x , z ) K(x,z) K(x,z) 构造 H \mathcal{H} H 空间步骤 常用核函数 5.5 SVM参数求解算法5.6 SVM与线性模型关系 5.4 非线性可分SVM …

奇偶数之和

任务描述 本关任务&#xff1a;请编一个函数fun(int *a,int n,int *odd,int *even)&#xff0c;函数的功能是分别求出数组a中所有奇数之和以及所有偶数之和。形参n给出数组中数据的个数&#xff1b;利用指针odd返回奇数之和&#xff0c;利用指针even返回偶数之和。 例如&#…

UE5_OpenCV库的加载方式

UE5使用opencv库要在系统中添加opencv的环境变量 在项目文件夹下新建ThirdParty,将OpenCV中的bin、opencv文件夹copy到ThirdParty中 打开项目,找到source目录下的build.cs文件 修改build.cs内容,添加头文件路径,dll路径,lib路径 // Copyright Epic Games, Inc. All Right…