利用Python求阴影部分的面积实例代码


Posted in Python onDecember 05, 2018

一、前言说明

今天看到微信群里一道六年级数学题,如下图,求阴影部分面积

利用Python求阴影部分的面积实例代码

看起来似乎并不是很难,可是博主添加各种辅助线,写各种方法都没出来,不得已而改用写Python代码来求面积了

二、思路介绍

1.用Python将上图画在坐标轴上,主要是斜线函数和半圆函数

利用Python求阴影部分的面积实例代码

2.均匀的在长方形上面洒满豆子(假设是豆子),求阴影部分豆子占比*总面积

利用Python求阴影部分的面积实例代码

三、源码设计

1.做图源码

import matplotlib.pyplot as plt
import numpy as np


def init():
 plt.xlabel('X')
 plt.ylabel('Y')

 fig = plt.gcf()
 fig.set_facecolor('lightyellow')
 fig.set_edgecolor("black")

 ax = plt.gca()
 ax.patch.set_facecolor("lightgray") # 设置ax区域背景颜色    
 ax.patch.set_alpha(0.1) # 设置ax区域背景颜色透明度 
 ax.spines['right'].set_color('none')
 ax.spines['top'].set_color('none')
 ax.xaxis.set_ticks_position('bottom')
 ax.yaxis.set_ticks_position('left')
 ax.spines['bottom'].set_position(('data', 0))
 ax.spines['left'].set_position(('data', 0))


# 原下半函数
def f1(px, r, a, b):
 return b - np.sqrt(r**2 - (px - a)**2)


# 斜线函数
def f2(px, m, n):
 return px*n/m


# 斜线函数2
def f3(px, m, n):
 return n-1*px*n/m


if __name__ == '__main__':
 r = 4 # 圆半径
 m = 8 # 宽
 n = 4 # 高
 a, b = (4, 4) # 圆心坐标
 init()

 x = np.linspace(0, m, 100*m)
 y = np.linspace(0, n, 100*n)

 # 半圆形
 y1 = f1(x, r, a, b)
 plt.plot(x, y1)
 # 矩形横线
 plt.plot((x.min(), x.max()), (y.min(), y.min()), 'g')
 plt.plot((x.min(), x.max()), (y.max(), y.max()), 'g')
 plt.plot((x.max(), x.max()), (y.max()+2, y.max()+2), 'g') # 画点(8,6)避免图形变形
 # 矩形纵向
 plt.plot((x.min(), x.min()), (y.min(), y.max()), 'g')
 plt.plot((x.max(), x.max()), (y.min(), y.max()), 'g')
 # 斜线方法
 y2 = f2(x, m, n)
 plt.plot(x, y2, 'purple')

 # 阴影部分填充
 xf = x[np.where(x <= 0.5*x.max())]
 plt.fill_between(xf, y.min(), f1(xf, r, a, b), where=f1(xf, r, a, b) <= f2(xf, m, n),
      facecolor='y', interpolate=True)
 plt.fill_between(xf, y.min(), f2(xf, m, n), where=f1(xf, r, a, b) > f2(xf, m, n),
      facecolor='y', interpolate=True)
 # 半圆填充
 plt.fill_between(x, y1, y.max(), facecolor='r', alpha=0.25)
 plt.show()

Draw.py

2.计算源码,其中side是要不要计算图形边框上的点,理论上side只能为True;t设置越大运行时间越长也越精准

import numpy as np


def f1(px, r, a, b):
 return b - np.sqrt(r**2 - (px - a)**2)


def f2(px, m, n):
 return px*n/m


if __name__ == '__main__':
 r = 4 # 圆半径
 m = 8 # 宽
 n = 4 # 高
 a, b = (4, 4) # 圆心坐标
 t = 100 # 精度

 xs = np.linspace(0, m, 2*t*m)
 ys = np.linspace(0, n, t*n)

 # 半圆形
 y1 = f1(xs, r, a, b)
 # 斜线
 y2 = f2(xs, m, n)

 numin = 0
 numtotel = 0
 side = True # 是否计算边框
 for x in xs:
  for y in ys:
   if not side:
    if (x <= 0) | (x >= 8) | (y <= 0) | (y >= 4):
     continue
   numtotel += 1
   if x >= 4:
    continue
   y1 = f1(x, r, a, b)
   y2 = f2(x, m, n)
   if y1 - y2 >= 0:
    if y2 - y > 0:
     numin += 1
    if (y2 - y == 0) and side:
     numin += 1
   elif y2 - y1 > 0:
    if y1 - y > 0:
     numin += 1
    if (y2 - y == 0) and side:
     numin += 1

 print(32*numin/numtotel)

calc.py

四、最后小结

1.此种算法t为100时,阴影面积为1.268;t为1000时,阴影面积为1.253,已经非常接近正确答案(正确答案1.252)

2.举一反三,类似于这种不规则的面积,只要可以写出来函数,就可以求解面积.

2.下面有三种求解方法,第三种表示比大学高数还难看懂,你们呢?

利用Python求阴影部分的面积实例代码

利用Python求阴影部分的面积实例代码

利用Python求阴影部分的面积实例代码

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
在Python中用has_key()方法查找键是否存在的教程
May 21 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
python使用代理ip访问网站的实例
May 07 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
使用Python的toolz库开始函数式编程的方法
Nov 15 Python
python实现多张图片拼接成大图
Jan 15 Python
Python 脚本的三种执行方式小结
Dec 21 Python
python使用ctypes调用扩展模块的实例方法
Jan 28 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
在python image 中实现安装中文字体
May 16 Python
记录模型训练时loss值的变化情况
Jun 16 Python
python 管理系统实现mysql交互的示例代码
Dec 06 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 #Python
python存储16bit和32bit图像的实例
Dec 05 #Python
Python随机生成身份证号码及校验功能
Dec 04 #Python
python 从文件夹抽取图片另存的方法
Dec 04 #Python
使用Python实现微信提醒备忘录功能
Dec 04 #Python
flask-restful使用总结
Dec 04 #Python
Python读取YUV文件,并显示的方法
Dec 04 #Python
You might like
基于PHP+MySQL的聊天室设计
2006/10/09 PHP
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
表单元素事件 (Form Element Events)
2009/07/17 Javascript
javascript中this做事件参数相关问题解答
2013/03/17 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
python爬虫之自制英汉字典
2019/06/24 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
Python求凸包及多边形面积教程
2020/04/12 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
Python如何重新加载模块
2020/07/29 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
艺术爱好者的自我评价分享
2013/10/08 职场文书
会议邀请书范文
2014/02/02 职场文书
合作意向书格式及范文
2014/03/31 职场文书
2015年元旦活动总结
2014/05/09 职场文书
消防安全宣传标语
2014/06/07 职场文书
小学英语复习计划
2015/01/19 职场文书