Я не знаю много о Javascript, но так как это кажется больше математическим вопросом, я сделаю мой выстрел.
Замените строки
// I'm totally lost here.
// current output without transformation
ctx.drawImage(img, 0, i, imgW, 1, 0, i, imgW, 1);
на
var xMargin = -Math.sqrt(1-Math.pow((i-halfHeight)/halfHeight,2))*imgW/2+imgW/2;
ctx.drawImage(img, 0, i, imgW, 1, xMargin, i, imgW-(2*xMargin), 1);
Это искажает верхнюю половину изображения в виде эллипса (круг будет работать, только если ваше входное изображение будет квадратным), как это:
Решает ли это ваш вопрос?
Объяснение
Я взял уравнение сдвинутого эллипса из Википедии и установил c1 и a равным imgW/2
и c2 и b до imgH / 2 .Взяв i
за y позвольте мне вычислить x ;Я сохранил одно из решений как xMargin
.Ширина изображения при заданной вертикальной координате будет равна исходной ширине минус двойное поле.
В конце я подал drawImage()
этими входами, см. Документацию .