TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua

 找回密码
 新人加入
查看: 3853|回复: 7
打印 上一主题 下一主题

[已解决] 求获取frz旋转后坐标的方法 [复制链接]

Rank: 5Rank: 5

跳转到指定楼层
楼主
发表于 2011-11-17 15:56:21 |只看该作者 |倒序浏览
本帖最后由 我们的夏天 于 2011-11-18 18:18 编辑

求教。。。
有没有函数或者方法可以获取一个pos沿org然后frz某个度数后的pos吗?
比如afterfrz(x,y,orgx,orgy,ang)然后返回旋转后的x,y坐标。。。。

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

沙发
发表于 2011-11-17 19:05:48 |只看该作者
空间解析几何坐标变换公式 (如果单是frz的话, 平面解析几何就足够了)




其中, x, y为原pos, theta为旋转角度

下面这个是相关的VSFilter的源代码片段
  1. void CWord::Transform(CPoint org)
  2. {
  3.         double scalex = m_style.fontScaleX/100;
  4.         double scaley = m_style.fontScaleY/100;

  5.         double caz = cos((3.1415/180)*m_style.fontAngleZ);
  6.         double saz = sin((3.1415/180)*m_style.fontAngleZ);
  7.         double cax = cos((3.1415/180)*m_style.fontAngleX);
  8.         double sax = sin((3.1415/180)*m_style.fontAngleX);
  9.         double cay = cos((3.1415/180)*m_style.fontAngleY);
  10.         double say = sin((3.1415/180)*m_style.fontAngleY);

  11.         for(int i = 0; i < mPathPoints; i++)
  12.         {
  13.                 double x, y, z, xx, yy, zz;

  14.                 x = scalex * (mpPathPoints[i].x + m_style.fontShiftX * mpPathPoints[i].y) - org.x;
  15.                 y = scaley * (mpPathPoints[i].y + m_style.fontShiftY * mpPathPoints[i].x) - org.y;
  16.                 z = 0;

  17.                 xx = x*caz + y*saz;
  18.                 yy = -(x*saz - y*caz);
  19.                 zz = z;

  20.                 x = xx;
  21.                 y = yy*cax + zz*sax;
  22.                 z = yy*sax - zz*cax;

  23.                 xx = x*cay + z*say;
  24.                 yy = y;
  25.                 zz = x*say - z*cay;

  26.                 zz = max(zz, -19000);

  27.                 x = (xx * 20000) / (zz + 20000);
  28.                 y = (yy * 20000) / (zz + 20000);

  29.                 mpPathPoints[i].x = (LONG)(x + org.x + 0.5);
  30.                 mpPathPoints[i].y = (LONG)(y + org.y + 0.5);
  31.         }
  32. }
复制代码
参考链接:

http://zh.wikipedia.org/wiki/%E6%97%8B%E8%BD%AC

http://zhidao.baidu.com/question/31601042


Super Moderator

{\clip\t(\clip)}∀.I.R.nesSub

Rank: 6Rank: 6

板凳
发表于 2011-11-17 21:20:16 |只看该作者
  1. def circle(_r, _t):
  2.     '''圆上的点'''
  3.     _x = round(_r*math.cos(_t*3.141592653589793/180),5)
  4.     _y = round(_r*math.sin(_t*3.141592653589793/180),5)
  5.    
  6.     return [_x, _y]
复制代码
_x,_y加上org的坐标就可以了。

r = ((x-x')**2+(y-y')**2)**0.5
(死

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

地板
发表于 2011-11-17 21:29:43 |只看该作者
我们的夏天 发表于 2011-11-17 21:13
呃,度娘知道的那个参考页面里评论说该公式只适用于逆时针旋转,悲剧的是恰好旋转角是负的。。。
加之数学矩 ...


正负不影响吧, 如果是负数, sin(-30) = -sin(30), cos(-30) = cos(30), 公式不变....

p.s. 其实-30和330是等价的(360-30)

p.s.2. 可以参考萌葬给的那函数....

Rank: 4

5#
发表于 2011-11-17 23:31:07 |只看该作者
天哪,光是看着就晕了。。。虽然目前作为一个以数学为荣的高三党,一般数学考试拿135-140分还是没问题的。。。不过就以现在的水平来看这个完全就晕了,还要英语过关。。。虽然我英语也基本不下125分。。。
真想不到做个特效居然还要对立体解析几何有深入了解才行啊?!

Rank: 5Rank: 5

6#
发表于 2011-11-17 23:53:09 |只看该作者
本帖最后由 我们的夏天 于 2011-11-17 23:55 编辑

貌似懂了,萌葬的意思是不是这样(手机上的打不出论坛代码标签,将就着看吧):

def afterfrz(x,y,orgx,orgy,ang):
    r = ((x-orgx)**2+(y-orgy)**2)**0.5
    ax = round(r*cos(ang),5) + orgx
    ay = round(r*sin(ang),5) + orgy
return (ax,ay)

python里三角函数单位是好像是角度,所以我没*pi/180,然后表示不知道有round这个函数,不知参数5是做什么的。。。(说起来,萌葬什么时候开始用python了

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

7#
发表于 2011-11-18 02:43:19 |只看该作者
round是圆滑取整函数,5大概表示四舍五入?可以用 int(x+0.5) 代替…
不过pos接受浮点数的…可以不用取整…

三角函数一般还是用弧度制的…角度制用起来不太方便

p.s. 公式粗略看了下,应该是正确的

p.s.2. 萌葬用python很长时间了 XD

Super Moderator

{\clip\t(\clip)}∀.I.R.nesSub

Rank: 6Rank: 6

8#
发表于 2011-11-18 03:38:32 |只看该作者
取5位小数进行四舍五入操作。
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-4-24 06:45

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH