实在的繁花曲线运用一种称为繁花曲线规的小玩意制作,繁花曲线规由相互契合巨细两个圆组成,用笔插在小圆上的一个孔中,紧贴大圆的内壁翻滚,就能够制作出美丽的图画。这个进程能够做一个笼统:有两个半径不相等的圆,大圆方位固定,小圆在大圆内部,小圆紧贴着算法剖析的目的是大圆内壁翻滚,求小圆上的算法的时刻复杂度是指什么某一点走python能够做什么作业过的轨道。

进一步剖析,小圆的运动能够分解为两个部分:小圆圆心绕大圆圆心公转、小圆绕本身圆心自转。设大圆圆心为A,半径为Ra,小圆圆心为B,半径为Rb,轨道点为C,半径为R算法的时刻复杂度取决于c(BC间隔),设小圆公转的弧度为 [0,∞),如图:

运用python和pygame制作繁花曲线的方法

由于大圆的圆心坐标是固定的,要求得小圆上的某点的轨道,需求先求出小圆当时时刻的圆心坐标,再求出小圆自转的弧度,最终求出小圆上某点的坐标。

榜首步:求小圆圆心坐标

小圆圆心的公转轨道是一个半径为 RA- RB 的圆,求小圆圆心坐标,恰当所以求半径为 RA- RB 的圆上 弧度对应的点的坐标。

圆上的点的坐标公式为:

x = r * cos(), y = r * sin()

小圆圆心坐标为:python是什么意思( xa+ (Ra – Rb) * cos(), ya + (Ra – Rb) * sin() )

第二步:求小圆自转弧度

设小圆自转弧度为算法是什么,小圆紧appreciate贴大圆运动,两者走过的旅程相同,因此有:

Ra * =python保留字 Rb *

小圆自转弧度 = (Ra / Rb) *

第三步算法的有穷性是指:求点C坐标

点C相对小圆圆心B的公转轨道是一个半径为 Rc 的圆,类似榜首步,有:

轨道点C的坐标为:( xa+ Rc* cos(), ya+python下载安装教程 Rc* sin())

按照以上算法剖析python基础教程,用python代码完结如下:

# -*- coding: utf-8 -*-
import math
'''
功用:
已知圆的圆心和半径,获取某弧度对应的圆上算法剖析的目的是点的坐标
入参:
center:圆心
radius:半径
radian:弧度
'appear''
def get_point_in_circle算法的时刻复杂度取决于(center, radius, radian):
return (center[0] + radius *python123 maappointmentth.cos(radian), center[1] - radius * math.sin(radian))
'''
功用:
表里圆A和B,内圆A沿着外圆B的内圈翻滚,已知外圆圆心、半径,已知内圆半径,已知公转弧度和绕点半径,核算绕点坐标
入参:
center_A:外圆圆心
radius算法规划与剖析_A:外圆半径
raapproachdius_B:内圆半径
radius_C:绕点半径
radian:公转弧度
'''
def get_point_in_child_circle(c算法的有穷性是指enter_A, radius_A, radius_B, radius_C, radian):
# 核算内圆圆心坐标
center_B = get_point_in_circle(center_A, radius_A - radius_B, radian)
# 核算绕点弧算法导论度(公转为逆算法时针,则自转为顺时针)
radianpython编程_C = 2.0*math.pi - ((radius_A / radiusappointment_B * radian) % (2.0*math.pi))
# 核算绕点坐标
reappreciateturn get_point_in_circle(python123渠道登录center_B, radius_C, radian_算法工程师和程序员差异C)

有两点需求留心:

(1)屏幕坐标系左上角为原点,笔直向下为Y正轴,与算法数学坐标系Y轴方向相反,所以第14行Y坐标为减法;

(2)默许公转为逆时针,则自转为顺时针,所以第30行python基础教程求自转弧度时,运用了2 – %(2);

坐标现已核算出来,接下来运用pygame制作。思维是以0.01弧度为一个步长,不断核算出新的坐标,把一系列坐标连起来就会构成轨道图。

为了能够构成一个封闭图形,还需求知道制作点什么时候会从头回到起点。想了一个方法,以X轴正半轴为基准线,每次制作点抵达基准线,核算此刻python下载安装教程制作点与起点的间隔,抵达必定精度以为现已回到起点,构成封闭图形。

''' 核算两点间隔(平方和appear) '''
def get_instance(p1, p2):
return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1])
'''
功用:
获取绕点途径的所有点的坐标
入参:
center:外圆圆心
radius_AAPP:外圆半径
radius_B:内圆半径
radius_C:绕点半径
shift_radia算法的时刻复杂度取决于n:每次偏移的弧度,默许0.01,值越小,精度越高,核算量越大
'''
def get_points(center, radius_A, radius_B, rpython基础教程adius_C, sappearancehift_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_rapython下载安装教程dian/4) + 1 # 一圈需求走多少步(弧度偏移多少次)
# 榜首圈的起点坐标
start_point = get_point_in_child_circle(center, radius_A, radius_算法工程师B算法的五个特性, radiAPPus_C, 0)
points = [start_point]
# 榜首圈的途径坐标
for r in range(1, R_PER_ROUND):
points.appendappearance(get_point_in_child_circle(center, radius_A, radius_B, radius_C, shift_radian*r))
# 以圈为单位,每圈的初步弧度为 2PI*round,某圈的起点坐标与榜首圈的起点坐标间隔在必定appointment范围内,以为途径完毕
for rounpython123d in range(1, 100):
s_radian = round*P2
s_point = get_point_in_child_circle(center, radius_A, radius_B, radius_C, s_radian)
if get_instance(s_point, start_poin算法的时刻复杂度取决于t) < 0.1:
break
points.append(s_point)
for r in range(1, R_PER_ROUND):
points.append(get_point_in_child_circle(center, radius_A, radius_appreciateB, radius_C, s_radian + shifappstoret_radian*r))
return points

再加上制作代码,完好代码如下:

# -*- coding: utf-8 -*python怎样读-
impopython基础教程rt mathapproach
importpython保留字 random
'''
功用:
已知圆的圆心和半径approve,获取某弧度approach对应的圆上点的坐标
入参:
center:圆算法的时刻复杂度是指什么心
radius:半径
radian:弧度
'''
def get_p算法工程师oint_inapple_circle算法的有穷性是指(center, radiu算法的五个特性s, radian):
return (center[0] + radius * math.cos(radian), center[1] - radius * math.sin(radian)算法)python是什么意思
'''
功用:
表里圆A和B,内圆appreciateA沿着外圆B的内圈翻滚,已知外圆圆心、半径,已知内圆半径、公转弧度,已知绕点半径,核算绕点坐标
入参:
center_A:外圆圆心
radius_A:外圆半径
radius_B:内appointment圆半径
radius_C:绕点半径
radian:公转弧度
'''
def get_point_in_child_circle(center_A, radius_A, radius_Bpython编程, radius_C, radian):
# 核算内圆圆心坐标算法
center_B = get_point_in_circle(center_A, radius_A - radius_B,算法导论 radiapproachan)
# 核算绕点弧度(公转为逆时针,则自转为顺时针)
radian_appreciateC = 2.0*math.pi - (appstore(radius_A / radius_B算法是什么 * radian) % (2.0*math.pi))
# 核算绕点坐标
center_Capprove =app安装下载 get_point_in_circle(center_B, radius_C, radian_C)
center_B_Int = (int(center_B[0]), int(cepython是什么意思nter_B[1]))
return center_B_Int, centepython是什么意思r_C
''' 核算两点距app安装下载离(平方和) '''
def get_instance(p1, p2):
return (p1[0] - p2[0]) * (p1[0] -appstore p2[0]) + (python下载安装教程p1[1] - p2[1]) * (p1[1] - p2[1])
'''
功用:
获取绕点途python123渠道登录径的所有点的坐标
入参:
center:外圆圆心
radius_A:算法的五个特性外圆半径算法是什么
radius_B:内圆半径
radius_C:绕点半径
shift_radian:每次偏移的弧度,默许0.01,值越小,精度越高,核算量越算法规划与剖析大
'''
def get_points(center_A, radius_A, radappointmentius_B, radius_C, shif算法导论t_radian=0.01):
# 转为实数算法工程师和程序员差异
radius_A *= 1.0
radappreciateius_B *= 1.0
radius_C *= 1.0
P2 = 2python怎样读*math.pi # 一圈的弧度为 2PI
R_PER_ROUND = int(P2/shift_r算法剖析的目的是adian) + 1 # 一圈需求走多少步(弧度偏移多少次)
# 榜首圈的起点坐标
start_center, start_point = get_point_in_child_circle(ce算法工程师n算法是什么ter_A, radius_A, radius_B, radius_C, 0)
points = [start_point]
centers = [start_center]
# 榜首圈的途径坐标
for r in ra算法的五个特性nge(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)
centerpython能够做什么作业s.append(center)
# 以圈为单位,每圈的初步弧度为算法导论 2PI*round,某圈的起点坐标与榜首圈的起点坐标间隔在必定范围内,以为途径完毕
for round in range(1,python培训班膏火一般多少 100):
s_python能够做什么作业raapplicationdiapp安装下载an = round*P2
s_ceapplicationnter, s_point = get_point_in_child_circle(centappearanceer_A, radius_A, radius_B, radius_C, s_radian)python怎样读
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,算法的时刻复杂度取决于 poin算法是什么t = get_point_in_child_circle(python编程center_A, radius_A, radius_B, radius_C, s_radian + shift_radian*r)
points.append(APPpoint)
ceapplicationnters.append(center)
print(len(points)/R_PER_ROUND)
return centers, poinpython123渠道登录ts
import py算法的时刻复杂度取决于gampython培训班膏火一般多少e
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((600, 400))
cpython是什么意思lock = pygame.time.Clock()
color_black = (0, 0, 0)
color_white = (255, 255, 255)appear
color_rapproveed = (2APP55, 0, 0)
color_yello = (255, 255, 0)
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)
test_idx = 2
dra算法导论w_poiapprovent_napplicationum_python培训班膏火一般多少per_tti = 5
while True:
for eventpython基础教程 in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
exit(0)
screen.fill(color_white)
pygame.draw.circle(screen, color_black, center, ipython编程nt(radius_A), 2)
if test_idx <= len(test_points):
pygaapp安装下载me.draw.aalines(screen, (appreciate0, 0,Python 255), False, test_points[:test_idx], 1)
if test_idx < len(test_centers):
pygame.draw.circle(screen, color_bappearancelack, test_centers[test_idx]python保留字, int(radius_B), 1)
pygame.draw.appreciateaaapproachline(screen, color_black, test_centers[test_idx], test_points[test_idx], 1)python基础教程
test_idx = mipython123渠道登录n(test_idx + draw_point_num_per_tti, len(test_poipython怎样读nts))
clock.tick(50)
pygame.display.flip()

效果:

运用python和pygame制作繁花曲线的方法