# Any lips images

## Python 3 + numpy + pylab, 168163 156 bytes

import numpy,pylab
f,t=eval(input())
s=max(map(abs,sum(f,())))+t
k=numpy.r_[-s:s+1]
pylab.imsave('a.png',sum(((k-x)**2+(k[:,None]-y)**2)**.5for x,y in f)>t)


Outputs to a file called a.png, the y-axis increases downwards.

Sample outputs (click for full-res versions)

[(5, 8)], 100:

[(0, 0), (70, 150)], 220:

[(-90, -90), (-90, 90), (90, -90), (90, 90), (90, -90)], 670:

[(-390, 0), (-130, 120), (130, -120), (390, 0)], 1180:

## Python 2, 152 bytes

f,t=input()
s=max(map(abs,sum(f,())))+t
w=s*2+1
k=range(-s,s+1)
print'P1',w,w
for y in k:
for x in k:print+(sum(((a-x)**2+(b-y)**2)**.5for a,b in f)>t)


Try it online!

Outputs a PBM file to STDOUT. Sample output:

### JavaScript (ES7), 212 196 bytes

with(Math)f=(c,l,...p)=>{m=l-max(...p)
c.height=c.width=s=min(...p)+l+m
for(i=0;i<s;i++)for(j=0;j<s;j++){for(d=k=0;1/p[k];)d+=hypot(p[k++]+m-i,p[k++]+m-j)
d>l||c.getContext2d.fillRect(i,j,1,1)}}

eval(f(c,${e.value})) input{position:fixed} <input id=e oninput=eval(f(c,${e.value})) value="100,-25,-25,-25,25,25,-25"><canvas id=c>

Outputs via first parameter which is a canvas element to draw on, second parameter is the threshold, then the remaining parameters are the loci. Edit: Saved 16 bytes thanks to @Arnauld, however the code is now dead slow and will trigger slow script warnings for large thresholds.

## Haskell + Gloss, 165 bytes

import Graphics.Gloss
i=fromIntegral
h t=[i(-t)*3..i t*3]
d f t=display(InWindow""(t*3,t*3)(0,0))red$Line[(x,y)|x<-h t,y<-h t,i t>sum[sqrt$(x-u)^2+(y-v)^2|(u,v)<-f]]


Draws the shapes to the screen. It sometimes draws the images REALLY BIG, so I have cropped accordingly.

main = d [(5,8)] 100

main = d [(0,0), (70, 150)] 220

main = d [(-100, 0), (100, 0), (100, 0)] 480

main = d [(-250, -250), (-250, 250), (250, -250)] 1000