csu1812

题意

求三角形和矩形交的面积。

分析

半平面交。把三角形的三条边当作直线去切割矩形,最后求切割后的多边形面积即可。

code

#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring> using namespace std; const double eps = 1e-8; int sgn(double x) { // 误差
if(fabs(x) < eps) return 0;
return x < 0 ? -1 : 1;
} struct P {
double x, y;
P() {}
P(double x, double y) : x(x), y(y) {}
P operator + (const P p) const {
return P(x + p.x, y + p.y);
}
P operator - (const P p) const {
return P(x - p.x, y - p.y);
}
P operator * (const double tt) const {
return P(x * tt, y * tt);
}
P operator / (const double tt) const {
return P(x / tt, y / tt);
}
bool operator < (const P &p) const { // 坐标排序规则
return x < p.x || (x == p.x && y < p.y);
}
double dot(const P &p) const { // 点积
return x * p.x + y * p.y;
}
double det(const P &p) const { // 叉积
return x * p.y - y * p.x;
}
}; P tri[4], rec[5];
P b[5], c[5];
double A, B, C;
int m; double cross(P o, P p, P q) { // 向量 op 和 oq 的叉积
return (p.x - o.x) * (q.y - o.y) - (q.x - o.x) * (p.y - o.y);
} void init() { // 顺时针排序
if(sgn(cross(tri[0], tri[1], tri[2])) < 0)
reverse(tri, tri + 3);
} // 得到直线 pq : A * x + B * y + C = 0
// f(x,y) = A * x + B * y + C
// f(x,y) < 0 表示点(x,y)在直线pq的左边(此时可把pq当做向量)
void getLine(P p, P q) {
A = q.y - p.y;
B = p.x - q.x;
C = q.det(p);
} // 直线 A * x + B * y + C = 0 与 直线 pq 的交点
P intersect(P p, P q) {
double u = fabs(A * p.x + B * p.y + C);
double v = fabs(A * q.x + B * q.y + C);
return P((p.x * v + q.x * u) / (u + v), (p.y * v + q.y * u) / (u + v));
} double cal(P p) {
return sgn(A * p.x + B * p.y + C);
} void cut() {
int tmpm = 0;
for (int i = 0; i < m; i++) {
if (cal(b[i]) <= 0) { // 判断是否在多边形内,这里指点在直线A * x + B * y + C = 0的左边或直线上
c[tmpm++] = b[i];
} else { // 虽然不在多边形内,但是可能和多边形内的点组成的直线与多边形产生新的交点
if (cal(b[(i - 1 + m) % m]) < 0) {
c[tmpm++] = intersect(b[(i - 1 + m) % m], b[i]);
}
if (cal(b[i + 1]) < 0) {
c[tmpm++] = intersect(b[i + 1], b[i]);
}
}
}
for (int i = 0; i < tmpm; i++)
b[i] = c[i];
b[tmpm] = c[0];
m = tmpm;
} void solve() {
tri[3] = tri[0];
rec[4] = rec[0];
memcpy(b, rec, sizeof rec);
m = 4;
for(int i = 0; i < 3; i++) {
getLine(tri[i], tri[i + 1]);
cut();
}
} // 求多边形面积 (a[]为多边形的点 n为点的个数)
double polygon_area(P *a, int n) {
a[n] = a[0];
double area = 0;
for(int i = 0; i < n; i++) {
area += a[i].det(a[i + 1]);
}
return fabs(area) / 2;
} int main() {
double x1, y1, x2, y2, x3, y3, x4, y4;
while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4)) {
tri[0] = P(x1, y1);
tri[1] = P(x2, y1);
tri[2] = P(x1, y2);
init();
rec[0] = P(x3, y3);
rec[1] = P(x4, y3);
rec[2] = P(x4, y4);
rec[3] = P(x3, y4);
solve();
printf("%.8f\n", polygon_area(b, m));
}
return 0;
}

csu1812的更多相关文章

  1. 【CSU1812】三角形和矩形 【半平面交】

    检验半平面交的板子. #include <stdio.h> #include <bits/stdc++.h> using namespace std; #define gg p ...

  2. 2017年暑假ACM集训日志

    20170710: hdu1074,hdu1087,hdu1114,hdu1159,hdu1160,hdu1171,hdu1176,hdu1010,hdu1203 20170711: hdu1231, ...

随机推荐

  1. DOS程序员手册(二)

    2.6存储设备     随着DOS的升级,磁盘存储容量也有了很大扩充.表2.4介绍了软盘容量的增加以     及所支持驱动器型号的数量.                                 ...

  2. js对象使用

    以下是js对象使用的两种方式 <script type="text/javascript"> var people = function () { } //方法1 pe ...

  3. uiautomator+cucumber实现移动app自动化测试

    前提 由于公司业务要求,所以自动化测试要达到以下几点: 跨应用的测试 测试用例可读性强 测试报告可读性强 对失败的用例有截图保存并在报告中体现 基于以上几点,在对自动化测试框架选型的时候就选择了uia ...

  4. [译]12-spring依赖注入

    每个java应用程序都是由多个类协作才最终生成了终端用户所使用的系统.当编写复杂java应用程序的时,类之间应尽 可能保持独立,因为这样更容易做到代码的重用,也有利于单元测试的开展.spring的依赖 ...

  5. Python全栈工程师 (exercises)

    # 1:给定一个数,判断他是正数,负数,还是0 a = int(input("请输入一该个整数")) if a == 0: print(a, "是0") eli ...

  6. 1064 Complete Binary Search Tree (30 分)(二叉查找树)

    中序遍历建树 #include<bits/stdc++.h> using namespace std; ; int s[N]; int n; int tree[N]; int cnt; v ...

  7. 课时40:类与对象:一些相关的BIF

    目录: 一.一些相关的BIF 二..课时40课后习题及答案 ********************** 一.一些相关的BIF ********************** 1.issubclass( ...

  8. PhpStorm快捷键设置/个性化设置,如何多项目共存?如何更换主题?

    #常用快捷键  设置快捷键:File -> Settings -> IDE Settings -> Keymap -> 选择“Eclipse” -> 然后“Copy”一份 ...

  9. iPhone新建项目不能全屏

    上个周做项目的时候,发现新建了一个项目不能全屏.伤透了我的脑筋,然后又请教了团队里其他两个大牛帮我搞定了这个问题. 虽然是搞定了,但也看的出大牛也是云里雾里.歪打正着解决的. 今天又想新做个项目,这个 ...

  10. js文字跳动效果

    /*! * chaffle v1.0.0 * * Licensed under MIT * Copyright 2013-2014 blivesta * http://blivesta.com */ ...