利用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实现二分查找算法实例
May 26 Python
Python实现的RSS阅读器实例
Jul 25 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
numpy:找到指定元素的索引示例
Nov 26 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
Django如何实现防止XSS攻击
Oct 13 Python
python中uuid模块实例浅析
Dec 29 Python
Matplotlib中rcParams使用方法
Jan 05 Python
python re模块和正则表达式
Mar 24 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教程-第一天
2007/03/18 PHP
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
php获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
js 提交和设置表单的值
2008/12/19 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
python matplotlib画图实例代码分享
2017/12/27 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
Python 装饰器原理、定义与用法详解
2019/12/07 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
python 线程的五个状态
2020/09/22 Python
python 获取字典键值对的实现
2020/11/12 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
公司新员工的演讲稿注意事项
2014/01/01 职场文书
百年校庆节目主持词
2014/03/27 职场文书
品牌推广策划方案
2014/05/28 职场文书
公安派出所所长四风问题个人对照检查材料
2014/10/04 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书