利用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控制台显示时钟的示例
Feb 24 Python
python多进程共享变量
Apr 06 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
May 11 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
Python实现聚类K-means算法详解
Jul 15 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 for 循环语句使用方法详细说明
2010/05/09 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
PHP 文件上传限制问题
2019/09/01 PHP
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
Js apply方法详解
2017/02/16 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
20招让你的Python飞起来!
2016/09/27 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python构建网页爬虫原理分析
2017/12/19 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
想学画画?python满足你!
2020/12/24 Python
培训楼经理岗位责任制
2014/02/10 职场文书
求职教师自荐书
2014/06/19 职场文书
医院党员公开承诺书
2014/08/30 职场文书
银行先进个人总结
2015/02/15 职场文书
护士求职自荐信范文
2015/03/04 职场文书
少年犯观后感
2015/06/11 职场文书