利用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 相关文章推荐
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 Python
Python获取运行目录与当前脚本目录的方法
Jun 01 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
Python实现的概率分布运算操作示例
Aug 14 Python
Python爬虫框架scrapy实现的文件下载功能示例
Aug 04 Python
python实现扫描局域网指定网段ip的方法
Apr 16 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
python selenium xpath定位操作
Sep 01 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
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
2016/10/08 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
详解python3中的真值测试
2018/08/13 Python
简单了解python单例模式的几种写法
2019/07/01 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
python实现代码统计器
2019/09/19 Python
Tensorflow不支持AVX2指令集的解决方法
2020/02/03 Python
执行Python程序时模块报错问题
2020/03/26 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
幼师求职自荐信范文
2014/01/26 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
老干部座谈会主持词
2015/07/03 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL