平面几何-python

三角形面积:

题目描述

平面直角坐标系中有一个三角形, 请你求出它的面积。

输入描述

第一行输入一个 TT ,代表测试数据量

每组测试数据输入有三行,每行一个实数坐标 (x, y)(x,y) 代表三角形三个顶点。

1≤T≤10^3,−10^5≤x,y≤10^5

输出描述

输出一个实数表示三角形面积。结果保留2位小数,误差不超过 10^{-2}10−2

输入输出样例

示例 1

输入

2
0 1
1 0
1 1
0 0
1 1
2 2

输出

0.50
0.00

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

思路:

 我们这里介绍一个计算三角形面积的公式,海伦公式介绍

公式表述

海伦公式: 

假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:

                                                S=√p(p-a)(p-b)(p-c)

而公式里的p为半周长(周长的一半):

                                                 p=(a+b+c)/2

题目中给了我们三角形的三个点的坐标,我们可以通过勾股定理计算各个边的长度,在带入海伦公式计算即可

由于本题要求高精度,python浮点数是64位的,存在误差,大致理解思路即可

 代码:

from math import*

def Dist(x1,x2,y1,y2):
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

t = int(input())
for i in range(t):
    x1,y1=map(float,input().split())
    x2,y2=map(float,input().split())
    x3,y3=map(float,input().split())
    a=Dist(x1, x2, y1, y2)
    b=Dist(x3, x2, y3, y2)
    c=Dist(x1, x3, y1, y3)
    p=(a+b+c)/2
    s=sqrt(p*(p-a)*(p-b)*(p-c))
    print("{:.2f}".format(s))

平面切分

【问题描述】
平面上有 N 条直线,其中第 i 条直线是 y = Ai · x + Bi。
请计算这些直线将平面分成了几个部分。
【输入格式】
第一行包含一个整数 N。
以下 N 行,每行包含两个整数 Ai, Bi。
【输出格式】
一个整数代表答案。
【样例输入】
3
1 1
2 2
3 3
【样例输出】
6
【评测用例规模与约定】
对于 50% 的评测用例,1 ≤ N ≤ 4, 10 ≤ Ai, Bi ≤ 10。
对于所有评测用例,1 ≤ N ≤ 1000, 100000 ≤ Ai, Bi ≤ 100000。

 思路

我们先读取数据n,再将每组线存入元组列表当中,使用set()来对重复的线段进行去重。

之后遍历所有的线段,并将当前线段与它之前的线段的交点找出来,存到set()创建的无序不重复元素集p中,确保每个交点都是不同的。

我们为什么要寻找线与线之间的交点呢?因为我们发现,每增加一条线,如果它和之前的线有n个交点,那么总的分割的区域就要增加n+1个。这也体现在我们的代码中

代码 

n=eval(input())
line=[tuple(map(int,input().split())) for i in range(n)]
s=set(line)
line=list(s)
ans=2
for i in range(1,len(line)):
    a1,b1=line[i]
    pos=set()
    for j in range(i):
        a2,b2=line[j]
        if a1==a2:
            continue
        x=(b1-b2)/(a1-a2)
        y=a1*x+b1
        pos.add((x,y))
    ans+=len(pos)+1
print(ans)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓宜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值