利用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之入门(三)序列
May 25 Python
python爬取51job中hr的邮箱
May 14 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
Python中Django发送带图片和附件的邮件
Mar 31 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
实例讲解Python爬取网页数据
Jul 08 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
Apr 26 Python
python实现人工智能Ai抠图功能
Sep 05 Python
Python之Class&amp;Object用法详解
Dec 25 Python
解决Keras中CNN输入维度报错问题
Jun 29 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
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
mysql desc(DESCRIBE)命令实例讲解
2016/09/24 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
DOM 事件的深入浅出(一)
2016/12/05 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
2018/02/13 Python
python之pandas用法大全
2018/03/13 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
本科生个人求职自荐信
2013/09/26 职场文书
高中毕业自我鉴定
2013/12/22 职场文书
春节晚会主持词
2014/03/24 职场文书
小学生环保标语
2014/06/13 职场文书
大学生党员自我剖析材料
2014/10/06 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
python的变量和简单数字类型详解
2021/09/15 Python
python实现商品进销存管理系统
2022/05/30 Python