皆さんこんにちは。Python の愛の告白コードに関する素朴な疑問に編集者が答えます。多くの人はまだ Python Love コードの実行方法を知りません。今すぐ見てみましょう。
最近人気のテレビ シリーズ「ライト・ミー・アップ、ウォーム・ユー」では、主人公とヒロインがコンピュータ試験で実現したときめきの愛を表現し、そのプロセス全体がコードで現実の実現に復元されます。
勉強の神様の試験で100点が取れるのは、試験問題の得点が100点しかないからです!
この劇は、作家トゥエンティンの小説「ライターとプリンセス ドレス」を原作としており、華やかなプログラミングの天才リー シュンと勇敢で粘り強い少女ズー ユンの物語です。紆余曲折を経て、若い学校から職場へ。手をつないで前に進むラブストーリーPython を使用した雪だるまの描き方。
テレビシリーズのシーン:
- 1 つ目は通行人のコードです。
劇中では「C 言語の中間試験」とされていますが、この生徒のコードはdraw2.py と呼ばれています。 、典型的な Python ファイル、スクリーンショットのpen.forward、pen.setpos、およびその他のメソッドと組み合わせて、愛を描くにはタートル描画ライブラリを使用する必要があるようです。通常、効果は次のようになります:
import turtle as t
t.color('red')
t.setheading(50)
t.begin_fill()
t.circle(-100, 170)
t.circle(-300, 40)
t.right(38)
t.circle(-300, 40)
t.circle(-100, 170)
t.end_fill()
t.done()
劇中のコマンドラインの下に1で構成される不規則なグラフィックの代わりに。
- 次に、クラスの代表者が通行人に見せた素晴らしいコードがあります。
実装の効果:
これは確かに C 言語コードですが、ファイルの接尾辞として .py が付いており、include の前に # がないため、明らかに実行できません。 . .
中のコンテンツは、次の恋愛曲線公式を使用してハートを描くために使用できます。
次に、15*17 の正方行列を走査し、各座標が曲線の内側か外側かを計算し、内部的には # または * を出力し、外部的には - を出力します。
これをPythonで次のように書き換えます。
for y in range(9, -6, -1):
for x in range(-8, 9):
print('*##*'[(x+10)%4] if (x*x+y*y-25)**3 < 25*x*x*y*y*y else '-', end=' ')
print()
効果:
出力をわずかに変更しても、以前のすべて 1 の効果を得ることができます。
for y in range(9, -6, -1):
for x in range(-8, 9):
print('1' if (x*x+y*y-25)**3 < 25*x*x*y*y*y else ' ', end=' ')
print()
効果:
しかし、それはいわゆる劇中の効果とは程遠いものです。
- 最後に、主人公はクールな D ブラストの鼓動ハートを取り出します。
コードには 2 つのフラグメントがあります:
しかし、これら 2 つのフラグメントは C 言語ではなく C++ であり、さらに、2 つのフラグメントは同じプログラムではなく、使用されるメソッドもまったく異なります。
最初のコードは前のアイデアと似ていますが、曲線を直接使用する代わりに、上半分で 2 つの円を使用し、下半分で 2 つの直線を使用してハートを形成している点が異なります。
Python コードに書き直すと次のようになります。
size = 10
for x in range(size):
for y in range(4*size+1):
dist1 = ((x-size)**2 + (y-size)**2) ** 0.5
dist2 = ((x-size)**2 + (y-3*size)**2) ** 0.5
if dist1 < size + 0.5 or dist2 < size + 0.5:
print('V', end=' ')
else:
print(' ', end=' ')
print()
for x in range(1, 2*size):
for y in range(x):
print(' ', end=' ')
for y in range(4*size+1-2*x):
print('V', end=' ')
print()
操作の効果:
2 番目のコードは、極座標に基づくラブ カーブを使用し、角度を横断して点の位置を計算します。式は次のとおりです。
さまざまな角度に対応する点の座標を計算し、それらを接続してハートを形成します。
from math import pi, sin, cos
import matplotlib.pyplot as plt
no_pieces = 100
dt = 2*pi/no_pieces
t = 0
vx = []
vy = []
while t <= 2*pi:
vx.append(16*sin(t)**3)
vy.append(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t))
t += dt
plt.plot(vx, vy)
plt.show()
効果:
コードのループで 2π が使用されているのは、曲線が円を一周するのに十分な長さであることを保証するためですが、実際には、それが円を一周できるかどうかは問題ではありません。が長い場合、π=100 であっても表示効果には影響しません。これは、同じ曲線を何度も描くことと同じです。そのため、劇中のコードではπを小数点以下35桁まで表記し、それをヒロインが紙とペンで一字一句書き写すという、プログラマーには理解できない実にややこしい行為となっている。
しかし、いくらπの桁が書かれていても、上記の 2 つのコードは最終的なビート効果にはほど遠いものです。
ドキドキの恋は叶う
Python を使用して、心臓を鼓動させる最終的な効果を実現することに挑戦してみましょう。
- ダイナミックなエフェクトを描画したい場合は、いくつかのライブラリの助けを借りなければなりません。そうしないと、コードの量が間違いなく泣きたくなるでしょう。ここではpgzeroライブラリを使用します。次に、最後の極座標ラブ曲線コードと組み合わせて、最初に曲線上に離散点を描画します。
import pgzrun
from math import pi, sin, cos
no_p = 100
dt = 2*3/no_p
t = 0
x = []
y = []
while t <= 2*3:
x.append(16*sin(t)**3)
y.append(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t))
t += dt
def draw():
screen.clear()
for i in range(len(x)):
screen.draw.filled_rect(Rect((x[i]*10+400, -y[i]*10+300), (4, 4)), 'pink')
pgzrun.go()
効果:
2. ポイントの数を増やし、原点から各ポイントまでの半径方向に沿って乱数を追加します。この乱数は正規分布に従って分布します。 (半分正規分布)、確率は曲線上に分布し、曲線の内側に向かって減少します。このようにして、ランダムに分散された愛の効果が得られます。
...
no_p = 20000
...
while t <= 2*pi:
l = 10 - abs(random.gauss(10, 2) - 10)
x.append(l*16*sin(t)**3)
y.append(l*(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)))
t += dt
...
3. 次のステップは、ポイントを移動することです。このステップは非常に重要ですが、少し複雑です。各ポイントの制御を容易にするために、各ポイントは Particle クラスのインスタンスにカスタマイズされます。原理的には各点にスケーリング係数を加えるのですが、この係数は時間とともに変化する正弦関数であり、呼吸のリズムのようになります。
class Particle():
def __init__(self, pos, size, f):
self.pos = pos
self.pos0 = pos
self.size = size
self.f = f
def draw(self):
screen.draw.filled_rect(Rect((10*self.f*self.pos[0] + 400, -10*self.f*self.pos[1] + 300), self.size), 'hot pink')
def update(self, t):
df = 1 + (2 - 1.5) * sin(t * 3) / 8
self.pos = self.pos0[0] * df, self.pos0[1] * df
...
t = 0
def draw():
screen.clear()
for p in particles:
p.draw()
def update(dt):
global t
t += dt
for p in particles:
p.update(t)
4. 劇中で心臓が鼓動すると、中央のポイントがさらに変動し、拡張効果があります。したがって、各点の原点からの距離に応じて係数が加算され、点に近いほど係数が大きくなります。
class Particle():
...
def update(self, t):
df = 1 + (2 - 1.5 * self.f) * sin(t * 3) / 8
self.pos = self.pos0[0] * df, self.pos0[1] * df
効果:
5. 最後に、同じ方法を使用して、より大きなハートを描画します。このハートは、フレームごとにランダムに描画される限り、ジャンプする必要はありません。
def draw():
...
t = 0
while t < 2*pi:
f = random.gauss(1.1, 0.1)
x = 16*sin(t)**3
y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)
size = (random.uniform(0.5,2.5), random.uniform(0.5,2.5))
screen.draw.filled_rect(Rect((10*f*x + 400, -10*f*y + 300), size), 'hot pink')
t += dt * 3
効果:
2 つのコード効果を結合し、一緒に実行します。効果は次のとおりです:
要約すると、元の基本関数に正規分布の乱数と乱数を追加します。時間とともに変化するサイン関数と距離に反比例する係数を使用し、外側にランダムなハートのレイヤーをより多く配置することで、劇中の鼓動するハートと同様の効果を得ることができます。