HDU 4458 Shoot the Airplane( 判断点在多边形内外 )
链接:传送门
题意:这个游戏是一个2D打飞机游戏,飞机以速度 v 水平飞行,它是一个简单的多边形,玩家从( 0 , 0 )向上射击,子弹有一个出速度 b ,子弹可以看作一个点,打中飞机边缘是无法击落飞机的,只有子弹进入飞机内部才能击落飞机,子弹受重力的影响,给出重力加速度 g ,XXX想知道子弹在第几秒击中飞机,如果始终无法击中则输出 Miss!
- 注意:
- v 有正有负,v > 0 飞机是从左向右,v < 0 飞机从右向左
- g 的范围是 [ 0 , 10 ],如果 g = 0,说明轨迹是一个直线
思路:如果同时考虑子弹的轨迹和飞机的轨迹是非常复杂的,所以让飞机“静止”,这样子弹就有了一个水平方向的速度分量 -v ,子弹的轨迹就变成了一条抛物线,所以只需要枚举判断抛物线上的点是否在“飞机”内就可以了。
balabala:这道题加了点物理知识还是很有趣的,但也是简单题,我用的是扫描法......
/*************************************************************************
> File Name: hdu4458.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年05月02日 星期二 02时54分27秒
************************************************************************/
#include<bits/stdc++.h>
using namespace std;
#define eps 1.0e-10
#define dou double
struct point{
dou x;
dou y;
}po[111];
int n,m;
dou dabs(dou x){
return x<0?-x:x;
}
int dcmp(dou x){
if(fabs(x)<eps) return 0;
return x<0?-1:1;
}
bool online(point p1,point p,point p2){
if( p.x<=max(p1.x,p2.x) && p.x>=min(p1.x,p2.x) && p.y<=max(p1.y,p2.y) && p.y>=min(p1.y,p2.y) ){
if ( dabs( (p.x-p1.x)*(p2.y-p1.y) - (p.y-p1.y)*(p2.x-p1.x) )<=eps )
return true;
}
return false;
}
bool inside(point p){
int cnt = 0 ;
dou xinter; // 血的教训
point p1,p2;
p1 = po[0];
for(int i=1;i<=n;i++){
p2 = po[i%n];
if( online(p1,p,p2) ) return false;
if( p.x<=max(p1.x,p2.x) && p.y<=max(p1.y,p2.y) && p.y>min(p1.y,p2.y) ){
if(p1.y!=p2.y){
xinter = (p.y-p1.y)*(p1.x-p2.x)/(p1.y-p2.y) + p1.x; // 理论上的最远距离
if(p1.x==p2.x || p.x<=xinter) cnt++;
}
}
p1 = p2;
}
if(cnt%2==0) return false;
else return true;
}
int main(){
// v是飞机飞行速度,b为子弹初始速度,g为重力加速度
int v,b,g;
point p;
while(~scanf("%d%d%d",&v,&b,&g)){
if(v==0 && b==0 && g==0) break;
scanf("%d",&n);
double Top = 0.0;
for(int i=n-1;i>=0;i--){
scanf("%lf%lf",&po[i].x,&po[i].y);
Top = max(Top,po[i].y);
}
dou t_max = dcmp(g)? 2*b/g : Top/b;
// 枚举时间
// x = (-v)*t
// y = b*t-1/2*g*t^2
bool ok = 0;
for(dou t = 0.0 ; t <= t_max ; t += 0.001 ){
p.x = (-v)*t;
p.y = b*t - 0.5*g*t*t;
if( inside(p) ){
printf("%.2lf\n",t);
ok = 1;
break;
}
}
if(!ok) printf("Miss!\n");
}
return 0;
}
HDU 4458 Shoot the Airplane( 判断点在多边形内外 )的更多相关文章
- HDU 1756 Cupid's Arrow 判断点在多边形的内部
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- ZOJ 1081 Points Within( 判断点在多边形内外 )
链接:传送门 题意:给出n个点围成的一个多边形,现在有m个点p,询问p是否在多边形内,你可以认为这些点均不同且输入的顶点是多边形中相邻的两个顶点,最后的顶点与第一个相邻并且每一个顶点都连接两条边( 左 ...
- hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 1756 Cupid's Arrow( 判断点在多边形的内外 )
链接:传送门 思路:判断每支箭是否在多边形内,计算几何点定位中水题,不清楚下面的代码能不能适用于给定点的顺序不确定( 既不是顺时针又不是逆时针 ) /************************* ...
- matlab练习程序(射线法判断点与多边形关系)
依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...
- zoj 1081 判断点在多边形内
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81Points Within Time Limit: 2 Second ...
- Broken line - SGU 124(判断点与多边形的关系)
题目大意:RT 分析:构造一条射线,如果穿越偶数条边,那么就在多边形外面,如果穿越奇数条边,那么就在多边形里面. 代码如下: ===================================== ...
- 判断点在多边形内算法的C++实现
目录 1. 算法思路 2. 具体实现 3. 改进空间 1. 算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标 ...
- C# GDI+ 利用 Rectangle GraphicsPath 判断 矩形或多边形 图形关系
最近在做一些简单的图像对比工作,总结了一些GDI+对象的使用方式,记录下来共享给大家使用. 判断Rectangl与多边形的关系 /// <summary> /// 是否包含输入范围 /// ...
随机推荐
- JavaScript进阶【四】JavaScript中的this,apply,call的深入剖析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 纯css3实现箭头、关闭按钮旋转效果
说起css3的旋转效果,那就要说为什么不用js去实现,CSS3的动画效果,能够减少对JavaScript和Flash文件的HTTP请求这是原因之一.但是css3可能要求浏览器执行很多的工作来完成这个动 ...
- sessionStorage缓存滚动条位置
想象在一个列表页,用户上滑页面浏览数据,点击某一条进入详情页,之后再从详情页返回列表页时不会想再从头去查看数据,这就要求我们记录用户刚刚浏览的位置,而不是重新刷新页面到了页面顶部.这里需要用到sess ...
- javax.servlet.http.HttpServletRequest; 不存在
右击项目 找到 最后一项 属性设置 选择 Server Runtime 选择导入你的 tomcat jar 包
- MVC基于Struts2的CRUD,java+bean+struts
1,所需jar包,将jar包导入lib中 2,项目目录结构 3,struts.xml <?xml version="1.0" encoding="UTF-8&quo ...
- js:Array对象常用方法介绍
前言 在js中,数组作为一个特殊的对象.是我们常用的数据格式.今天就来梳理一下常用的数组方法. 1.基础 几种基础的就简单介绍一下:创建数组 var arr1 = new Array(); //括号可 ...
- struct 模块解决 TCP黏包问题
首先来看一下产生黏包现象的一段代码: # server.py 服务端 import socket sk = socket.socket() sk.bind(('127.0.0.1',9000)) ...
- 【hdu 6438】Buy and Resell
[链接] 我是链接,点我呀:) [题意] 有一个物品的价格在1..n这些位置各不相同. 你初始有无限的钱. 问你从1走到n. 你每次可以选择买入一个或者卖出一个该种物品(或啥都不做) 问你最后的最大利 ...
- Spring学习总结(18)——Spring整合Mysql数据库一主多从、多主多从配置
一.新建jdbc.properties配置文件 master.jdbc.driverClassName=com.mysql.jdbc.Driver master.jdbc.url=jdbc:mysql ...
- [using_microsoft_infopath_2010]Chapter 11 创建审批流程
本章概要: 1.为审批者创建一个简单的界面 2.设置表单加载规则切换视图 3.创建多审批小结表单 4.为已经完成的表单创建只读视图 5.创建工作流为每个审批阶段发送EMAIL