ZOJ3720 Magnet Darts(点在多边形内)
第一道点在多边形内的判断题,一开始以为是凸的。其实题意很简单的啦,最后转化为判断一个点是否在一个多边形内。
如果只是简单的凸多边形的话,我们可以枚举每条边算下叉积就可以知道某个点是不是在范围内了。但对于更一般的多边形,要采用的方法可能就要复杂一些,其中一种是叫做射线法的东西,在该点上画一条射线,如果射线与多边形偶数次相交,则说明点在多边形外,否则在多边形内。实践中可以取水平的一条,至于怎么判断就要看下代码了,判断的过程中如何发现点已经在多边形上了则直接返回。
计算几何做的少,则是算是补充了一个盲区吧。
#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
#define mod 1000000007
#define maxn 1000000
#define eps 1e-6
using namespace std; struct Point
{
int x, y;
Point(int xi, int yi) :x(xi), y(yi){}
Point(){}
int dot(const Point &b){
return x*b.x + y*b.y;
}
int det(const Point &b){
return x*b.y - y*b.x;
}
Point operator - (const Point &b){
return Point(x - b.x, y - b.y);
}
}p[25]; int dcmp(double x){
return (x > eps) - (x < -eps);
} int n;
double A, B;
double lx, rx, ly, ry; bool onLine(Point x, Point aa, Point bb)
{
return (bb - aa).det(x-aa) == 0 && (bb - x).dot(aa - x) <= 0;
} bool inside(Point x)
{
int ret = 0;
for (int i = 0; i < n; i++){
if (onLine(x, p[i], p[(i + 1) % n])) return true;
int k = (p[(i + 1) % n] - p[i]).det(x - p[i]);
int d1 = x.y - p[i].y;
int d2 = x.y - p[(i + 1) % n].y;
if (k > 0 && d1 >= 0 && d2 < 0) ret++;
if (k < 0 && d2 >= 0 && d1 < 0) ret--;
}
return ret != 0;
} int main()
{
while (cin>>lx>>ly>>rx>>ry){
scanf("%d%lf%lf", &n, &A, &B);
for (int i = 0; i < n; i++){
scanf("%d%d", &p[i].x, &p[i].y);
}
p[n].x = p[0].x; p[n].y = p[0].y;
double ans = 0;
int llx = ceil(lx), rrx = floor(rx);
int lly = ceil(ly), rry = floor(ry); for (int i = llx; i <= rrx; i++){
for (int j = lly; j <= rry; j++){
if (inside(Point(i, j))){
double h = min(i + 0.5, rx) - max(i - 0.5, lx);
double w = min(j + 0.5, ry) - max(j - 0.5, ly);
ans += (A*i + B*j)*h*w;
}
}
}
ans /= (double)(rx - lx)*(ry - ly);
printf("%.3lf\n", ans);
}
return 0;
}
ZOJ3720 Magnet Darts(点在多边形内)的更多相关文章
- ZOJ-3720 Magnet Darts 计算几何,概率
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意:在一个矩形区域投掷飞镖,每个整点有磁性,每个点的磁性 ...
- PHP 判断点是否在多边形内
如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...
- 结合谷歌地图多边形(polygon)与Sql Server 2008的空间数据类型计算某个点是否在多边形内的注意事项
首先在利用 GEOGRAPHY::STPolyFromText(@GeoStr, 4326) 这样的函数把字符串转换为Geography类型时,字符串里经纬度的顺序是 “经度[空格]纬度”,即“lon ...
- 2D空间中求一点是否在多边形内
参考自这篇博文:http://www.cnblogs.com/dabiaoge/p/4491540.html 一开始没仔细看做法,浪费了不少时间.下面是最终实现的效果: 大致流程: 1.随便选取多边形 ...
- 百度地图 判断marker是否在多边形内
昨天画了圆形,判marker是否存在圆形内.今天来画多边形,判断marker在多边形内. 需要引入一个js <script type="text/javascript&quo ...
- hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)
凸多边形 Time Limit: 2000 MS Memory Limit: 65536 K Total Submit: 130(24 users) Total Accepted: 40(1 ...
- hdu 1756 判断点在多边形内 *
模板题 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> ...
- zoj 1081 判断点在多边形内
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81Points Within Time Limit: 2 Second ...
- POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内)
A Round Peg in a Ground Hole Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4438 Acc ...
随机推荐
- GRE协议学习与练习
通用路由封装(英语:Generic Routing Encapsulation,缩写为GRE),一种隧道协议,可以在虚拟点对点链路中封装多种网络层协议.由思科系统开发 以下是GRE协议的简单练习 网络 ...
- Java之HttpURLConnection的变态事: Keep-Alive
HttpURLConnection的变态事: Keep-Alive JDK自带的HttpURLConnection默认启动Keep-Alive, 使用后的HttpURLConnection会放入池里重 ...
- sychronized面试问题浅析
先说下面试吧,整体来说基础准备好点,简历别太假,然后回答起来实事求是,表现自然的点基本上都没问题吧(针对初级职位,记得有个hr说过对于新人基础扎实和为人真诚是最关键的),两天时间跑起来挺累,反而觉得面 ...
- C# socket 实现消息中心向消息平台 转发消息
公司用到,直接粘代码了 using System; using System.Collections.Generic; using System.Configuration; using System ...
- Objective - C中属性和点语法的使用
一.属性 属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性 ...
- 3-附1 ->和*的区别
问题: c++ .和 ->有什么区别? 还有什么是继承什么是派生?-------------------------------------------------------------- 比 ...
- python学习笔记1
python3.3使用urllib2报错 no module named urllib2,原因是python3中将urllib2换成了request. 所以要使用import urllib.reque ...
- 修改ip脚本
1.打开运行 2.输入CMD 3.在命令提示符下输入: netsh -c interface ip dump > C:\我的网络配置.txt 4.打开您在C:\ 下的"我的网络配置 . ...
- opencv颜色识别代码分享
android 平台 opencv 实现颜色识别代码:http://www.eyesourcecode.com/thread-40682-1-1.htmlopencv的颜色识别简单实现的代码:http ...
- JavaScript美术馆进化史
内容选自<<JavaScript DOM 编程艺术>>第4-6章,跟着作者一起见证美术馆的进化吧. 先放效果图,然后一步步做出每个效果.每个效果都有它实用的地方,且知道过程可以 ...