利用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 opencv之SURF算法示例
Feb 24 Python
python表格存取的方法
Mar 07 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
Python线程之定位与销毁的实现
Feb 17 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
用python中的matplotlib绘制方程图像代码
Nov 21 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
Python 中的pygame安装与配置教程详解
Feb 10 Python
python实现简单的购物程序代码实例
Mar 03 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
Jan 07 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 13 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关联数组的10个操作技巧
2013/01/21 PHP
php析构函数的简单使用说明
2015/08/24 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
JavaScript confirm选择判断
2008/10/18 Javascript
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
简单分析js中的this的原理
2019/08/31 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
举例区分Python中的浅复制与深复制
2015/07/02 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
签约仪式主持词
2014/03/19 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
贷款委托书怎么写
2014/08/02 职场文书
学习计划书怎么写
2014/09/15 职场文书
员工离职证明范本
2015/06/12 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers