利用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实现的二维码生成小软件
Jul 11 Python
Python解析网页源代码中的115网盘链接实例
Sep 30 Python
Python实现的数据结构与算法之队列详解
Apr 22 Python
python使用插值法画出平滑曲线
Dec 15 Python
对python 调用类属性的方法详解
Jul 02 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
python+openCV对视频进行截取的实现
Nov 27 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 Python
在 Golang 中实现 Cache::remember 方法详解
Mar 30 Python
python基础学习之生成器与文件系统知识总结
May 25 Python
Python中的嵌套循环详情
Mar 23 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错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
python的setattr函数实例用法
2020/12/16 Python
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
毕业生造价工程师求职信
2013/10/17 职场文书
2013年军训通讯稿
2014/02/05 职场文书
个人安全承诺书
2014/05/22 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
外科护士长工作总结
2015/08/12 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python