传送门:csu 1812: 三角形和矩形

思路:首先,求出三角形的在矩形区域的顶点,矩形在三角形区域的顶点。然后求出所有的交点。这些点构成一个凸包,求凸包面积就OK了。

/**************************************************************Problem:User: youmiLanguage: C++Result: AcceptedTime:Memory:
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%I64d",&a)
#define pt(a) printf("%d\n",a)
#define ptlld(a) printf("%I64d\n",a)
#define rep(i,from,to) for(int i=from;i<=to;i++)
#define irep(i,to,from) for(int i=to;i>=from;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define eps 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl
const double pi=4*atan(1.0);using namespace std;
typedef long long ll;
template <class T> inline void read(T &n)
{char c; int flag = 1;for (c = getchar(); !(c >= '0' && c <= '9' || c == '-'); c = getchar()); if (c == '-') flag = -1, n = 0; else n = c - '0';for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) n = n * 10 + c - '0'; n *= flag;
}
ll Pow(ll base, ll n, ll mo)
{if (n == 0) return 1;if (n == 1) return base % mo;ll tmp = Pow(base, n >> 1, mo);tmp = (ll)tmp * tmp % mo;if (n & 1) tmp = (ll)tmp * base % mo;return tmp;
}
//***************************int n;
const int maxn=100000+10;
const ll mod=1000000007;
double xx[10],yy[10];
int sgn(double x)
{if(fabs(x)<eps)return 0;if(x<0)return -1;elsereturn 1;
}
struct point
{double x,y;point(){};point(double _x,double _y){x=_x,y=_y;}point operator-(const point &_b)const{return point(x-_b.x,y-_b.y);}double operator *(const point &_b)const{return x*_b.x+y*_b.y;}double operator^(const point &_b)const{return x*_b.y-_b.x*y;}bool operator==(const point &_b)const{return sgn(x-_b.x)==0&&sgn(y-_b.y)==0;}
};
point tri[10],rec[10];
double dist(point a,point b)
{return sqrt((a-b)*(a-b));
}
struct line
{point s, e;line() {}line(point _s, point _e){s = _s;e = _e;}pair<int, point> operator &(const line &b)const{point res = s;if(sgn((s - e) ^ (b.s - b.e)) == 0) {if(sgn((s - b.e) ^ (b.s - b.e)) == 0)return make_pair(0, res); //重合else return make_pair(1, res); //平行
        }long double t = ((s - b.s) ^ (b.s - b.e)) / ((s - e) ^ (b.s - b.e));res.x += (e.x - s.x) * t;res.y += (e.y - s.y) * t;return make_pair(2, res);}
};
point lst[maxn];
int stc[maxn],top;
bool _cmp(point p1,point p2)
{double temp=(p1-lst[0])^(p2-lst[0]);if(sgn(temp)>0)return true;else if(sgn(temp)==0&&sgn(dist(p1,lst[0])-dist(p2,lst[0]))<=0)return true;elsereturn false;
}
bool on_line(point p,line uu)
{return (sgn(p.x-uu.s.x)*sgn(p.x-uu.e.x))<=0&&(sgn(p.y-uu.s.y)*sgn(p.y-uu.e.y)<=0);
}
void graham()
{if(n==0){top=0;return;}point p0=lst[0];int k=0;for(int i=1;i<n;i++){if((p0.y>lst[i].y)||(p0.y==lst[i].y&&p0.x>lst[i].x)){p0=lst[i];k=i;}}swap(lst[k],lst[0]);sort(lst+1,lst+n,_cmp);if(n==1){top=1;stc[0]=0;return ;}top=2;stc[0]=0;stc[1]=1;if(n==2)return ;for(int i=2;i<n;i++){while(top>1&&sgn((lst[stc[top-1]]-lst[stc[top-2]])^(lst[i]-lst[stc[top-2]]))<=0)top--;stc[top++]=i;}
}
bool in_tri(point p)
{double s=fabs((tri[0]-tri[1])^(tri[0]-tri[2]));double s1=fabs((p-tri[0])^(p-tri[1]));double s2=fabs((p-tri[1])^(p-tri[2]));double s3=fabs((p-tri[2])^(p-tri[0]));return sgn(s1+s2+s3-s)==0;
}
bool in_rec(point p)
{return sgn(p.x-xx[3])>=0&&sgn(p.x-xx[4])<=0&&sgn(p.y-yy[3])>=0&&sgn(p.y-yy[4])<=0;
}
int main()
{#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifwhile(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",xx+1,yy+1,xx+2,yy+2,xx+3,yy+3,xx+4,yy+4)){tri[0]=point(xx[1],yy[1]),tri[1]=point(xx[1],yy[2]),tri[2]=point(xx[2],yy[1]);rec[0]=point(xx[3],yy[3]),rec[1]=point(xx[3],yy[4]),rec[2]=point(xx[4],yy[4]),rec[3]=point(xx[4],yy[3]);n=0;rep(i,0,3)if(in_tri(rec[i]))lst[n++]=rec[i];rep(i,0,2)if(in_rec(tri[i]))lst[n++]=tri[i];rep(i,0,3){line gg=line(rec[i],rec[(i+1)%4]);rep(j,0,2){line hh=line(tri[j],tri[(j+1)%3]);pair<int, point> res=hh&gg;if(res.first==2){point &uu=res.second;if(on_line(uu,gg)&&on_line(uu,hh))lst[n++]=uu;}}}sort(lst,lst+n,_cmp);n=unique(lst,lst+n)-lst;graham();double ans=0;if(top>=3){rep(i,0,top-1){ans+=lst[stc[i]]^lst[stc[(i+1)%top]];}}ans/=2;printf("%.7f\n",ans);}
}

转载于:https://www.cnblogs.com/youmi/p/5877578.html

csu 1812: 三角形和矩形 凸包相关推荐

  1. python打印长方形_利用python打印出菱形、三角形以及矩形的方法实例

    前言 本文主要给大家介绍了关于利用python打印出菱形.三角形以及矩形的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 实例代码 #coding:utf-8 rows = int ...

  2. java继承类长方形面积_java_java用接口、多态、继承、类计算三角形和矩形周长及面积的方法,本文实例讲述了java用接口、多 - phpStudy...

    java用接口.多态.继承.类计算三角形和矩形周长及面积的方法 本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** ...

  3. 随机创建圆形、三角形或者矩形类的对象, 存放在数组中,并计算出每个形状的面积和周长

    随机创建圆形.三角形或者矩形类的对象, 存放在数组中,并计算出每个形状的面积和周长 题目要求 解题思路 代码 形状类代码 圆形类代码 三角形类代码 矩形类代码 方法类代码 运行结果 题目要求 随机创建 ...

  4. c++--定义图形抽象类。完成圆形、三角形、矩形的面积和周长计算

    c+±-定义图形抽象类.完成圆形.三角形.矩形的面积和周长计算 /*===============================================* 文件名称:abstract.cpp ...

  5. java继承求三角形圆形面积_java用接口、多态、继承、类计算三角形和矩形周长及面积的方法...

    本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** * @author vvv * @date 2013-8-10 ...

  6. Java小程序之计算三角形/圆形/矩形的周长和面积

    题目:用Java编写一个计算随意给定值的三角形/圆形/矩形的周长和面积 代码如下: 文件名:Shape.java /*** 抽象类Shape 是其他三个形状的父类 * 其他三个类要继承重写getAre ...

  7. 求四边形最大内接矩形_三角形内接矩形的最大面积问题

    龙源期刊网 http://www.qikan.com.cn 三角形内接矩形的最大面积问题 作者:李云虎 来源:<中学教学参考 · 理科版> 2013 年第 01 期 [问题]美佳玩具厂生产 ...

  8. OpenGL-第一个三角形与矩形(两个三角形)

    目录 新建项目,进行配置 项目结构 项目属性配置 依赖项设置 三角形代码 部分函数解释 main.cpp 运行截图 矩形代码 main.cpp 运行截图 简单的三角形与矩形 白色三角形 白色矩形 全部 ...

  9. css 一侧是三角形的矩形_5种具有CSS形状和滤镜的精美图像效果

    今天,这里为大家准备了五张展示现代CSS功能的背景图像.它们可以用作桌面墙纸,引人注目的登陆页面,甚至可以用作印刷海报.在下面的文章中,还将介绍一些关键的CSS技术,以便大家可以根据自己的喜好自定义它 ...

  10. 用php求矩形周长,PHP实现的简单三角形、矩形周长面积计算器分享

    运用php面向对象的知识设计一个图形计算器,同时也运用到了抽象类知识,这个计算器可以计算三角形的周长和面积以及矩形的周长和面积.本图形计算器有4个页面:1.php图形计算器主页index.php;   ...

最新文章

  1. 动态语言的灵活性是把双刃剑 -- 以Python语言为例
  2. express 使用 redirect 对 ajax 无效 页面不跳转
  3. LA3989女士的选择
  4. 从零开始编写一个vue插件
  5. Python 技术篇 - python3使用speech库常见问题原因及解决方法
  6. 如何用CMD开启3389与查看3389端口
  7. [Python]从零开始学python——Day03 字典,元组
  8. 讨论一下文章的阅读量 (个人观点)
  9. 如何快速直接从Web of Science下载文献,保存到Endnote
  10. android 软键盘的收回
  11. 改变文件权限的用户身份
  12. ubuntu php mysql apache_Ubuntu+Apache+PHP+Mysql环境搭建(完整版)(转)
  13. a标签的href属性
  14. 《编码规范和测试方法——C/C++版》作业 ·005——设计一组员工类
  15. java后端 解决app接口版本管理问题
  16. 如何动态的修改安卓APP名字和桌面图标
  17. 【晶体管电路设计】五、渥尔曼电路设计
  18. Ribbon负载均衡配置
  19. vue+echarts+springboot实现云词图
  20. 【超实用的浏览器插件】目前Google Chrome最好用的插件,为什么你还在犹豫不决?

热门文章

  1. 嵌入式系统——指令操作扩展
  2. mysql丢数据无法启动mysql_mysql InnoDB数据无法启动解决办法
  3. php的$符的作用,PHP引用符的用法举例
  4. Hive复杂数据类型 struct
  5. yaml与json的对比
  6. html移动端缩放解决方案
  7. [UWP]了解模板化控件(6):使用附加属性
  8. 苹果谈iPhone遭CIA攻击:强烈要求用户升级系统
  9. REST测试工具之curl(URL多参数)
  10. BenchmarkSQL 测试Oracle 12c TPC-C 性能