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

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

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

#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(点在多边形内)的更多相关文章

  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. 使用shell从DB2数据库导出数据

    使用shell脚本根据输入的用户名,数据库名,密码从DB2数据库导出数据 (1)a.sh脚本如下 #!/usr/bin/bash read -p "please input your DBN ...

  2. 'mysql.column_stats' doesn't exist and Table 'mysql.index_stats' doesn't exist

    在生产库MariabDB中修改字段类型,提示如下错误:​Table 'mysql.column_stats' doesn't existTable 'mysql.index_stats' doesn' ...

  3. 配置 apt-get cloudera 离线source(Cloudera Manager的源)

    配置 apt-get cloudera 离线source(Cloudera Manager的源) 创建/etc/apt/source.list.d/cloudera-manager.list文件,并在 ...

  4. php xml转为xml或者json

    <?php class XmlToArray { private $xml; private $contentAsName="content" ; private $attr ...

  5. .net mvc通过ucenter和 discuz的整合,nopcommerce ucenter 插件的方式实现

    discuz无疑是目前市面上最好的论坛之一,对于大多数公司来说,用discuz搭建一个论坛肯定是最节约成本的选择,然而我们的会员想要和discuz进行整合的话,只有两种荀泽,一种直接选用discuz的 ...

  6. < java.lang >-- String字符串

    java中用String类进行描述.对字符串进行了对象的封装.这样的好处是可以对字符串这种常见数据进行方便的操作.对象封装后,可以定义N多属性和行为. 如何定义字符串对象呢?String s = &q ...

  7. HashCode作用

    作用: 1.HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定镀锡的存储地址的 2.如果两个对象的equals相等,那么HashCode一定相等,反之不行 3.如 ...

  8. 搭建SpringMVC+MyBatis开发框架二

    配置web.xml 用如下配置覆盖原有的web.xml内容 <?xml version="1.0" encoding="UTF-8"?> <w ...

  9. 阿里云:linux 一键安装web环境

    参考地址:http://www.cnblogs.com/ada-zheng/p/3724957.html

  10. asp.net中下载文件的问题

    今天解决web的文件下载问题,下载的方法网上很多,不过我的下载有点特殊: 1.下载按钮在gridview中,是模板列的linkButton: 2.使用了ajax控件: 所以,在下载时总是报错,通过查找 ...