利用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中使用装饰器和元编程实现结构体类实例
Jan 28 Python
在Python中操作文件之seek()方法的使用教程
May 24 Python
Python数据操作方法封装类实例
Jun 23 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
PyTorch 对应点相乘、矩阵相乘实例
Dec 27 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
利用python绘制数据曲线图的实现
Apr 09 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
Python代码实现双链表
May 25 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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制作静态网站的模板框架(三)
2006/10/09 PHP
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
Python获取linux主机ip的简单实现方法
2016/04/18 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
蔻驰美国官网:COACH美国
2016/08/18 全球购物
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
服务行业个人求职的自我评价
2013/12/12 职场文书
幼儿园教师请假制度
2014/01/16 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
二胎满月酒致辞
2015/07/29 职场文书
毕业生入职感言
2015/07/31 职场文书
推普标语口号大全
2015/12/26 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python