列表

详情


NC220476. 线段的交

描述

给出两条线段,如果有相交求四点围成的四边形面积,否则输出零

输入描述

输入共四行,每行给出一个坐标,前两行代表第一条线段,后两行代表第二条线段
每行座标都包含了两个实数,所有的座标皆满足 ,数值固定精准到小数点下第三位。 
输入保证,四个座标一定两两相异,不会有任何一个坐标在另两个坐标的连线上。

输出描述

在一行中输出一个非负实数表示面积,输出的答案与正确答案误差在  内皆视为正确

示例1

输入:

2.000 0.000
-1.000 0.000
0.000 1.000
0.000 -1.000

输出:

3.0000000

示例2

输入:

24.152 31.428
13.505 17.779
14.240 32.285
22.130 12.326

输出:

160.0970415000

示例3

输入:

1.500 1.500
1.500 -1.500
-1.500 -1.500
-1.500 1.500

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.9) 解法, 执行用时: 45ms, 内存消耗: 6924K, 提交时间: 2021-04-28 21:06:01

def cal(x1, y1, x2, y2, x3, y3):
    return x1 * y2 - x2 * y1 + x2 * y3 - x3 * y2 + x3 * y1 - x1 * y3


if __name__ == '__main__':
    x1, y1 = map(float, input().split(' '))
    x2, y2 = map(float, input().split(' '))
    x3, y3 = map(float, input().split(' '))
    x4, y4 = map(float, input().split(' '))
    # print(x1, y1, x2, y2, x3, y3, x4, y4)
    t3 = cal(x1, y1, x2, y2, x3, y3)
    t4 = cal(x1, y1, x2, y2, x4, y4)
    t1 = cal(x3, y3, x4, y4, x1, y1)
    t2 = cal(x3, y3, x4, y4, x2, y2)
    if t1 * t2 < 0 and t3 * t4 < 0:
        print((abs(t1) + abs(t2)) / 2)
    else:
        print(0)

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 508K, 提交时间: 2022-08-03 21:42:05

#include<bits/stdc++.h>
using namespace std;
 double x1,x2,y111,y2,x11,x22,y11,y22,l,l1;
int main()
{
    cin>>x1>>y111>>x11>>y11>>x2>>y2>>x22>>y22;
    if
((x1*y11+x2*y111+x11*y2-x1*y2-x2*y11-x11*y111)*(x1*y11+x22*y111+x11*y22-x1*y22-x22*y11-x11*y111)<=0
&&(x22*y11+x2*y22+x11*y2-x22*y2-x2*y11-x11*y22)*(x1*y2+x22*y111+x2*y22-x1*y22-x22*y2-x2*y111)<=0)
    {
        l=fabs(x1*y11+x2*y111+x11*y2-x1*y2-x2*y11-x11*y111)/2;
        l1=fabs(x1*y11+x22*y111+x11*y22-x1*y22-x22*y11-x11*y111)/2;
        printf("%.8lf",l+l1);
    }
    else cout<<'0';
    return 0;
}

上一题