2014-01-06 81 views
0

是否有任何简单的转换(转换矩阵...)将部分A转换为部分B?唯一的要求是两个部分应该具有相同的尺寸X形状转换 - 圆形部分

我打算用图像填写部分A,然后将其转换为包含图像的部分B。现在我使用javascript KineticJS,但我愿意在必要时更改框架。

这样可行吗?

Section A transformed to section B

+0

只是为了澄清,你想被完全包含在B中的结果,而不是在A + B的组合? 如果你想要A + B,你可以翻译成楔形A的中心点,然后按(outsideRadiusA-insideRadiusA)/ totalRadius的比例进行缩放。如果你只想要B,那么没有你的需求x-before == x-after之后,你可以在中心点做一个缩放。但是鉴于你的x/x要求,没有简单的转换。然后你需要一个缩放和插值的组合。 – markE

+0

它应该只是B.所以你可能是对的,没有简单的转换。你如何用缩放和插值来做到这一点? –

回答

1

您的解决方案是不平凡的。

考虑该图示中:

线辐射360度向外从中心点和穿过两个电弧A和B.

enter image description here

此图显示了围绕中心点有更多的行。

enter image description here

认为这是每一个像素从A移动到B中对应的像素这使用线性内插(lerping)给每个像素从A移动到B.彩色像素的总数在甲& B是相同的 - 没有像素已被“神奇地”加入到B.

下面是这个图示码:

var cx=150; 
var cy=150; 

ctx.lineWidth=1; 
for(var a=0;a<Math.PI*2;a+=Math.PI/240){ 
for(var r=25;r<50;r++){ 
    var x1=cx+r*Math.cos(a); 
    var y1=cy+r*Math.sin(a); 
    var x2=cx+(r+25)*Math.cos(a); 
    var y2=cy+(r+25)*Math.sin(a); 
    ctx.fillStyle="blue"; 
    ctx.fillRect(x1,y1,1,1); 
    ctx.fillStyle="blue"; 
    ctx.fillRect(x2,y2,1,1); 
} 
} 
ctx.lineWidth=2; 
ctx.beginPath(); 
ctx.arc(cx,cy,25,0,Math.PI*2); 
ctx.closePath(); 
ctx.stroke(); 
ctx.beginPath(); 
ctx.arc(cx,cy,50,0,Math.PI*2); 
ctx.closePath(); 
ctx.stroke(); 
ctx.beginPath(); 
ctx.arc(cx,cy,75,0,Math.PI*2); 
ctx.closePath(); 
ctx.stroke(); 

问题

请注意,大部分电弧A是用蓝色像素填充的,而B的某些部分是“模糊”(未完全填充)。这是因为A的像素数量不会完全填满B的较大空间。

您的图像看起来是一样的。它在弧A中看起来“正确”,但在弧B中将缺少像素。

你需要做的是“用B填充空白”和适当确定的像素。

溶液

可以用等,其通过选择“最好”的像素颜色填充在间隙中乙双线性内插的算法完成此操作。它通过比较弧A中的4个相邻像素来实现这一点。该算法通过填充较大空间内的“缺失”像素,将较小的图像放大为较大的图像。

您将不得不稍微调整此算法以执行非轴对齐插值。这里有一个链接到双线性插值的一个很好的例子:

http://strauss.pas.nu/js-bilinear-interpolation.html