利用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 相关文章推荐
9种python web 程序的部署方式小结
Jun 30 Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
Python实现字符串逆序输出功能示例
Jun 24 Python
对numpy中轴与维度的理解
Apr 18 Python
python接口自动化测试之接口数据依赖的实现方法
Apr 26 Python
pyQT5 实现窗体之间传值的示例
Jun 20 Python
Python安装selenium包详细过程
Jul 23 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
keras中模型训练class_weight,sample_weight区别说明
May 23 Python
浅谈Python协程asyncio
Jun 20 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接口中interface存在的意义
2013/06/27 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
Python 模块EasyGui详细介绍
2017/02/19 Python
python生成式的send()方法(详解)
2017/05/08 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
python看某个模块的版本方法
2018/10/16 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
关于numpy数组轴的使用详解
2019/12/05 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
python中pyplot基础图标函数整理
2020/11/10 Python
Python用Jira库来操作Jira
2020/12/28 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
学术会议欢迎词
2014/01/09 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
教师求职自荐信
2015/03/26 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
春节晚会开场白
2015/05/29 职场文书
红色革命电影观后感
2015/06/18 职场文书
教师旷工检讨书
2015/08/15 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
Python列表的索引与切片
2022/04/07 Python