Project1

标题: 天气系统的其中一个运动轨迹的函数表达式。已解决 [打印本页]

作者: 飞翔的小鸟3    时间: 2017-10-15 14:00
标题: 天气系统的其中一个运动轨迹的函数表达式。已解决
本帖最后由 飞翔的小鸟3 于 2017-10-18 12:01 编辑

https://rpg.blue/forum.php?mod=v ... =%E5%A4%A9%E6%B0%94
这个帖子,其中第一张gif图片,是这样子运动的


这要怎么描绘XY的坐标啊,我百度不到斜着的三角函数啊。

作者: WantMy蕙    时间: 2017-10-15 14:43
作关于y=sinx关于y=1/2x的对称函数就搞定,主要是变过来比较麻烦
作者: gforce    时间: 2017-10-15 21:09
原帖的做法,大概是雪片下降的同時今其旋轉,並調整旋轉軸心至外圍,不需要什麼三角函数。
作者: guoxiaomi    时间: 2017-10-15 23:59
本帖最后由 guoxiaomi 于 2017-10-16 14:54 编辑

三角函数本来就是匀速圆周运动在直线上的投影,你把圆周运动投影到斜着的直线上不就行了吗?高一第一章的内容啊老铁
三楼的说法是对的,用的是摆线的方程:
  1. x = r * sin(w*t + phi) + k1 * t + b1
  2. y = r * cos(w*t + phi) + k2 * t + b2
复制代码


作者: guoxiaomi    时间: 2017-10-16 20:14
本帖最后由 guoxiaomi 于 2017-10-16 20:24 编辑

所谓摆线,在数学中,摆线(Cycloid)被定义为,一个圆沿一条直线运动时,圆边界上一定点所形成的轨迹。(来自百度百科)
标准的摆线方程是这样的:
  1. x = t - sin t
  2. y = 1 - cos t
复制代码

长这个样子:标准摆线

注意这里有个很尖锐的峰,并且摆线是朝着 x 轴正向移动的
1. 如果要去掉尖峰,就要调整摆轮转速(wR)与移动速度之比(v)。
2. 如果想要你给的类似倾斜的三角函数,就要让 y 方向也随着 t 有一个线性变化的值。
3. 如果要得到性质更舒服的摆线,要调整两个三角函数的相位差。
比如:
  1. x = (t + sin(t - \pi/4))
  2. y = (t + cos(t))
复制代码

好看摆线

对于三角函数 y = sin (x) 的旋转:
  1. x = t
  2. y = sin(t)
  3. x' =  x * cos(a) + y * sin(a) = cos(a) * t + sin(a) * sin(t)
  4. y' = -x * sin(a) + y * cos(a) = -sin(a) * t + cos(a) * sin(t)
复制代码

这显然也是摆线,取 sin(a) = 0.6, cos(a) = 0.8,得到旋转正弦曲线

作者: 飞翔的小鸟3    时间: 2017-10-17 20:04
本帖最后由 飞翔的小鸟3 于 2017-10-17 20:39 编辑
guoxiaomi 发表于 2017-10-16 20:14
所谓摆线,在数学中,摆线(Cycloid)被定义为,一个圆沿一条直线运动时,圆边界上一定点所形成的轨迹。( ...

更新:代码写错了,等等

怎么p出来才几次就几万了,等等,我好像搞错一个地方了。
给你运动轨迹的代码。
RUBY 代码复制
  1. def path_particle_1(type,type2)
  2.     case type
  3.     # 斜一点
  4.     when 1
  5.       x = 2
  6.       y = 4
  7.     # 斜更多
  8.     when 2
  9.       x = 4
  10.       y = 2
  11.     end
  12.     case type2
  13.     # 第一批粒子
  14.     when 1
  15.       $weather_xq += x
  16.       $weather_yq += y
  17.       for a in 0..$pic_number2
  18.       $weather_x[a] = 0.8*$weather_xq + 0.6*Math.sin($weather_xq)
  19.       $weather_y[a] = -0.6*$weather_yq + 0.8*Math.sin($weather_yq)
  20.       end
  21.       $weather_x2q += x
  22.       $weather_y2q += y
  23.       for a in 0..$pic_number
  24.       $weather_x2[a] = 0.8*$weather_x2q + 0.6*Math.sin($weather_x2q)
  25.       $weather_y2[a] = -0.6*$weather_y2q + 0.8*Math.sin($weather_y2q)
  26.       end
  27.     # 第二批粒子
  28.     when 2
  29.       for a in 0..$pic_number2
  30.       $weather_x3[a] += x
  31.       $weather_y3[a] += y
  32.       end
  33.       for a in 0..$pic_number
  34.       $weather_x4[a] += x
  35.       $weather_y4[a] += y
  36.       end
  37.     end
  38.   end



看我给你的消息

作者: guoxiaomi    时间: 2017-10-18 00:57
本帖最后由 guoxiaomi 于 2017-10-18 01:29 编辑

我按照你的格式写了一下,你改一下脚本的 13 - 20 行:
RUBY 代码复制
  1. # 第一批粒子
  2. when 1
  3.   $weather_xq += x * 0.1
  4.   $weather_yq += y * 0.05
  5.   for a in 0..$pic_number2
  6.     $weather_x[a] += (0.8 + 0.6 * Math.cos($weather_xq)) * 10
  7.     $weather_y[a] += (0.6 - 0.8 * Math.cos($weather_yq)) * 10
  8.   end

有 3 个要注意的地方:
1. VA的坐标轴和我上面帖子里的坐标轴是不一样的,Y轴是反的,所以Y轴要添负号
2. 你下面的函数都是 +=,不知道为什么这里却变成了直接设置坐标,对轨迹函数求导得到每一步的增量
3. 正弦的路径要求x,y的三角函数频率相同,所以这里 y * 0.05 而 x * 0.1,使得 Δ($weather_xq) = Δ($weather_yq)

这个问题到此为止了,其实这个与其说是天气系统,应该理解为“弹幕”才对,你可以看一下关于弹幕的全部搜索,或者搜索"stg"





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1