鱼C论坛

 找回密码
 立即注册
查看: 3608|回复: 7

[已解决]计算n边形的面积

[复制链接]
发表于 2022-11-14 13:29:28 | 显示全部楼层 |阅读模式
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个三角形,再求这些三角形总面积之和

最佳答案
2022-11-14 13:29:29
本帖最后由 柿子饼同学 于 2022-11-14 21:52 编辑

其实 , 这题给了所有点的坐标 , 就可以用鞋带定理
这样就简单了
https://www.bilibili.com/video/BV1M5411U7SB/?share_source=copy_web&vd_source=a9cc3d08b88ba606a55323168cb1deb0
而您的方法可能不适用于凹的图形
屏幕截图 2022-11-14 133825.jpg

最佳答案

查看完整内容

其实 , 这题给了所有点的坐标 , 就可以用鞋带定理的 这样就简单了 https://www.bilibili.com/video/BV1M5411U7SB/?share_source=copy_web&vd_source=a9cc3d08b88ba606a55323168cb1deb0 而您的方法可能不适用于凹的图形
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-14 13:29:29 | 显示全部楼层    本楼为最佳答案   
本帖最后由 柿子饼同学 于 2022-11-14 21:52 编辑

其实 , 这题给了所有点的坐标 , 就可以用鞋带定理
这样就简单了
https://www.bilibili.com/video/BV1M5411U7SB/?share_source=copy_web&vd_source=a9cc3d08b88ba606a55323168cb1deb0
而您的方法可能不适用于凹的图形
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-14 16:03:32 | 显示全部楼层
我看不懂代码(可能是我数学不好

请允许我在没有看完代码的情况下问一个问题:如果出现下面这种情况的多边形,这个程序有没有可能会出 bug?
屏幕截图 2022-11-14 145026.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-14 16:28:05 | 显示全部楼层
tommyyu 发表于 2022-11-14 16:03
我看不懂代码(可能是我数学不好)

请允许我在没有看完代码的情况下问一个问题:如果出现下面 ...

那这样呢
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-15 22:34:39 | 显示全部楼层
楼主说的应该是正多边形
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-15 22:54:08 | 显示全部楼层
三体—夜航星 发表于 2022-11-15 22:34
楼主说的应该是正多边形

不是正多边形呢,但是n边形的边是水平或者是垂直的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-15 22:57:34 | 显示全部楼层
tommyyu 发表于 2022-11-14 16:03
我看不懂代码(可能是我数学不好)

请允许我在没有看完代码的情况下问一个问题:如果出现下面 ...

如果图形是这个、那就会出现bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-15 23:02:08 | 显示全部楼层

你们脑洞可以哦、
我都没想到这么复杂的呢
谢谢你们、我的思维被打开了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 10:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表