function(f,z)=1/(z-n)-1/(z+n)+1/(z+i)+1/(z-i)

z=0,vector(r,g,b)=vector(1-abs(cos([64*arg(function(f,x+i*y))/(2*pi)])),0,0)


Graph of the formula

I think this represents field lines for the charge configuration. It is drawn by

!!ARBfp1.0

TEMP R0;
TEMP R1;
TEMP R2;
TEMP R3;
TEMP R4;
TEMP R5;
TEMP R6;

PARAM U0 = program.local[0];

PARAM C0 = {
32.000000000000000000000000000000,
2.000000000000000000000000000000,
1.000000000000000000000000000000,
0.574687003089563108737536367698
};
PARAM C1 = {
0.996411111195072418666995872627,
0.000053512010821308359420547113,
0.462580302908276230766659864457,
0.538013194335899780362808542122
};
PARAM C2 = {
1.570796326794896557998981734272,
3.141592653589793115997963468544,
0.000000000000000000000000000000,
0.000000000000000000000000000000
};

ADD R0.x, fragment.texcoord[0].x, U0.x;
MUL R0.y, R0.x, R0.x;
ADD R0.z, fragment.texcoord[0].y, U0.y;
MUL R0.w, R0.z, R0.z;
ADD R1.x, R0.y, R0.w;
RCP R1.y, R1.x;
MUL R1.z, R0.x, R1.y;
ADD R1.w, fragment.texcoord[0].x, U0.z;
MUL R2.x, R1.w, R1.w;
ADD R2.y, fragment.texcoord[0].y, U0.w;
MUL R2.z, R2.y, R2.y;
ADD R2.w, R2.x, R2.z;
RCP R3.x, R2.w;
MUL R3.y, R1.w, R3.x;
MUL R3.z, fragment.texcoord[0].x, fragment.texcoord[0].x;
ADD R3.w, fragment.texcoord[0].y, C0.z;
MUL R4.x, R3.w, R3.w;
ADD R4.y, R3.z, R4.x;
RCP R4.z, R4.y;
MUL R4.w, fragment.texcoord[0].x, R4.z;
ADD R5.x, fragment.texcoord[0].y, -C0.z;
MUL R5.y, R5.x, R5.x;
ADD R5.z, R3.z, R5.y;
RCP R5.w, R5.z;
MUL R6.x, fragment.texcoord[0].x, R5.w;
ADD R6.y, R1.z, -R3.y;
ADD R1.z, R4.w, R6.x;
ADD R3.y, R6.y, R1.z;
ADD R1.z, -fragment.texcoord[0].y, U0.w;
MUL R0.x, R1.z, R1.y;
ADD R0.y, -fragment.texcoord[0].y, U0.y;
MUL R0.z, R0.y, R3.x;
ADD R0.y, -fragment.texcoord[0].y, -C0.z;
MUL R0.w, R0.y, R4.z;
ADD R0.y, -fragment.texcoord[0].y, C0.z;
MUL R1.x, R0.y, R5.w;
ADD R0.y, R0.x, -R0.z;
ADD R0.x, R0.w, R1.x;
ADD R0.z, R0.y, R0.x;
ABS R0.x, R3.y;
ABS R0.y, R0.z;
RCP R0.w, R0.x;
MUL R0.x, R0.y, R0.w;
ABS R0.y, R0.x;
RCP R0.w, R0.y;
ADD R1.x, R0.y, -C0.z;
MAD R1.y, R0.y, C0.w, C1.x;
MAD R1.z, R0.y, R1.y, C1.y;
MAD R1.y, R0.y, C1.z, C1.w;
MAD R1.w, R1.y, R0.y, C0.z;
RCP R0.y, R1.w;
MUL R1.y, R1.z, R0.y;
MAD R0.y, R0.w, C0.w, C1.x;
MAD R1.z, R0.w, R0.y, C1.y;
MAD R0.y, R0.w, C1.z, C1.w;
MAD R1.w, R0.y, R0.w, C0.z;
RCP R0.y, R1.w;
MUL R0.w, R1.z, R0.y;
ADD R0.y, C2.x, -R0.w;
CMP R0.w, R1.x, R1.y, R0.y;
CMP R0.y, R0.x, -R0.w, R0.w;
ADD R0.x, C2.y, -R0.y;
CMP R0.w, R3.y, R0.x, R0.y;
CMP R0.x, R0.z, -R0.w, R0.w;
MUL R0.y, C0.x, R0.x;
RCP R0.x, C2.y;
MUL R0.z, R0.y, R0.x;
COS R0.x, R0.z;
MUL R0.y, R0.x, R0.x;
RSQ R0.x, R0.y;
RCP R0.z, R0.x;
KIL R0.y;
ADD R0.x, -R0.z, C0.z;
MOV_SAT R0.y, R0.x;
MOV_SAT R0.x, C2.z;
MUL result.color.x, fragment.color.primary.x, R0.y;
MUL result.color.y, fragment.color.primary.y, R0.x;
MUL result.color.z, fragment.color.primary.z, R0.x;

END