圆的面积是A = π r²,所以你可以从填充圆的字符数得到半径1)。半径为r的圆的方程为x² + y² = r²。您可以使用它来导出(一半)给定线的宽度为 x = √(r² - y²)。然后,只需使用循环迭代半径的两倍,并使用format string 来打印以该行为中心的文本中的下几个字符。
from math import pi, sqrt, ceil
text = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."""
radius = ceil(sqrt(len(text)/pi))
text_iter = iter(text)
for i in range(-radius, radius+1):
num = ceil(sqrt(radius**2 - i**2))
print("{:^{}}".format("".join(next(text_iter, ".") for _ in range(2*num)), 2*radius))
输出:
Lorem ipsu
m dolor sit am
et, consectetur
adipiscing elit, s
ed do eiusmod tempor
incididunt ut labore
et dolore magna aliqua
. Ut enim ad minim venia
m, quis nostrud exercita
tion ullamco laboris nis
i ut aliquip ex ea commo
do consequat. Duis aute
irure dolor in reprehend
erit in voluptate velit
esse cillum dolore eu fu
giat nulla pariatur. Exc
epteur sint occaecat c
upidatat non proident,
sunt in culpa qui o
fficia deserunt mo
llit anim id est
laborum......
..........
注意文本是如何被填充的,因为半径必须是整数(因此ceil)。当然,您也可以通过设置text = "" 来打印.(或任何其他占位符)
1) 这是假设每个字符的宽度和高度一样,但事实并非如此。我想您可以稍微调整一下公式以绘制更少的行,而每行有更多的字符。
例如,通过将线条加倍宽,您会得到一个在屏幕上看起来更圆(!)的圆圈(但实际上是扁平的)。:
radius = ceil(sqrt(len(text)/(2*pi))) # calculate with 2 characters per "cell"
for i in range(-radius, radius+1):
num = ceil(sqrt(radius**2 - i**2) * 2)
print("{:^{}}".format("".join(next(text_iter, ".") for _ in range(2*num)), 4*radius))
输出:
Lorem ipsum dolor
sit amet, consectetur ad
ipiscing elit, sed do eiusmo
d tempor incididunt ut labore
et dolore magna aliqua. Ut enim ad
minim veniam, quis nostrud exerci
tation ullamco laboris nisi ut aliqu
ip ex ea commodo consequat. Duis aut
e irure dolor in reprehenderit in vo
luptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sin
t occaecat cupidatat non proident,
sunt in culpa qui officia deserun
t mollit anim id est laborum..
............................
........................
..................