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

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

/**************************************************************
Problem:
User: youmi
Language: C++
Result: Accepted
Time:
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=*atan(1.0); using namespace std;
typedef long long ll;
template <class T> inline void read(T &n)
{
char c; int flag = ;
for (c = getchar(); !(c >= '' && c <= '' || c == '-'); c = getchar()); if (c == '-') flag = -, n = ; else n = c - '';
for (c = getchar(); c >= '' && c <= ''; c = getchar()) n = n * + c - ''; n *= flag;
}
ll Pow(ll base, ll n, ll mo)
{
if (n == ) return ;
if (n == ) return base % mo;
ll tmp = Pow(base, n >> , mo);
tmp = (ll)tmp * tmp % mo;
if (n & ) tmp = (ll)tmp * base % mo;
return tmp;
}
//*************************** int n;
const int maxn=+;
const ll mod=;
double xx[],yy[];
int sgn(double x)
{
if(fabs(x)<eps)
return ;
if(x<)
return -;
else
return ;
}
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)==&&sgn(y-_b.y)==;
}
};
point tri[],rec[];
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)) == ) {
if(sgn((s - b.e) ^ (b.s - b.e)) == )
return make_pair(, res); //重合
else return make_pair(, 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(, res);
}
};
point lst[maxn];
int stc[maxn],top;
bool _cmp(point p1,point p2)
{
double temp=(p1-lst[])^(p2-lst[]);
if(sgn(temp)>)
return true;
else if(sgn(temp)==&&sgn(dist(p1,lst[])-dist(p2,lst[]))<=)
return true;
else
return false;
}
bool on_line(point p,line uu)
{
return (sgn(p.x-uu.s.x)*sgn(p.x-uu.e.x))<=&&(sgn(p.y-uu.s.y)*sgn(p.y-uu.e.y)<=);
}
void graham()
{
if(n==)
{
top=;
return;
}
point p0=lst[];
int k=;
for(int i=;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[]);
sort(lst+,lst+n,_cmp);
if(n==)
{
top=;
stc[]=;
return ;
}
top=;
stc[]=;
stc[]=;
if(n==)
return ;
for(int i=;i<n;i++)
{
while(top>&&sgn((lst[stc[top-]]-lst[stc[top-]])^(lst[i]-lst[stc[top-]]))<=)
top--;
stc[top++]=i;
}
}
bool in_tri(point p)
{
double s=fabs((tri[]-tri[])^(tri[]-tri[]));
double s1=fabs((p-tri[])^(p-tri[]));
double s2=fabs((p-tri[])^(p-tri[]));
double s3=fabs((p-tri[])^(p-tri[]));
return sgn(s1+s2+s3-s)==;
}
bool in_rec(point p)
{
return sgn(p.x-xx[])>=&&sgn(p.x-xx[])<=&&sgn(p.y-yy[])>=&&sgn(p.y-yy[])<=;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",xx+,yy+,xx+,yy+,xx+,yy+,xx+,yy+))
{
tri[]=point(xx[],yy[]),tri[]=point(xx[],yy[]),tri[]=point(xx[],yy[]);
rec[]=point(xx[],yy[]),rec[]=point(xx[],yy[]),rec[]=point(xx[],yy[]),rec[]=point(xx[],yy[]);
n=;
rep(i,,)
if(in_tri(rec[i]))
lst[n++]=rec[i];
rep(i,,)
if(in_rec(tri[i]))
lst[n++]=tri[i];
rep(i,,)
{
line gg=line(rec[i],rec[(i+)%]);
rep(j,,)
{
line hh=line(tri[j],tri[(j+)%]);
pair<int, point> res=hh&gg;
if(res.first==)
{
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=;
if(top>=)
{
rep(i,,top-)
{
ans+=lst[stc[i]]^lst[stc[(i+)%top]];
}
}
ans/=;
printf("%.7f\n",ans);
}
}

csu 1812: 三角形和矩形 凸包的更多相关文章

  1. CSU 1812 三角形和矩形

    湖南省第十二届大学生计算机程序设计竞赛$J$题 计算几何. #pragma comment(linker, "/STACK:1024000000,1024000000") #inc ...

  2. 计算几何板子题【2019牛客国庆集训派对day7——三角形和矩形】【多边形相交的面积】

    链接:https://ac.nowcoder.com/acm/contest/1112/J来源:牛客网 题目描述 Bobo 有一个三角形和一个矩形,他想求他们交的面积. 具体地,三角形和矩形由 8 个 ...

  3. 使用原生JavaScript的Canvas实现拖拽式图形绘制,支持画笔、线条、箭头、三角形、矩形、平行四边形、梯形以及多边形和圆形,不依赖任何库和插件,有演示demo

    前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包 ...

  4. POJ 2079 最大三角形面积(凸包)

    Triangle Description Given n distinct points on a plane, your task is to find the triangle that have ...

  5. canvas快速绘制圆形、三角形、矩形、多边形

    想看前面整理的canvas常用API的同学可以点下面: canvas学习之API整理笔记(一) canvas学习之API整理笔记(二) 本系列文章涉及的所有代码都将上传至:项目代码github地址,喜 ...

  6. CoreGraphics-基本图形绘制-直线、三角形、矩形、椭圆形、弧形

    框架:CoreGraphics 步骤: 1."获取"图形上下文     let cxtRef = UIGraphicsGetCurrentContext()! 2.添加路径 3.渲 ...

  7. 30.编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。

    package zuoye8; public abstract class Shape { private double zhouchang ; private double mianji ; pub ...

  8. 编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。

    package shape; public class Shape { //定义成员变量 private double zhouchang; private double mianji; public ...

  9. 自定义tabpageindicator,可以自定义tab是三角形还是矩形,但是tab不具有滑动的功能

    我是不会滴,但是看了一些大神写的,我修改了一下,大家可以参照参照 一,自定义Mytabpageindicator,直接贴代码了,具体的在代码中有注释 package com.wangy.mytabpa ...

随机推荐

  1. HTML5 模拟现实物理效果,感受 Web 技术魅力

    Ball Pool 是一个基于 HTML5 技术的实验,模拟现实物理效果,让你在 Web 中感受自然物体的运动.玩法介绍:可以随意拖动圆球.点击页面背景.晃动浏览器.双击页面背景或者按住鼠标左键,有不 ...

  2. JS中数组排序

    法一:升序原理:循环嵌套即双向遍历,在从前往后的遍历过程中,如果前一个位子大于后一个位子,把前一个位子的值付给后一个位子, 在从后往前遍历过程中如果前一个值大于后一个的值,把前面的值付给后面,过程中把 ...

  3. HHKB MAC 配置指南 操作指南 快捷键

    1. 设备: mac电脑一台.hhkb键盘一个 2. 初级配置 (1)调节hhkb的模式为Macintosh模式:011001 (打开键盘侧边的滑盖,按照这个顺序调正) (2)Mac电脑安装官方驱动  ...

  4. sql2008“备份集中的数据库备份与现有的xxx数据库不同”解决方法

    因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了: 一.打开sql企业管理器,新建查询 执行以下SQL代码: RESTORE DATAB ...

  5. 一个解决表单中的文字和文本区域(textarea)上对齐的方法

    在进行表单布局的时候通常会遇到这样的情况 文本和textarea标签是底部对齐的 <p><em>邮箱</em><textarea style='height: ...

  6. HTML基础知识总结

    经过这段时间的学习,对于html的一些基础知识有了一定的了解.所谓好记性不如烂笔头,唯有一点点累积,才能汇聚成知识的海洋.现在,我对这段时间的学习做一个总结. 一.HTML的定义 HTML,超文本标记 ...

  7. ABAP语言常用的系统字段及函数

    常用的系统变量如下: 1. SY-PAGNO当前页号 2. SY-DATUM当前时间 3. SY-LINSZ当前报表宽度 4. SY-LINCT当前报表长度 5. SPACE空字符 6. SY-SUB ...

  8. Listbox与Listbox with key的区别

    标准解释: ListboxVisualization as listbox in which a list of entries is displayed with one short descrip ...

  9. SharePoint 2013 初始化Ribbon选中Tab

    SharePoint使用中,经常打开页面会有默认展开的Ribbon选项,有时这又不是我们需要的,所以我们就需要默认选中的项目,下面简单介绍下如何实现. 方法一 1.Dispform.aspx页面默认R ...

  10. Android 进程生命周期 Process Lifecycle

    Android 进程生命周期 Process Lifecycle 进程的生命周期 Android系统会尽力保持应用的进程,但是有时为了给新的进程和更重要的进程回收一些内存空间,它会移除一些旧的进程. ...