本帖最后由 无理想的闲鱼 于 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个三角形,再求这些三角形总面积之和
|