|
45鱼币
本帖最后由 无理想的闲鱼 于 2022-11-15 22:56 编辑
题目描述
给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。 多边形被放置在一个 X-Y 的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。
输入描述:
第一行给出多边形的顶点数 n(n≤100) 。接下来的几行每行给出多边形一个顶点的坐标值 X 和 Y (都为整数并且用空格隔开)。顶点按逆时针方向逐个给出。并且多边形的每一个顶点的坐标值 -200≤x,y≤200 。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。
输出描述:
一个整数,表示多边形的面积。
示例
示例1
输入
10
0 0
4 0
4 1
3 1
3 3
2 3
2 2
1 2
1 3
0 3
输出
9
- n = int(input()) #把n边形分成n-1个三角形来计算面积
- S = 0 #面积
- list1 = [] #存放点的坐标
- for j in range(n):
- a = input()
- a = a.split()
- list1.append(a)
- #下面是找中心点
- x_MAX = int(list1[0][0])
- y_MAX = int(list1[0][1])
- x_MIN = int(list1[0][0])
- y_MIN = int(list1[0][1])
- for m in range(1,n):
- if int(list1[m][0]) > x_MAX:
- x_MAX = int(list1[m][0])
- if int(list1[m][0]) < x_MIN:
- x_MIN = int(list1[m][0])
- if int(list1[m][1]) > y_MAX:
- y_MAX = int(list1[m][1])
- if int(list1[m][1]) < y_MIN:
- y_MIN = int(list1[m][1])
- x1 = (x_MAX + x_MIN) / 2
- y1 = (y_MAX + y_MIN) / 2
- for k in range(n-1):
- #起始点算0,到倒数第二的点,如果n是14,n-1是13,循环就是0-12(13个数)
- x2 = int(list1[k][0])
- y2 = int(list1[k][1])
- x3 = int(list1[k+1][0])
- y3 = int(list1[k+1][1])
- if x2 == x3:
- S += ((abs(y3 - y2))*(abs(x2 - x1))) / 2
- if y2 == y3:
- S += ((abs(x3 - x2))*(abs(y2 - y1))) / 2
- #计算最后一个三角形的面积
- x2 = int(list1[0][0])
- y2 = int(list1[0][1])
- x3 = int(list1[n-1][0])
- y3 = int(list1[n-1][1])
- if x2 == x3:
- S += ((abs(y3 - y2))*(abs(x2 - x1))) / 2
- if y2 == y3:
- S += ((abs(x3 - x2))*(abs(y2 - y1))) / 2
- print(S)
复制代码
我不知道自己错在哪里了?
我的想法是找到中点,把n边形分为n-1个三角形,再求这些三角形总面积之和
|
-
最佳答案
查看完整内容
其实 , 这题给了所有点的坐标 , 就可以用鞋带定理的
这样就简单了
https://www.bilibili.com/video/BV1M5411U7SB/?share_source=copy_web&vd_source=a9cc3d08b88ba606a55323168cb1deb0
而您的方法可能不适用于凹的图形
|