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()