flash – 扭曲网格中的坐标
我在2D系统中有一个网格,就像前一个图像中的一个网格,其中给出了所有点A,B,C,D,A’,B’,C’,D'(意思是我知道相应的x和y-坐标).
当网格失真时,我需要计算A(新),B(新),C(新)和D(新)的x坐标和y坐标(以便A’移动到A'(新),B’移动到B'(新),C’移动到C'(新),D’移动到D'(新)). 失真以网格线被分成相等长度的子线的方式发生(意味着例如AB被分成等长的| AB | / 5和A(新)B的5个部分( new)被分成等长的5个部分| A(新)B(新)| / 5). 使用Sandy 3D Flash engine的DistortImage类完成失真.(我的实际任务是使用此类扭曲图像,其中手柄不位于图像like in this demo的角落,而是位于其中的某个位置). alt text http://www.gefragt.de/distorted_grid.png 解决方法
设(u,v)表示“纹理”坐标.无论网格扭曲如何,您的手柄都保持相同的纹理坐标.
因此,在纹理空间中,A =(0,0)B =(1,0)C =(1,1)D =(0,1)A’=(au,av)B’=(bu,bv) … 我们可以从纹理空间转换为像素空间. P(u,v)= A *(1-u)(1-v)Bu *(1-v)Cuv D *(1-u)* v (u,v是纹理坐标,A,D指像素坐标) 因此,如果您的句柄A’被定义为具有纹理坐标(.35,.15),那么像素空间中A’的位置由P(.35,.15)给出. 现在,假设用户拖动句柄A’.我们需要解决A. B,D的新位置保持固定.这只是简单的代数. A' = A*(1-au)*(1-av) + B*au*(1-av) + C*au*av + D*(1-au)*av A' - B*au*(1-av) - C*au*av - D*(1-au)*av = A*(1-au)*(1-av) A = (A' - B*au*(1-av) - C*au*av - D*(1-au)*av) / ((1-au)*(1-av)) 还不错.相同的过程获取其他句柄的公式.这是我的C#代码.当任何8个“拇指”被拖动时,它会被调用: double au = .35,av = .15; // texture coordinates of A' double bu = .8,bv = .2; // texture coordinates of B' double cu = .8,cv = .6; // texture coordinates of C' double du = .2,dv = .9; // texture coordinates of D' // if we're dragging A' (AA),then move A,etc. if (sender == ThumbAA) A = (AA - B*au*(1-av) - C*au*av - D*(1-au)*av) / ((1-au)*(1-av)); if (sender == ThumbBB) B = (BB - A*(1-bu)*(1-bv) - C*bu*bv - D*(1-bu)*bv) / (bu*(1-bv)); if (sender == ThumbCC) C = (CC - A*(1-cu)*(1-cv) - B*cu*(1-cv) - D*(1-cu)*cv) / (cu*cv); if (sender == ThumbDD) D = (DD - A*(1-du)*(1-dv) - B*du*(1-dv) - C*du*dv) / ((1-du)*dv); // update position of A',B',C',D' AA = A*(1-au)*(1-av) + B*au*(1-av) + C*au*av + D*(1-au)*av; BB = A*(1-bu)*(1-bv) + B*bu*(1-bv) + C*bu*bv + D*(1-bu)*bv; CC = A*(1-cu)*(1-cv) + B*cu*(1-cv) + C*cu*cv + D*(1-cu)*cv; DD = A*(1-du)*(1-dv) + B*du*(1-dv) + C*du*dv + D*(1-du)*dv; 我的演示应用的视频: 这并不能回答您关于同时重新定位4个句柄的确切问题.那是你真正想要的吗?另外,如果您的手柄的纹理坐标没有预先确定,请告诉我.您可以从像素转换为纹理坐标,但它更复杂. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |