一、前言说明
今天看到微信群里一道六年级数学题,如下图,求阴影部分面积
看起来似乎并不是很难,可是博主添加各种辅助线,写各种方法都没出来,不得已而改用写python代码来求面积了
二、思路介绍
1.用python将上图画在坐标轴上,主要是斜线函数和半圆函数
2.均匀的在长方形上面洒满豆子(假设是豆子),求阴影部分豆子占比*总面积
三、源码设计
1.做图源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
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设置越大运行时间越长也越精准
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
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.下面有三种求解方法,第三种表示比大学高数还难看懂,你们呢?
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.cnblogs.com/Vrapile/p/10067297.html