本帖最后由 蓝桥玄霜 于 2018-4-27 19:07 编辑
我是小白,刚刚开始学习Python。
在Excelhome论坛看到一个讨论繁花图案的帖子,网上搜索到rmthy写的一个帖子,是用Python写的。
我复制了他的代码,生成了需要的数据;
摸索着我拼凑一小段代码,把这些数据写入Excel工作簿,然后,在Excel中处理这些数据,画出了繁花图案。
代码如下:
import math import random
''' 功能: 已知圆的圆心和半径,获取某弧度对应的圆上点的坐标 入参: center:圆心A radius:半径Ra radian:弧度 ''' defget_point_in_circle(center, radius, radian): return (center[0] + radius *math.cos(radian), center[1] - radius * math.sin(radian))
''' 功能: 内外圆A和B,内圆A沿着外圆B的内圈滚动,已知外圆圆心、半径,已知内圆半径、公转弧度,已知
绕点半径,计算绕点坐标 入参: center_A:外圆圆心 radius_A:外圆半径 radius_B:内圆半径 radius_C:绕点半径 radian:公转弧度 ''' defget_point_in_child_circle(center_A, radius_A, radius_B, radius_C, radian): # 计算内圆圆心坐标 center_B = get_point_in_circle(center_A,radius_A - radius_B, radian) # 计算绕点弧度(公转为逆时针,则自转为顺时针) radian_C = 2.0*math.pi - ((radius_A /radius_B * radian) % (2.0*math.pi)) # 计算绕点坐标 center_C = get_point_in_circle(center_B,radius_C, radian_C) center_B_Int = (int(center_B[0]),int(center_B[1])) return center_B_Int, center_C
''' 计算两点距离(平方和) ''' defget_instance(p1, p2): return (p1[0] - p2[0]) * (p1[0] - p2[0]) +(p1[1] - p2[1]) * (p1[1] - p2[1])
''' 功能: 获取绕点路径的所有点的坐标 入参: center:外圆圆心 radius_A:外圆半径 radius_B:内圆半径 radius_C:绕点半径 shift_radian:每次偏移的弧度,默认0.01,值越小,精度越高,计算量越大 ''' defget_points(center_A, radius_A, radius_B, radius_C, shift_radian=0.01): # 转为实数 radius_A *= 1.0 radius_B *= 1.0 radius_C *= 1.0
P2 = 2*math.pi # 一圈的弧度为 2PI R_PER_ROUND = int(P2/shift_radian) + 1 # 一圈需要走多少步(弧度偏移多少次)
# 第一圈的起点坐标 start_center, start_point =get_point_in_child_circle(center_A, radius_A, radius_B,
radius_C, 0) points = [start_point] centers = [start_center] # 第一圈的路径坐标 for r in range(1, R_PER_ROUND): center, point =get_point_in_child_circle(center_A, radius_A, radius_B, radius_C,
shift_radian*r) points.append(point) centers.append(center)
# 以圈为单位,每圈的起始弧度为 2PI*round,某圈的起点坐标与第一圈的起点坐标距离在一定范围内,认为路径结束 for round in range(1, 100): s_radian = round*P2 s_center, s_point =get_point_in_child_circle(center_A, radius_A, radius_B,
radius_C,s_radian) if get_instance(s_point, start_point)< 0.1: break points.append(s_point) centers.append(s_center) for r in range(1, R_PER_ROUND): center, point =get_point_in_child_circle(center_A, radius_A, radius_B,
radius_C,s_radian + shift_radian*r) points.append(point) centers.append(center)
print(len(points)/R_PER_ROUND)
return centers, points
center = (300,200) ‘大圆的圆心坐标 radius_A = 150 ‘大圆的半径 radius_B = 110 ‘小圆的半径 radius_C = 50 ‘绕点半径
test_centers,test_points = get_points(center, radius_A, radius_B, radius_C)
导入Excel的代码: from xlwtimport *
wb = Workbook() ws =wb.add_sheet('A Test Sheet') sj= test_points ‘sj为列表,test_points是另外程序得到的数据
for i inrange(0,len(sj)): ws.write(i, 0, label=str(sj)) ‘转为字符串
wb.save('E:\sj1.xls')
在Excel中处理数据,并画图。 Sub lqxs() '处理数据 Dim Arr, Brr, i&, aa Arr = [A1].CurrentRegion ReDim Brr(1 To UBound(Arr), 1 To 2) For i = 1 To UBound(Arr) aa = Mid(Arr(i, 1), 2, Len(Arr(i, 1)) - 2) Brr(i, 1) = Split(aa, ",")(0) Brr(i, 2) = Split(aa, ",")(1) Next [e1].Resize(UBound(Brr), 2) = Brr End Sub
Sub fanhua2() '画图 Dim Arr, i&, shp As Shape Application.ScreenUpdating = False For Each shp In ActiveSheet.Shapes If shp.Type = 9 Then shp.Delete Next Application.ScreenUpdating = True Arr = [e1].CurrentRegion x1 = Arr(2, 1) y1 = Arr(2, 2) For i = 2 To UBound(Arr) x2 = Arr(i, 1) y2 = Arr(i, 2) Set shp = ActiveSheet.Shapes.AddLine(x1, y1, x2, y2) shp.Line.ForeColor.RGB = RGB(255, 0, 0): shp.Width = 1
x1 = x2 y1 = y2 Next End Sub
|