B. Rolling The Polygon

2023-12-03 01:49
文章标签 polygon rolling

本文主要是介绍B. Rolling The Polygon,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  Bahiyyah has a convex polygon with n vertices P0, P1, · · · , Pn−1 in the counterclockwiseorder. Two vertices with consecutive(连续的)  indexes are adjacent(邻近的), and besides, P0 and Pn−1 are adjacent. She also assigns(指出) a point Q inside the polygon which may appear on the border.

  Now, Bahiyyah decides to roll the polygon along a straight line and calculate the length of the trajectory(弹道) (or track) of point Q.

  To help clarify, we suppose Pn = P0, Pn+1 = P1 and assume the edge between P0 and P1 is lying on the line at first. At that point when the edge between Pi−1 and Pi lies on the line, Bahiyyah rolls the polygon forward rotating(旋转) the polygon along the vertex Pi until the next edge (which is between Pi and Pi+1) meets the line. She will stop the rolling when the edge between Pn and Pn+1 (which is same as the edge between P0 and P1) meets the line again.

 

Input

The input contains several test cases, and the first line is a positive integer T indicating the number of test cases which is up to 50.

For each test case, the first line contains an integer n (3 ≤ n ≤ 50) indicating the number of vertices of the given convex polygon. Following n lines describe vertices of the polygon in the counterclockwise order. The i-th line of them contains two integers xi−1 and yi−1, which are the coordinates of point Pi−1. The last line contains two integers xQ and yQ, which are the coordinates of point Q.

We guarantee that all coordinates are in the range of −103 to 103, and point Q is located inside the polygon or lies on its border.

Output

For each test case, output a line containing Case #x: y, where x is the test case number starting from 1, and y is the length of the trajectory of the point Q rounded to 3 places. We guarantee that 4-th place after the decimal point in the precise answer would not be 4 or 5.  

题目理解

  题目描述很短,大意是现在有一个n边的凸多边形,给你这个多边形所有顶点的坐标。然后再给你多边形内一个点的坐标,接着滚动这个多边形一周,需要我们计算出目标点移动轨迹的长度。为了更好理解,题目第三段详细说明了如何滚动:假设P0为初始点,那么在P0和P1之间有一条边1,在P1和P2之间有一条边2,连接P0和P2也有一条边3,每次都沿着一条边滚动,且第一次都是沿着边1滚。如何停止呢?就是当滚动的边再一次是边1时就停止。可以认为最后是Pn和Pn+1之间的边,即Pn=P0,Pn+1=P1。

解题思路

  观察多边形和目标点滚动的方式和轨迹,可以知道每次滚动所形成的轨迹是一段弧长,那么为了求出此弧长则需要知道此弧长所在圆的半径和旋转的角度。对于半径,首先确定圆心即使滚动角的顶点(滚动角就是Pi、Pi+1和Pi+2所形成的夹角,那么滚动角顶点则是P1),而目标点则是圆边上的一点,那么半径= 滚动角顶点(v[i+1])到目标点(tv)的距离 = sqrt(pow(tv.x-ver[i+1].x,2)+pow(tv.y-ver[i+1].y,2));对于旋转角度就是180°减去滚动角的角度,三点坐标有了,Pi和Pi+1之间边a,那么就用余弦定理(复习下:cosx = (a^2 + b^2 - c^2)/(2ab))。旋转角度= 180°-滚动角° = π-acos((a*a+b*b-c*c)/(2*a*b)) ,(注:Pi和Pi+1之间边a,Pi+1和Pi+2之间边b,Pi和Pi+2之间边c);最后求弧长 = 半径 * 旋转角度即可。

  弧长计算的循环如果从P0开始,Pn-1结束,就设Pn=P0,Pn+1=P1,因为根据题意的停止条件(当边再次滚到初始的边1时,滚完即止,最后是Pn-1要和Pn和Pn+1构成一个角,那就要设Pn=P0,Pn+1=P1)。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#define inf 0x3f3f3f3f
const int maxn=1e5+10;
using namespace std;
typedef long long ll;
int x[100],y[100],xx,yy;
double dis[100],u[100];
#define PI acos(-1.0)double calu(int a,int b)//计算半径
{return sqrt((a-xx)*(a-xx)+(b-yy)*(b-yy));
}
double caluu(int a,int b,int c,int d)
{return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}int main()
{int T;cin>>T;for(int j=1;j<=T;j++){int n;cin>>n;for(int i=1;i<=n;i++){cin>>x[i]>>y[i];}cin>>xx>>yy;for(int i=1;i<=n;i++){dis[i]=calu(x[i],y[i]);}double t1,t2,t3;for(int i=1;i<=n;i++){if(i==1){t1=caluu(x[1],y[1],x[n],y[n]);t2=caluu(x[1],y[1],x[2],y[2]);t3=caluu(x[n],y[n],x[2],y[2]);}else if(i==n){t1=caluu(x[n],y[n],x[1],y[1]);t2=caluu(x[n],y[n],x[n-1],y[n-1]);t3=caluu(x[1],y[1],x[n-1],y[n-1]);}else{t1=caluu(x[i],y[i],x[i+1],y[i+1]);t2=caluu(x[i],y[i],x[i-1],y[i-1]);t3=caluu(x[i-1],y[i-1],x[i+1],y[i+1]);}u[i]=acos((t1*t1+t2*t2-t3*t3)/(2*t1*t2)); //计算夹角}double sum=0;for(int i=1;i<=n;i++){sum+=dis[i]*(PI-u[i]);//弧长 = 半径 * 旋转角度(180度-夹角)}printf("Case #%d: %.3lf\n",j,sum);}return 0;
}


 

这篇关于B. Rolling The Polygon的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/447645

相关文章

POLYGON Horror Carnival - Low Poly 3D Art by Synty

465 个独特的预设模型 一个正在运行的摩天轮和旋转木马 包括10个示例脚本,让嘉年华栩栩如生 ◼ 描述◼ 欢迎来到恐怖嘉年华。这个地方曾经有诱人的音乐,现在却有着令人不安的旋律,暗示着其中令人不安的惊喜。 这场险恶的盛会的真正核心在于演示场景。它使用3D低多边形资源构建,具有来自不祥的狂欢帐篷、摊位、摩天轮、旋转木马等游戏开发资源。它是疯狂人物与毫无戒心的寻求刺激者玩捉迷藏游戏的完美狩猎场。

探索CSS clip-path: polygon():塑造元素的无限可能

在CSS的世界里,clip-path 属性赋予了开发者前所未有的能力,让他们能够以非传统的方式裁剪页面元素,创造出独特的视觉效果。其中,polygon() 函数尤其强大,它允许你使用多边形来定义裁剪区域的形状,从而实现各种自定义的图形效果。本文将深入探讨clip-path: polygon()的工作原理、应用场景,并通过实战代码示例带你领略其魅力。 什么是clip-path: polygon()

POJ 1179 Polygon

题目大意:给一个多边形,每个顶点有一个值,每个边编号从1到N,边的属性是加或者乘。首先先拆掉一条边,剩下的如下做:选定一条边以及这条边的两个端点(两个数)用新顶点替换(新顶点即:按照这条边的属性(加或乘)算出这两个数的乘积或者和)。到最后剩一个点,也就是一个值。求这些值的最大值输出,并输出此时最先拆掉的是哪条边。 Input: 4 t  -7  t  4  x  2  x  5 Outpu

【unity-Max】A polygon of Mesh ‘XXX‘ in Assets/XXX/XXX.FBX is self-intersecting and has been discarded

unity导入某个max做的模型时,报类似标题的警告 解决办法 在Max导出时,勾选【三角算法】 英文版的三角算法是:trangulate

论文阅读Rolling-Unet,卷积结合MLP的图像分割模型

这篇论文提出了一种新的医学图像分割网络Rolling-Unet,目的是在不用Transformer的前提下,能同时有效提取局部特征和长距离依赖性,从而在性能和计算成本之间找到良好的平衡点。 论文地址:https://ojs.aaai.org/index.php/AAAI/article/view/28173 1,动机(Motivation) 现阶段主流医学图像分割模型大多基于CNN和Tran

cesium 多边形加边框宽度 Polygon outlineWidth

cesium中用polygon添加多边形时,设置outlineWidth无效,常见做法是在添加polygon的同时加一个polyline,但是当多边形相邻两条边的角度比较小的情况下,这两个点的连接处有明显的交叉。 解决方案: 第一步:通过turf的buffer方法计算出一个小一点的多边形,注意此时buffer第二个参数为复数才能得到小一点的多边形 第二步:画挖洞多边形,外圈坐标为原

CodeForces - 38E Let's Go Rolling!

Description On a number axis directed from the left rightwards, n marbles with coordinates x1, x2, ..., xn are situated. Let's assume that the sizes of the marbles are infinitely small, that is in t

uva 11971 - Polygon(线性规划)

题目连接:uva 11971 - Polygon 题目大意:给定一个长度为N的线段,要求切K刀,分成K+1个线段,问能组成K+1边形的概率。 解题思路:K条线段能组成K边形的条件为任意一条边小于其他所有边的和,因为是求概率,所以和N无关。 根据高中线性规划的知识,以二维为例: 所以有ans=2K−K−12K #include <cstdio>#include <cstri

POJ 1179 Polygon(动态规划:类似环形石子合并)

点击打开链接 题意:给出一个多边形,切断某一条边,求出所有边合并后的最大值。 注意:最大值可能由最小值得来(负负得正)!所以要用两个dp数组维护。 第一次提交:WA,因为dMin[i][j] = getMin ( dMin[i][j], 那里直接复制前面的dMax[i][j] = getMax。 dMax没有改成dMin。。。。 第二次:PE,因为判断是否为第一个答案时用:

Type Specific Interfaces(Rolling特殊类型接口)

Type Specific Interfaces 一直以来,API的某些部分必然特定于所交换的消息类型,例如发布消息或订阅主题,因此需要为每个消息类型生成代码。下图布局了从用户定义的rosidl文件(如.msg文件)到用户和系统用于执行特定类型功能的特定类型代码的路径: 图:“静态”类型支持生成的流程图,从rosidl文件到面向用户的代码。 图的右侧显示了.msg文件是如何直接传递给特定语言的