Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何修复此图像(逐像素)失真问题?_Javascript_Math_Canvas_Polar Coordinates_Pixel Manipulation - Fatal编程技术网

Javascript 如何修复此图像(逐像素)失真问题?

Javascript 如何修复此图像(逐像素)失真问题?,javascript,math,canvas,polar-coordinates,pixel-manipulation,Javascript,Math,Canvas,Polar Coordinates,Pixel Manipulation,我试图扭曲画布中显示的图像,使其看起来像一个“行星”。然而,我正在努力寻找解决失真问题的方法。想到的唯一解决办法是找到一种方法来减小radiusDistance变量,该变量越大。尽管如此,我不确定如何实现这一目标。有什么建议吗 以下是我目前用于实现此目的的数学和对象: polarArray = []; var polar = function(a,r,c){ //polar object, similar to pixel object. this.a = a; //angle

我试图扭曲画布中显示的图像,使其看起来像一个“行星”。然而,我正在努力寻找解决失真问题的方法。想到的唯一解决办法是找到一种方法来减小
radiusDistance
变量,该变量越大。尽管如此,我不确定如何实现这一目标。有什么建议吗

以下是我目前用于实现此目的的数学和对象:

polarArray = [];
var polar = function(a,r,c){ //polar object, similar to pixel object.
    this.a = a; //angle
    this.r = r; //radius (distance)
    this.color = c; //color, stored using an object containg r,g,b,a variables
};
loopAllPixels(function(loop){//loop through every pixel, stored in a pixel array
    var pixel = loop.pixel;
    /*each pixel object is structured like this:
        pixel {
            x,
            y,
            color {
                r,
                g,
                b,
                a
            }
        }
    */
    var angle = pixel.x/360*Math.PI;
    var radiusDistance = pixel.y/Math.PI;
    polarArray.push(new polar(angle,radiusDistance,pixel.color));//store polar coordinate pixel + colour.
    pixel.color = new colorRGBA(255,255,255,255);//set background as white.
});
for (var i=0;i<polarArray.length;i++){//loop through polarArray (polar coordinate pixels + colour)
    var p = polarArray[i]; //polar pixel
    var x = (p.r*Math.cos(p.a))+(canvas.width/2); //x coordinate
    var y = (p.r*Math.sin(p.a))+(canvas.height/2); //y coordinate
    if (setpixel(x,y,p.color)==true){ //set pixel at location.
        continue;
    }
    break;

}
updatePixelsToContext();//draw to canvas
polarArray=[];
var polar=函数(a,r,c){//极性对象,类似于像素对象。
this.a=a;//角度
this.r=r;//半径(距离)
this.color=c;//color,使用包含r、g、b、a变量的对象存储
};
loopAllPixels(函数(loop){//循环每个像素,存储在像素数组中
var pixel=loop.pixel;
/*每个像素对象的结构如下所示:
象素{
x,,
Y
颜色{
R
G
B
A.
}
}
*/
变量角度=像素x/360*Math.PI;
var radiusDistance=pixel.y/Math.PI;
polarArray.push(新极坐标(角度、半径距离、像素.颜色));//存储极坐标像素+颜色。
pixel.color=新颜色RGBA(255255);//将背景设置为白色。
});

对于(var i=0;i除了扫描图像中的每个像素外,还要扫描目标圆中的每个像素。使用目标的X和Y坐标定位源图像上的坐标,然后将目标设置为正确的值。嗯……你知道有什么好的算法可以创建圆,我可以使用我的像素对象?(注意:使用笛卡尔坐标…因为我看不到一种可实现的极坐标方法)…同样,使用这种方法,最终的产品不就是裁剪成圆形的源图像吗?(这不是目的)@blindman67您没有提供足够的信息来将cart转换为polar,只是
函数cart2Polar(x,y){return{dir:Math.atan2(y,x),dist:Math.hypot(x,y)}
但是这与图像x,y的关系是未知的,因为您没有提供polarArray是如何填充的信息,(添加到polarArray的函数应该是渲染代码的一部分)使用polarArray存储图像非常困难..不,对不起,我的意思是可笑的,效率低下,我低估了它。在@Blindman67编写的所有函数中,你应该找到4个最接近的极坐标点,并对实际像素颜色进行双线性插值。(或双三次插值的16个最近点)