为什么不能在命令行中打印非整数外摆线?
why cannot print non integer epicycloid in command line?
我想在命令行中打印外摆线:
import math
import sys
WIDTH=30
R=10.0
N=3.0
DELTA=0.01
pixels=[[0 for y in range(WIDTH)] for x in range(WIDTH)]
for f in range(0,(int)(2*math.pi/DELTA)):
pixels[(int)(R*math.sin(f*DELTA)-R*math.sin((N+1)*f*DELTA)/(N+1)+WIDTH/2)][(int)(R*math.cos(f*DELTA)-R*math.cos((N+1)*f*DELTA)/(N+1)+WIDTH/2)]=1
for row in pixels:
for cell in row:
sys.stdout.write('[]' if cell==1 else ' ')
sys.stdout.write('\n')
并用 N=3,7, 和 3.5 进行测试,当 N=3 和 7 时似乎有效:
N=3
[][][][][][][][]
[][] [][][]
[][] [][]
[] [][]
[][][][][] []
[][] [][] []
[][] [][]
[][] []
[] [][]
[][] []
[] []
[] [][]
[] [][]
[] []
[][] []
[] [][]
[][] []
[][] [][]
[][][] [][] []
[][][][][] []
[] [][]
[][] [][]
[][] [][]
[][][][][][][][]
N=7
[][][]
[][][] [][][]
[][][][][][] [][]
[][] [][] []
[][] [][][]
[] [] [][][]
[] [][]
[] []
[][][][] []
[] []
[][] []
[] [][][]
[] [][]
[][] []
[] []
[][][] []
[] []
[] [][]
[] [] [][][]
[][] [][][]
[][] [][] []
[][][][][][] [][]
[][][] [][][]
[][][]
但是当 N=3.5 时,形状不是我预期的(像星星一样):
[][][]
[][][] [][][]
[][] [][]
[] [][]
[] []
[] [][]
[][] [][][][][]
[][] [][][]
[] []
[][] []
[][][] []
[] [][]
[][] []
[] [][][]
[] []
[] [][]
[] []
[] []
[][] []
[][] []
[][] [] []
[][][] [][][] []
[][][][] [][] [][]
[][][] [][][]
[][][]
我查了这么久的公式,我的参数也是用float直到把结果转换成像素位置,但还是没发现哪里不对,谁能帮忙?
(我想用python来解决,但是我发现原来的java版本也有类似的问题,我什至不知道是哪一类问题(例如:公式错误,数字类型转换,或错误的代码)导致它)
当你有小数N=p/q
时,你需要去2*q*math.pi
。让我们探讨一下我的意思。
对于N=3.5
,
parametric plot (sin(t)-sin(4.5t)/4.5 , cos(t)-cos(4.5t)/4.5) for t in [0,2pi]
在 Wolfram Alpha 中产生:
这与您的输出相似。
另一方面,[0,4pi] 的 upper limit 得到另一半:
最后,如果N为1/7,我们have to use[0,14pi]得到:
我想在命令行中打印外摆线:
import math
import sys
WIDTH=30
R=10.0
N=3.0
DELTA=0.01
pixels=[[0 for y in range(WIDTH)] for x in range(WIDTH)]
for f in range(0,(int)(2*math.pi/DELTA)):
pixels[(int)(R*math.sin(f*DELTA)-R*math.sin((N+1)*f*DELTA)/(N+1)+WIDTH/2)][(int)(R*math.cos(f*DELTA)-R*math.cos((N+1)*f*DELTA)/(N+1)+WIDTH/2)]=1
for row in pixels:
for cell in row:
sys.stdout.write('[]' if cell==1 else ' ')
sys.stdout.write('\n')
并用 N=3,7, 和 3.5 进行测试,当 N=3 和 7 时似乎有效:
N=3
[][][][][][][][]
[][] [][][]
[][] [][]
[] [][]
[][][][][] []
[][] [][] []
[][] [][]
[][] []
[] [][]
[][] []
[] []
[] [][]
[] [][]
[] []
[][] []
[] [][]
[][] []
[][] [][]
[][][] [][] []
[][][][][] []
[] [][]
[][] [][]
[][] [][]
[][][][][][][][]
N=7
[][][]
[][][] [][][]
[][][][][][] [][]
[][] [][] []
[][] [][][]
[] [] [][][]
[] [][]
[] []
[][][][] []
[] []
[][] []
[] [][][]
[] [][]
[][] []
[] []
[][][] []
[] []
[] [][]
[] [] [][][]
[][] [][][]
[][] [][] []
[][][][][][] [][]
[][][] [][][]
[][][]
但是当 N=3.5 时,形状不是我预期的(像星星一样):
[][][]
[][][] [][][]
[][] [][]
[] [][]
[] []
[] [][]
[][] [][][][][]
[][] [][][]
[] []
[][] []
[][][] []
[] [][]
[][] []
[] [][][]
[] []
[] [][]
[] []
[] []
[][] []
[][] []
[][] [] []
[][][] [][][] []
[][][][] [][] [][]
[][][] [][][]
[][][]
我查了这么久的公式,我的参数也是用float直到把结果转换成像素位置,但还是没发现哪里不对,谁能帮忙?
(我想用python来解决,但是我发现原来的java版本也有类似的问题,我什至不知道是哪一类问题(例如:公式错误,数字类型转换,或错误的代码)导致它)
当你有小数N=p/q
时,你需要去2*q*math.pi
。让我们探讨一下我的意思。
对于N=3.5
,
parametric plot (sin(t)-sin(4.5t)/4.5 , cos(t)-cos(4.5t)/4.5) for t in [0,2pi]
在 Wolfram Alpha 中产生:
这与您的输出相似。
另一方面,[0,4pi] 的 upper limit 得到另一半:
最后,如果N为1/7,我们have to use[0,14pi]得到: