hdu 2528 Area
2014-07-30 http://acm.hdu.edu.cn/showproblem.php?pid=2528
解题思路:
求多边形被一条直线分成两部分的面积分别是多少。因为题目给的直线一定能把多边形分成两部分,所以就不用考虑多边形是否与直线相交。直接求问题。
将多边形的每一条边与直线判断是否相交。若相交,就从这点开始计算面积,直到判断到下一个边与直线相交的点。这之间的面积求出来为area2。
area1为多边形的总面积。多边形被直线分成的另外一部分面积 = area1 - area2 有一个特殊的情况:当直线与多边形的顶点相交时,应该考虑下如何处理 1 #include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std; #define MAXN 30
#define EPS 0.00000001 int dcmp(double x){
if(fabs(x) < EPS)
return ;
return x < ? - : ;
} struct Point{
double x, y;
Point(double x = , double y = ): x(x), y(y) {} bool operator != (const Point & other){
return dcmp(x - other.x) != || (dcmp(x - other.x) == && dcmp(y - other.y) != );
}
}; struct Line{
Point A, B;
//Line(Point A = Point(0, 0), Point B = Point(0, 0)): A(A), B(B){}
}; typedef Point Vector; Vector operator + (Vector A, Vector B){
return Vector(A.x + B.x, A.y + B.y);
} Vector operator - (Point A, Point B){
return Vector(A.x - B.x, A.y - B.y);
} Vector operator * (Vector A, double d){
return Vector(A.x * d, A.y * d);
} Vector operator / (Vector A, double d){
return Vector(A.x / d, A.y / d);
} double dot(Vector A, Vector B){//点乘
return A.x * B.x + A.y * B.y;
} double cross(Vector A, Vector B){//叉乘
return A.x * B.y - A.y * B.x;
} int n;
Point p[MAXN];
Line line; bool input(){
scanf("%d", &n );
if(!n){
return false;
}
for(int i = ; i < n; i++ ){
scanf("%lf%lf", &p[i].x, &p[i].y );
}
scanf("%lf%lf%lf%lf", &line.A.x, &line.A.y, &line.B.x, &line.B.y );
return true;
} double polygon_area(){//求多边形面积
double area = ;
for(int i = ; i < n - ; i++ ){
area += cross(p[i] - p[], p[i + ] - p[]);
}
return fabs(area) * 0.5;
} bool line_segment_intersect(Line L, Point A, Point B, Point &P){//直线和线段相交
Vector a = A - L.B, b = L.A - L.B, c = B - L.B;
if(dcmp(cross(a, b)) * dcmp(cross(b, c)) >= ){//若直线和线段相交 求出交点 《算法入门经典训练之南》上的公式
Vector u = L.A - A;
double t = cross(A - B, u) / cross(b, A - B);
P = L.A + b * t;
return true;
}
return false;
} void solve(){
int flag = ;
double area1 = polygon_area(), area2 = ;//area1算出多边形总面积
Point P, T; p[n] = p[];
for(int i = ; i < n; i++ ){
if(flag == && line_segment_intersect(line, p[i], p[i + ], P)){//第一次相交点
area2 += cross(P, p[i + ]);
flag++;
}else if(flag == && line_segment_intersect(line, p[i], p[i + ], T) && P != T){//第二次相交点
area2 += cross(p[i], T);
area2 += cross(T, P);
flag++;
break;
}else if(flag == ){
area2 += cross(p[i], p[i + ]);
}
}
area2 = fabs(area2) * 0.5;
area1 -= area2;//area1 获取多边形另外一半的面积
if(area1 < area2){//规定大面积在前面 输出
swap(area1, area2);
}
printf("%.0lf %.0lf\n", area1, area2);
} int main(){
//freopen("data.in", "r", stdin );
while(input()){
solve();
}
return ;
}
hdu 2528 Area的更多相关文章
- hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)
Area Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2892 Area
http://acm.hdu.edu.cn/showproblem.php?pid=2892 解题思路: 求多边形与圆的相交的面积是多少. 以圆心为顶点,将多边形划分为n个三角形. 接下来就求出每个三 ...
- hdu 4946 Area of Mushroom(凸包)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 Area of Mushroom Time Limit: 2000/1000 MS (Java/Ot ...
- HDU 4946 Area of Mushroom(构造凸包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 题目大意:在一个平面上有n个点p1,p2,p3,p4....pn,每个点可以以v的速度在平面上移 ...
- HDU 4946 Area of Mushroom 凸包
链接:pid=4946">http://acm.hdu.edu.cn/showproblem.php?pid=4946 题意:有n个人.在位置(xi,yi),速度是vi,假设对于某个点 ...
- HDU 4946 Area of Mushroom 凸包 第八次多校
题目链接:hdu 4946 题意:一大神有N个学生,各个都是小神,大神有个二次元空间,每一个小神都有一个初始坐标,如今大神把这些空间分给徒弟们,规则是假设这个地方有一个人比谁都先到这,那么这个地方就是 ...
- hdu 1451 Area in Triangle(计算几何 三角形)
Given a triangle field and a rope of a certain length (Figure-1), you are required to use the rope t ...
- HDU 4946 Area of Mushroom(2014 Multi-University Training Contest 8)
思路: 只有速度最大才有可能为1,速度不是最大肯定为0,那么就是 只需要操作那些速度最大的点,这些点求一个凸包,判断一下是不是在凸包边上即可. 有几个需要注意的地方: 1.最大速度如果为0 那么肯 ...
- HDU 4946 Area of Mushroom (几何凸包)
题目链接 题意:给定n个人,每个人有一个速度v方向任意.如果平面中存在一个点只有某个人到达的时间最短(即没有人比这个人到的时间更短或相同),那么我们定义这个店归这个人管辖,现在问这些人中哪些人的管辖范 ...
随机推荐
- zabbix basic concept
tomcat/mysql/hadoop http://www.linuxidc.com/Linux/2014-06/103776p2.htm http://www.aikaiyuan.com/2993 ...
- java实验一实验报告
Java实验报告一:Java开发环境的熟悉 ...
- 【摘自网络】陈奕迅&&杨千嬅
揭陈奕迅杨千嬅相爱18年恋人未满的点滴片段 文/一床情书 但凡未得到,但凡是过去,总是最登对 ——题记 已经仙逝多年的香港歌坛天后梅艳芳曾经在<似是故人来>里唱道:“但凡未得到,但凡是过去 ...
- WIN 8.1使用常见问题及解决
WIN 8.1正式版64位(cn_windows_8_1_pro_vl_x64_dvd_2971907)使用问题及解决 一.IE11的输入框会变蓝: 如在百度中搜索时,搜索框和按钮均变成蓝色背景, ...
- 1011 最大公约数GCD
1011 最大公约数GCD 基准时间限制:1 秒 空间限制:131072 KB 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B < ...
- const与#define宏常量 , inline与#define
1.预处理 预处理器是在真正的编译开始之前由编译器调用的独立程序.预处理器可以删除注释.包含其他文件以及执行宏替代. 预处理命令(宏定义#define..#undef. 文件包含#include. 条 ...
- ArcGIS API for Silverlight 实现修改地图上的工程点位置
原文:ArcGIS API for Silverlight 实现修改地图上的工程点位置 #region 处理工程点点击编辑相关事件 public Graphic editgraphics = null ...
- js判断input为空校验
突然发现最近js发现的问题比较多,更发现我怎么快成了前端开发了?不能够啊!我后台怎么不出问题呢?我的后台是太简单了吗?mybatis-dao-service-controller返回给前台...... ...
- ACCESS自动编号重新从1开始
方法一: 删掉自动编号的字段,再建一个同样的自动编号字段. 方法二: 选择工具,再选择数据库实用工具,单击压缩和修复数据库,这样就OK了. 方法三:(提示错误“无效的数据字段类型” 尝试失败) ...
- js获取网站根目录
//js获取网站根路径(站点及虚拟目录),获得网站的根目录或虚拟目录的根地址 function getRootPath(){ var strFullPath=window ...
