用“平面两点距离”求三角形面积,再用“三角形面积”多边形面积

156 篇文章 4 订阅

不小于 3 边的多边形,都可以任一顶点发出的边切分为 n - 2 个三角形。


【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


用“三角形面积”求任意大于 3+2 边的多边形
用“两点距离”求三角形面积
(都可以任一顶点发出的边切分为 n-2 个三角形)


本文质量分:

91
本文地址: https://blog.csdn.net/m0_57158496/article/details/130694467

CSDN质量分查询入口:http://www.csdn.net/qc


目 录


◆  用“平面两点距离”求多边形面积


0、题目描述


  建立一个自定义模块 myFuncs.py 在里面编写一个求两点距离的函数 distance ,然后再在这个文件中利用这个 distance 函数编写一个求三角形面积的函数 TriangleArea 。
  在 exec.py 中导入 myFuncs 模块,输入或赋值五边形的五点坐标,利用 TriangleArea 函数求出并打印五边形面积。

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

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

而公式里的 p 为半周长:p = (a+b+c)/2



回页目录

1、求平面两点距离

1.1 两点距离公式


在这里插入图片描述

1.2 Python 代码


def distance(p1, p2):
    ''' 据点坐标求平面两点距离 '''
    return sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)

  函数只有一条语句,也可以写成单行匿名函数 lambda ——


distance = lambda p1, p2: sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)

  • 代码运行效果截屏图片在这里插入图片描述
    在这里插入图片描述


回页目录

2、用“平面两点距离”求三角形面积

2.1 三角形面积公式——海伦公式

  三角形面积公式,“海伦公式”题目描述中已经给出。

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

而公式里的 p 为半周长:p = (a+b+c)/2

2.2 Python 代码


def trianglearea(*p: tuple) -> float:
    ''' 据点坐标求三角形面积 '''

    if len(p) != 3:
        input(f"\n{'坐标参数错误!':^43}\n{'':~^50}\n{'任意键继续……':^45}")
        return

    p1, p2, p3 = p
    a, b, c = distance(p1, p2), distance(p1, p3), distance(p3, p2) # 调用两点距离函数求三角形三边。
    print('\n三角形边长:', a, b, c)
    p = sum([a, b, c])/2
    
    return sqrt(p * (p-a) * (p-b) * (p-c))

  • 代码运行效果截屏图片
    在这里插入图片描述
    在这里插入图片描述


回页目录

3、用“三角形面积”求五边形面积

3.0 解题思路

在这里插入图片描述
  如上图,五边形可以由一个顶点引出到另外顶点的线段切分成三个三角形,三个三角形面积总和即是五边形的面积。

3.1 Python 代码

exec.py 文件内容——
在这里插入图片描述

#!/sur/bin/nve python
# coding: utf-8
import myFuncs as myfun # 载入自定义模块 myFuncs.py 。

p1 = (-2, 7)
p2 = (4.9, 6.8)
p3 = (7, 2.5)
p4 = (2, -3)
p5 = (-3, 0)

p = '\n'.join(map(str, [p1, p2, p3, p4, p5])) # 格式化输出五边形顶点座标。
s = sum([myfun.trianglearea(p1, p2, p3), myfun.trianglearea(p1, p3, p4), myfun.trianglearea(p1, p4, p5)]) # 计算五边形切分的三个三角形面积总和。

print(f"\n\n五边形顶点坐标:\n{p}\nS[p1~p5] = {s:.2f}\n")

3.2 代码运行效果截屏图片

在这里插入图片描述



回页目录

3、用“三角形面积”求多边形面积

4.0 解题思路

  不小于 3 边的 n 边形,都可以任一顶点发出的边切分为 n - 2 个三角形。

4.1 Python 代码


def polygon_area(*p) -> float:
    ''' 据顶点坐标求多边形面积 '''
    n = len(p)

    if len(p) < 3:
        p = ' ' + ', '.join(map(lambda x: str(x), p)) + ' '
        print(f"\n{p:~^50}\n\n{f'您给出 {n} 个点,多边形不能少于三个顶点!':^32}\n\n{'':~^50}\n")
        return

    index_chars = '一二三四五六七八九十ⅪⅫ'
    char = index_chars[n-1] if n < 13 else n # 多边形边数小于13,替换成中文字符打印。
    print(f"\n{f' {char}边形可以分割成 {n-2} 个三角形 ':~^38}")
    s = 0 # 多边形面积初值。
    
    for i in range(3, n+1):
        stri = trianglearea(p[0], p[i-2], p[i-1])
        print(f"{'面积:':>9}{stri}")
        s += stri

    p = '\n'.join(map(lambda x: f"{str(x):>22}", p)) # 格式化输出五边形顶点座标。
    print(f"\n{char}边形顶点坐标:\n{p}\n")

    return s

4.2 代码运行效果截屏图片

  • 用“求 n 边形面积”函数求三角形面积
    在这里插入图片描述

  • 求四边形面积
    在这里插入图片描述

  • 求五边形面积
    在这里插入图片描述

  • 求六边形面积
    在这里插入图片描述

  • 求七边形面积
    在这里插入图片描述

  • 求八边形面积
    在这里插入图片描述

  • 也可以设定小数位数的在这里插入图片描述

4.3 我的代码优化与缺陷

  • 优化

  多边形有好多顶点,就有好多条边。从 n 个顶点的一个顶点连到下一个顶点,最后回到起点围成的多边形就是 n 边形。我用了一个“中文字典”,更替了“ N 边形面积”中的 N ,让显示更好看。 Python 代码——


    index_chars = '一二三四五六七八九十ⅪⅫ'
    char = index_chars[n-1] if n < 13 else n # 多边形边数小于13,替换成中文字符打印。
    print(f"\n{f' {char}边形可以分割成 {n-2} 个三角形 ':~^38}")


  • 缺陷

  我的代码,设置了“检查参数顶点个数不符”的语句,让代码更“暖心”。 Python 代码——

a. 三角形面积函数


    if n != 3:
        p = ' ' + ', '.join(map(lambda x: str(x), p)) + ' '
        print(f"\n{p:~^50}\n\n{f'您给出 {n} 个点,三角形有且只有三个顶点!':^32}\n\n{'':~^50}\n")
        return

在这里插入图片描述
在这里插入图片描述

b. 多边形面积函数


    if len(p) < 3:
        p = ' ' + ', '.join(map(lambda x: str(x), p)) + ' '
        print(f"\n{p:~^50}\n\n{f'您给出 {n} 个点,多边形不能少于三个顶点!':^32}\n\n{'':~^50}\n")
        return

在这里插入图片描述

  我的代码,只可以检查参数顶点坐标的个数不符,但不会检查参数顶点坐标的“有效”性。所以,当且仅当参数顶点坐标有效,才可以输出正确的多边形面积。



回页目录

5、完整源码

(源码较长,点此跳过源码)

  • myFuncs.py 文件内容——
#!/sur/bin/nve python
# coding: utf-8
from math import sqrt # 载入开平方方法 math.sqrt()


'''

filename = 'myFuncs.py'

'''

def distance(p1, p2):
    ''' 据点坐标求平面两点距离 '''
    return sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)


distance = lambda p1, p2: sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)



def trianglearea(*p: tuple) -> float:
    ''' 据点坐标求三角形面积 '''
    n = len(p)

    if n != 3:
        p = ' ' + ', '.join(map(lambda x: str(x), p)) + ' '
        print(f"\n{p:~^50}\n\n{f'您给出 {n} 个点,三角形有且只有三个顶点!':^32}\n\n{'':~^50}\n")
        return

    p1, p2, p3 = p
    a, b, c = distance(p1, p2), distance(p1, p3), distance(p3, p2) # 调用两点距离函数求三角形三边。
    print(f"\n三角形边长:{a:.2f}, {b:.2f}, {c:.2f}")
    p = sum([a, b, c])/2
    
    return sqrt(p * (p-a) * (p-b) * (p-c))


def polygon_area(*p) -> float:
    ''' 据顶点坐标求多边形面积 '''
    n = len(p)

    if len(p) < 3:
        p = ' ' + ', '.join(map(lambda x: str(x), p)) + ' '
        print(f"\n{p:~^50}\n\n{f'您给出 {n} 个点,多边形不能少于三个顶点!':^32}\n\n{'':~^50}\n")
        return

    index_chars = '一二三四五六七八九十ⅪⅫ'
    char = index_chars[n-1] if n < 13 else n # 多边形边数小于13,替换成中文字符打印。
    print(f"\n{f' {char}边形可以分割成 {n-2} 个三角形 ':~^38}")
    s = 0 # 多边形面积初值。
    
    for i in range(3, n+1):
        stri = trianglearea(p[0], p[i-2], p[i-1])
        print(f"{'面积:':>9}{stri:.2f}")
        s += stri

    p = '\n'.join(map(lambda x: f"{str(x):>22}", p)) # 格式化输出五边形顶点座标。
    print(f"\n{char}边形顶点坐标:\n{p}\n")

    return s


if __name__ == '__main__':
    '''p1, p2 = (0, 0), (5, 0)
    p1, p2 = (3, 0), (0, 4)
    print(f"\n两点距离:({p1}, {p2}] = {distance(p1, p2):.2f}")
    p = (0, 0), (0, 3), (4, 0)
    p = (2, 5), (-3, 3), (4, 8)
    print(f"\nS△[{p}] = {trianglearea(*p):.2f}\n")'''
    p = (0, 0), (0, 3)
    '''p = (0, 0), (0, 3), (4, 0)
    p = (-5, -2), (-5, 2), (8, -2), (8, 2)
    p = (0, -6), (-4, 2), (0, 3), (3, 3), (4, 0)
    p = (-3, 7), (-6, -9), (0, -6), (-6, 10), (8, 8), (18, 4)
    p = (-3, 7), (-2, 13), (-6, -9), (0, -6), (-6, 10), (8, 8), (18, 4)
    p = (0, -6), (-6, -6), (-6, 0), (-6, 6),  (6, 0), (6, 6), (6, 0), (6, -6)'''
    s = polygon_area(*p)
    s = f' 面积:{s:.2f}' if s else f' 面积:{s} '
    print(f"{s:~^47}\n")
    s = trianglearea(*p)
    s = f"{s:.2f}" if s else s
    print(f"{'面积:':>9}{s}\n")

  • exec.py 文件内容——
#!/sur/bin/nve python
# coding: utf-8
import myFuncs as myfun # 载入自定义模块 myFuncs.py 。

p1 = (-2, 7)
p2 = (4.9, 6.8)
p3 = (7, 2.5)
p4 = (2, -3)
p5 = (-3, 0)

p = '\n'.join(map(str, [p1, p2, p3, p4, p5])) # 格式化输出五边形顶点座标。
s = sum([myfun.trianglearea(p1, p2, p3), myfun.trianglearea(p1, p3, p4), myfun.trianglearea(p1, p4, p5)]) # 计算五边形切分的三个三角形面积总和。

print(f"\n\n五边形顶点坐标:\n{p}\nS[p1~p5] = {s:.2f}\n")


回页首

上一篇:  用 Python 写抽奖程序(一共 10 人参与抽奖,四人中奖,其中一人固定不变)
下一篇: 

我的HOT博:

  本次共计收集 204 篇博文笔记信息,总阅读量 33.27w,平均阅读量 1630。已生成 21 篇阅读量不小于 3000 的博文笔记索引链接。数据采集于 2023-05-14 05:38:11 完成,用时 4 分 7.18 秒。


  1. 让QQ群昵称色变的神奇代码
    ( 54164 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122566500
    点赞:24   踩 :0  收藏:79  打赏:0  评论:17
    本篇博文笔记于 2022-01-18 19:15:08 首发,最晚于 2022-01-20 07:56:47 修改。
  2. ChatGPT国内镜像站初体验:聊天、Python代码生成等
    ( 50877 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/129035387
    点赞:123   踩 :0  收藏:788  打赏:0  评论:75
    本篇博文笔记于 2023-02-14 23:46:33 首发,最晚于 2023-03-22 00:03:44 修改。
  3. pandas 数据类型之 DataFrame
    ( 8197 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124525814
    点赞:6   踩 :0  收藏:25  打赏:0  评论:0
    本篇博文笔记于 2022-05-01 13:20:17 首发,最晚于 2022-05-08 08:46:13 修改。
  4. 罗马数字转换器|罗马数字生成器
    ( 6422 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    点赞:0   踩 :0  收藏:1  打赏:0  评论:0
    本篇博文笔记于 2022-01-19 23:26:42 首发,最晚于 2022-01-21 18:37:46 修改。
  5. Python字符串居中显示
    ( 6195 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    点赞:1   踩 :0  收藏:5  打赏:0  评论:1
    本篇博文笔记于 2021-12-26 23:35:29 发布。
  6. 个人信息提取(字符串)
    ( 5649 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124244618
    点赞:1   踩 :0  收藏:8  打赏:0  评论:0
    本篇博文笔记于 2022-04-18 11:07:12 首发,最晚于 2022-04-20 13:17:54 修改。
  7. 斐波那契数列的递归实现和for实现
    ( 5303 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122355295
    点赞:4   踩 :0  收藏:2  打赏:0  评论:8
    本篇博文笔记于 2022-01-06 23:27:40 发布。
  8. 练习:字符串统计(坑:f‘string‘报错)
    ( 4885 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121723096
    点赞:0   踩 :0  收藏:1  打赏:0  评论:0
    本篇博文笔记于 2021-12-04 22:54:29 发布。
  9. 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
    ( 4612 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121645399
    点赞:14   踩 :0  收藏:42  打赏:0  评论:0
    本篇博文笔记于 2021-11-30 23:43:17 发布。
  10. 回车符、换行符和回车换行符
    ( 4397 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/123109488
    点赞:0   踩 :0  收藏:2  打赏:0  评论:0
    本篇博文笔记于 2022-02-24 13:10:02 首发,最晚于 2022-02-25 20:07:40 修改。
  11. python清屏
    ( 4351 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/120762101
    点赞:0   踩 :0  收藏:5  打赏:0  评论:0
    本篇博文笔记于 2021-10-14 13:47:21 发布。
  12. Python列表(list)反序(降序)的7种实现方式
    ( 3987 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/128271700
    点赞:4   踩 :0  收藏:14  打赏:0  评论:8
    本篇博文笔记于 2022-12-11 23:54:15 首发,最晚于 2023-03-20 18:13:55 修改。
  13. 密码强度检测器
    ( 3903 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121739694
    点赞:1   踩 :0  收藏:4  打赏:0  评论:0
    本篇博文笔记于 2021-12-06 09:08:25 首发,最晚于 2022-11-27 09:39:39 修改。
  14. 罗马数字转换器(用罗马数字构造元素的值取模实现)
    ( 3824 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122608526
    点赞:0   踩 :0  收藏:0  打赏:0  评论:0
    本篇博文笔记于 2022-01-20 19:38:12 首发,最晚于 2022-01-21 18:32:02 修改。
  15. 练习:生成100个随机正整数
    ( 3668 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/122558220
    点赞:1   踩 :0  收藏:4  打赏:0  评论:0
    本篇博文笔记于 2022-01-18 13:31:36 首发,最晚于 2022-01-20 07:58:12 修改。
  16. 练习:班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)
    ( 3563 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124424935
    点赞:1   踩 :0  收藏:2  打赏:0  评论:0
    本篇博文笔记于 2022-04-26 12:46:25 首发,最晚于 2022-04-27 21:22:07 修改。
  17. 我的 Python.color() (Python 色彩打印控制)
    ( 3427 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/123194259
    点赞:2   踩 :0  收藏:7  打赏:0  评论:0
    本篇博文笔记于 2022-02-28 22:46:21 首发,最晚于 2022-03-03 10:30:03 修改。
  18. 练习:仿真模拟福彩双色球——中500w巨奖到底有多难?跑跑代码就晓得了。
    ( 3237 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/125415626
    点赞:3   踩 :0  收藏:4  打赏:0  评论:3
    本篇博文笔记于 2022-06-22 19:54:20 首发,最晚于 2022-06-23 22:41:33 修改。
  19. 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )
    ( 3097 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/124539589
    点赞:3   踩 :0  收藏:2  打赏:0  评论:3
    本篇博文笔记于 2022-05-02 13:02:39 首发,最晚于 2022-05-21 06:10:42 修改。
  20. Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义
    ( 3072 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/123087606
    点赞:0   踩 :0  收藏:4  打赏:0  评论:3
    本篇博文笔记于 2022-02-23 13:08:07 首发,最晚于 2022-04-04 23:52:38 修改。
  21. 练习:求列表(整数列表)平衡点
    ( 3030 阅读)
    博文地址:https://blog.csdn.net/m0_57158496/article/details/121737612
    点赞:0   踩 :0  收藏:0  打赏:0  评论:0
    本篇博文笔记于 2021-12-05 23:28:10 发布。
推荐条件 阅读量突破三千
(更多热博,请点击蓝色文字跳转翻阅)

回页首


老齐漫画头像

精品文章:

来源:老齐教室


回页首

Python 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦幻精灵_cq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值