第一道点在多边形内的判断题,一开始以为是凸的。其实题意很简单的啦,最后转化为判断一个点是否在一个多边形内。

如果只是简单的凸多边形的话,我们可以枚举每条边算下叉积就可以知道某个点是不是在范围内了。但对于更一般的多边形,要采用的方法可能就要复杂一些,其中一种是叫做射线法的东西,在该点上画一条射线,如果射线与多边形偶数次相交,则说明点在多边形外,否则在多边形内。实践中可以取水平的一条,至于怎么判断就要看下代码了,判断的过程中如何发现点已经在多边形上了则直接返回。

计算几何做的少,则是算是补充了一个盲区吧。

  1. #pragma warning(disable:4996)
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<algorithm>
  6. #include<cmath>
  7. #define ll long long
  8. #define mod 1000000007
  9. #define maxn 1000000
  10. #define eps 1e-6
  11. using namespace std;
  12.  
  13. struct Point
  14. {
  15. int x, y;
  16. Point(int xi, int yi) :x(xi), y(yi){}
  17. Point(){}
  18. int dot(const Point &b){
  19. return x*b.x + y*b.y;
  20. }
  21. int det(const Point &b){
  22. return x*b.y - y*b.x;
  23. }
  24. Point operator - (const Point &b){
  25. return Point(x - b.x, y - b.y);
  26. }
  27. }p[25];
  28.  
  29. int dcmp(double x){
  30. return (x > eps) - (x < -eps);
  31. }
  32.  
  33. int n;
  34. double A, B;
  35. double lx, rx, ly, ry;
  36.  
  37. bool onLine(Point x, Point aa, Point bb)
  38. {
  39. return (bb - aa).det(x-aa) == 0 && (bb - x).dot(aa - x) <= 0;
  40. }
  41.  
  42. bool inside(Point x)
  43. {
  44. int ret = 0;
  45. for (int i = 0; i < n; i++){
  46. if (onLine(x, p[i], p[(i + 1) % n])) return true;
  47. int k = (p[(i + 1) % n] - p[i]).det(x - p[i]);
  48. int d1 = x.y - p[i].y;
  49. int d2 = x.y - p[(i + 1) % n].y;
  50. if (k > 0 && d1 >= 0 && d2 < 0) ret++;
  51. if (k < 0 && d2 >= 0 && d1 < 0) ret--;
  52. }
  53. return ret != 0;
  54. }
  55.  
  56. int main()
  57. {
  58. while (cin>>lx>>ly>>rx>>ry){
  59. scanf("%d%lf%lf", &n, &A, &B);
  60. for (int i = 0; i < n; i++){
  61. scanf("%d%d", &p[i].x, &p[i].y);
  62. }
  63. p[n].x = p[0].x; p[n].y = p[0].y;
  64. double ans = 0;
  65. int llx = ceil(lx), rrx = floor(rx);
  66. int lly = ceil(ly), rry = floor(ry);
  67.  
  68. for (int i = llx; i <= rrx; i++){
  69. for (int j = lly; j <= rry; j++){
  70. if (inside(Point(i, j))){
  71. double h = min(i + 0.5, rx) - max(i - 0.5, lx);
  72. double w = min(j + 0.5, ry) - max(j - 0.5, ly);
  73. ans += (A*i + B*j)*h*w;
  74. }
  75. }
  76. }
  77. ans /= (double)(rx - lx)*(ry - ly);
  78. printf("%.3lf\n", ans);
  79. }
  80. return 0;
  81. }

ZOJ3720 Magnet Darts(点在多边形内)的更多相关文章

  1. ZOJ-3720 Magnet Darts 计算几何,概率

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意:在一个矩形区域投掷飞镖,每个整点有磁性,每个点的磁性 ...

  2. PHP 判断点是否在多边形内

    如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...

  3. 结合谷歌地图多边形(polygon)与Sql Server 2008的空间数据类型计算某个点是否在多边形内的注意事项

    首先在利用 GEOGRAPHY::STPolyFromText(@GeoStr, 4326) 这样的函数把字符串转换为Geography类型时,字符串里经纬度的顺序是 “经度[空格]纬度”,即“lon ...

  4. 2D空间中求一点是否在多边形内

    参考自这篇博文:http://www.cnblogs.com/dabiaoge/p/4491540.html 一开始没仔细看做法,浪费了不少时间.下面是最终实现的效果: 大致流程: 1.随便选取多边形 ...

  5. 百度地图 判断marker是否在多边形内

    昨天画了圆形,判marker是否存在圆形内.今天来画多边形,判断marker在多边形内. 需要引入一个js      <script type="text/javascript&quo ...

  6. hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)

    凸多边形 Time Limit: 2000 MS    Memory Limit: 65536 K Total Submit: 130(24 users)   Total Accepted: 40(1 ...

  7. hdu 1756 判断点在多边形内 *

    模板题 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> ...

  8. zoj 1081 判断点在多边形内

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81Points Within Time Limit: 2 Second ...

  9. 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 ...

随机推荐

  1. 文件系统 第八次迭代 VFS相关说明

    麻烦访问evernote链接 http://www.evernote.com/shard/s133/sh/53e5b5ac-1192-4910-8bd5-6886218562af/59516c32a5 ...

  2. hdu 1429 胜利大逃亡(续)

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王 ...

  3. MEF(Managed Extensibility Framework) 微软平台插件化开发

    体验Managed Extensibility Framework精妙的设计   MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要 ...

  4. Swift TabeleViewCell dequeueReusableCellWithIdentifier 使用的新的细节,原来现在可以这样

    今天在看官方的TableView Guide,突然想起来最近写的一个代码中实现tableViewCell复用的时候有点问题: var cell = UITableViewCell(style: UIT ...

  5. [转]vim常用命令

    [转]vim常用命令 http://www.cnblogs.com/sunyubo/archive/2010/01/06/2282198.html http://blog.csdn.net/wooin ...

  6. JavaScript设计模式与开发实践——JavaScript的多态

    “多态”一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不 ...

  7. IOS获取手机设备型号

    最新型号的设备列表https://www.theiphonewiki.com/wiki/Models #import "iosutils/IOSUtils.h" #import & ...

  8. Windows Phone 8 实现列表触底加载

    [背景] 很多时候在做WP开发的过程中会遇到数据需要分页获取,根据微软官方的推荐方式,建议实现为Market中类似的体验,即滑动到列表的底部的时候加载更多的数据. 这一需求在早起WP7.1时代实现起来 ...

  9. 找出1-N中1的个数

    一.题目 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12)  = 5. ...

  10. Careercup - Microsoft面试题 - 6282862240202752

    2014-05-11 03:56 题目链接 原题: Given an integer array. Perform circular right shift by n. Give the best s ...