加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – 扭曲网格中的坐标

发布时间:2020-12-15 07:25:01 所属栏目:百科 来源:网络整理
导读:我在2D系统中有一个网格,就像前一个图像中的一个网格,其中给出了所有点A,B,C,D,A’,B’,C’,D'(意思是我知道相应的x和y-坐标). 当网格失真时,我需要计算A(新),B(新),C(新)和D(新)的x坐标和y坐标(以便A’移动到A'(新),B’移动到B'(新),C’移动到C'(新),D’移
我在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;

我的演示应用的视频:
http://screencast.com/t/NDU2ZWRj

这并不能回答您关于同时重新定位4个句柄的确切问题.那是你真正想要的吗?另外,如果您的手柄的纹理坐标没有预先确定,请告诉我.您可以从像素转换为纹理坐标,但它更复杂.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读