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 ...
随机推荐
- 文件系统 第八次迭代 VFS相关说明
麻烦访问evernote链接 http://www.evernote.com/shard/s133/sh/53e5b5ac-1192-4910-8bd5-6886218562af/59516c32a5 ...
- hdu 1429 胜利大逃亡(续)
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王 ...
- MEF(Managed Extensibility Framework) 微软平台插件化开发
体验Managed Extensibility Framework精妙的设计 MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要 ...
- Swift TabeleViewCell dequeueReusableCellWithIdentifier 使用的新的细节,原来现在可以这样
今天在看官方的TableView Guide,突然想起来最近写的一个代码中实现tableViewCell复用的时候有点问题: var cell = UITableViewCell(style: UIT ...
- [转]vim常用命令
[转]vim常用命令 http://www.cnblogs.com/sunyubo/archive/2010/01/06/2282198.html http://blog.csdn.net/wooin ...
- JavaScript设计模式与开发实践——JavaScript的多态
“多态”一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不 ...
- IOS获取手机设备型号
最新型号的设备列表https://www.theiphonewiki.com/wiki/Models #import "iosutils/IOSUtils.h" #import & ...
- Windows Phone 8 实现列表触底加载
[背景] 很多时候在做WP开发的过程中会遇到数据需要分页获取,根据微软官方的推荐方式,建议实现为Market中类似的体验,即滑动到列表的底部的时候加载更多的数据. 这一需求在早起WP7.1时代实现起来 ...
- 找出1-N中1的个数
一.题目 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12) = 5. ...
- Careercup - Microsoft面试题 - 6282862240202752
2014-05-11 03:56 题目链接 原题: Given an integer array. Perform circular right shift by n. Give the best s ...