import turtle as pen
import math
from dataclasses import dataclass
@dataclass
class qe:
x: float
y: float
q: float
@dataclass
class vec:
x: float
y: float
K = 9.0 * 10.0 ** (9.0)
r = 2 * 10**6
tot = 5 * 10**3
step = 0.1
zoom = 100
e = []
e.append(qe(0.0,0.0,-4.0 * 10 ** (-5.0))) # 在你想要的位置放置一定电荷量的电荷就好了
e.append(qe(0.0,4.0,1.0 * 10 ** (-5.0)))
def dis(x1:float,y1:float,x2:float,y2:float) -> float:
return ((x1-x2)**2 + (y1-y2)**2)**0.5
def sigmoid(x):
return 2*math.atan(-x/60000.0)/math.pi
def get_E(x:float,y:float) -> vec:
ret : vec = vec(0.0,0.0)
for i in e:
l = dis(i.x,i.y,x,y)
if l == 0.0:
continue
a = K * i.q / (l*l)
ret.x += a * (x - i.x) / l
ret.y += a * (y - i.y) / l
a = dis(0.0,0.0,ret.x,ret.y)
pen.color(1.0,1+sigmoid(a),1+sigmoid(a))
return ret
pen.speed(0)
pen.pensize(1)
pen.rt(90)
for i in e:
if i.q > 0.0:
line: int = int(i.q * r)
print(line)
for j in range(line):
print(j)
theta:float = 2.0 * math.pi * j / line
qx = math.cos(theta) / tot + i.x
qy = math.sin(theta) / tot + i.y
if abs(math.cos(theta)) < 10**(-15):
qx = i.x
if abs(math.sin(theta)) < 10**(-15):
qy = i.y
print(qx,qy)
pen.up()
pen.goto(qx*zoom,(qy-3)*zoom)
pen.down()
for k in range(650):
E = get_E(qx,qy)
a = dis(0.0,0.0,E.x,E.y)
if a < 10**(-15) or a > 10**(15):
break
flag = False
for kk in e:
if kk.q < 0.0 and dis(qx,qy,kk.x,kk.y) < 5 * 10**(-2):
flag = True
break
if flag:
break
E.x /= a
E.y /= a
qx += E.x * step
qy += E.y * step
pen.goto(qx*zoom,(qy-3)*zoom)
pen.up()
pen.done()