利用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使用matplotlib绘制动画的方法
May 20 Python
基于进程内通讯的python聊天室实现方法
Jun 28 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
python使用RNN实现文本分类
May 24 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
python for循环输入一个矩阵的实例
Nov 14 Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 Python
Python datetime包函数简单介绍
Aug 28 Python
Python csv文件的读写操作实例详解
Nov 19 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 Python
Python日志模块logging用法
Jun 05 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
PHP整合PayPal支付
2015/06/11 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
javascript 必知必会之closure
2009/09/21 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
javascript基本类型详解
2014/11/28 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
html5简介及新增功能介绍
2020/05/18 HTML / CSS
《美丽的彩虹》教学反思
2014/02/25 职场文书
加入学生会演讲稿
2014/04/24 职场文书
监察建议书格式
2014/05/19 职场文书
中考标语大全
2014/06/05 职场文书
土建施工员岗位职责
2015/04/11 职场文书
物业管理交接协议书
2016/03/24 职场文书