博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Intersection of Two Prisms(AOJ 1313)
阅读量:5106 次
发布时间:2019-06-13

本文共 3362 字,大约阅读时间需要 11 分钟。

  • 原题如下:

    Suppose that P1 is an infinite-height prism whose axis is parallel to the z-axis, and P2 is also an infinite-height prism whose axis is parallel to the y-axis. P1 is defined by the polygon C1 which is the cross section of P1 and the xy-plane, and P2is also defined by the polygon C2 which is the cross section of P2 and the xz-plane.

    Figure I.1 shows two cross sections which appear as the first dataset in the sample input, and Figure I.2 shows the relationship between the prisms and their cross sections.

    Figure I.1: Cross sections of Prisms

     

    Figure I.2: Prisms and their cross sections

     

    Figure I.3: Intersection of two prisms

    Figure I.3 shows the intersection of two prisms in Figure I.2, namely, P1 and P2.

    Write a program which calculates the volume of the intersection of two prisms.

    Input

    The input is a sequence of datasets. The number of datasets is less than 200.

    Each dataset is formatted as follows.

    m n

    x11 y11
    x12 y12 
    .
    .
    .
    x1m y1m 
    x21 z21
    x22 z22
    .
    .
    .
    x2n z2n

    m and n are integers (3 ≤ m ≤ 100, 3 ≤ n ≤ 100) which represent the numbers of the vertices of the polygons, C1 and C2, respectively.

    x1iy 1 ix 2j and z 2j are integers between -100 and 100, inclusive. ( x 1iy 1i) and ( x 2j , z 2j) mean the i-th and j-th vertices' positions of C 1 and C 2respectively.

    The sequences of these vertex positions are given in the counterclockwise order either on the xy-plane or the xz-plane as in Figure I.1.

    You may assume that all the polygons are convex, that is, all the interior angles of the polygons are less than 180 degrees. You may also assume that all the polygons are simple, that is, each polygon's boundary does not cross nor touch itself.

    The end of the input is indicated by a line containing two zeros.

    Output

    For each dataset, output the volume of the intersection of the two prisms, P1 and P2, with a decimal representation in a line.

    None of the output values may have an error greater than 0.001. The output should not contain any other extra characters.

    Sample Input

    4 37 23 30 23 14 20 18 14 430 230 122 122 215 230 813 142 88 513 521 721 918 1511 156 106 88 510 125 915 620 1018 123 35 510 310 1020 810 1510 84 4-98 99-99 -9999 -9899 97-99 99-98 -9899 -9996 990 0

    Output for the Sample Input

    4.7083333333333331680.0000000000005491.15000000000070.07600258.4847715655
  • 题解:朴素想法,求出公共部分的凸多面体的顶点坐标,然后再计算其体积。公共部分的凸多面体的顶点都是一个棱柱的侧面与另一个棱柱的侧棱的交点,可以通过O(nm)时间的枚举求得,但因为涉及三维空间的几何运算,实现起来是非常麻烦的。
    事实上,沿x轴对棱柱切片即可:按某个值对侧棱与z轴平行的棱柱P1切片后,就得到了[y1,y2]*(-∞,∞)这样的在z轴方向无限延伸的长方形的横截面,同样的,我们按某个x值对侧棱与y轴平行的棱柱P2切片后,就得到了(-∞,∞)*[z1,z2]这样的在y轴方向无限延伸的长方形的横截面。因此,我们按某个x值对两个棱柱的公共部分切片后,得到的横截面就是长方形[y1,y2]*[z1,z2]。而长方形的面积通过(y2-y1)*(z2-z1)就可以求得,关于x轴对面积求积分就能得到公共部分的体积了。
    首先,枚举出原棱柱底面顶点的所有x坐标并排序,在相邻两个x坐标之间的区间中按x值切片得到的长方形的顶点坐标是关于x的线性函数,所以面积就是关于x的二次函数,其积分很容易计算,虽然可以通过求得表达式后再来计算二次函数的积分,但应用Simpson公式则更为轻松。Simpson公式如下:

    Simpson公式就是在数值积分中用二次函数来近似原函数进行积分而得到的公式,如果原函数本身就是次数不超过二的多项式,那么用Simpson公式就可以得到精确的积分值。利用该公式,无需求出关于x的多项式,而只要计算按区间的端点和中点切片得到的长方形的面积就够了。

  • 代码:
    #include
    #include
    #include
    using namespace std;const int INF=0x3f3f3f3f;const double EPS=1e-10;const int MAX_N=500;int N,M;int X1[MAX_N], Y1[MAX_N], X2[MAX_N], Z2[MAX_N];double max(double x, double y){ if (x>y+EPS) return x; return y;}double min(double x, double y){ if (x
    xs; for (int i=0; i

 

转载于:https://www.cnblogs.com/Ymir-TaoMee/p/9791543.html

你可能感兴趣的文章
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
php_扑克类
查看>>
回调没用,加上iframe提交表单
查看>>
(安卓)一般安卓开始界面 Loding 跳转 实例 ---亲测!
查看>>
Mysql 索引优化 - 1
查看>>
LeetCode(3) || Median of Two Sorted Arrays
查看>>
大话文本检测经典模型:EAST
查看>>
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
Nginx+Keepalived 实现双击热备及负载均衡
查看>>