本帖最后由 ruhuasiyu 于 2016-8-17 20:24 编辑
上一次发了一个画Bezier曲线的帖子,那个方法可以画任意由多项式函数给出的曲线。帖子地址为
http://www.mcbbs.net/thread-620979-1-1.html
而且在帖子结尾加了一个在线生成OOC的工具,可以方便地画二次Bezier曲线。例如
然而却不能处理三角函数值。
在这个帖子中我将尝试画著名的屁股曲线(心形线)
整体结构如下图,左上方为位移用的命令,右下方是初始化,中间为计算坐标用。
原理
我们将利用近似公式
实际计算时采用下式
命令
首先在记分板temp中引入下述变量
shi 10
yiwan 10000
abc 临时变量
t 角度
N 均分次数
sint 正弦
cost 余弦
x x坐标
y y坐标
z z坐标
初始化
设置各变量的值和循环次数复制代码
位移
执行位移共 5*3部分,每部分检测#x,#y,#z 是否落于1-9,10-99,100-999,1000-9999,10000-10000000内,然后进行移动。复制代码
计算坐标
计算过程命令如下,依次为“检测与召唤”、“计算sint”(橙色),“计算cost”(紫色),“计算ρ,x,y”(黄色)
复制代码
结果示例
下图是屁股线的1/4部分(第一象限,方向和上面的图相反)
将执行位移的命令添加上适当的符号,将函数由1+cos t 变成1-cos t,可以得到其他象限的图像。
利用此种方法可以处理任意由三角函数和初等运算组成极坐标的曲线,诸如
等等。不过现在只完成了第一象限的绘制,其它三个象限还没完成。另外精度上还可以略作提高,不过由于记分板数值的限制,还不能做到无限精确。
上一次发了一个画Bezier曲线的帖子,那个方法可以画任意由多项式函数给出的曲线。帖子地址为
http://www.mcbbs.net/thread-620979-1-1.html
而且在帖子结尾加了一个在线生成OOC的工具,可以方便地画二次Bezier曲线。例如
然而却不能处理三角函数值。
在这个帖子中我将尝试画著名的屁股曲线(心形线)
ρ=1+cos t
整体结构如下图,左上方为位移用的命令,右下方是初始化,中间为计算坐标用。
原理
我们将利用近似公式
sin x=x-x^3/6+x^5/120
cos x=1-x^2/2+x^4/24
实际计算时采用下式
10000*sin (pi/2 * t/N)=(157080*t/N-64596*t/N*t/N+7969*t/N*t/N*t/N)/10
10000*cos (pi/2 * t/N)=(100000-123370*t/N*t/N+25367*t/N*t/N*t/N*t/N)/10
最后将结果的整数部分保存在 #sint 和 #cost 中(注意会差一些比例),然后计算#x=ρ cost=(1+#cost)#cost
#z=ρ sint=(1+#cost)#sint
命令
首先在记分板temp中引入下述变量
shi 10
yiwan 10000
abc 临时变量
t 角度
N 均分次数
sint 正弦
cost 余弦
x x坐标
y y坐标
z z坐标
初始化
设置各变量的值和循环次数
- scoreboard players set #rat temp 1000
- scoreboard players set #N temp 20
- scoreboard players set #t temp 0
- scoreboard players set #sint temp 0
- scoreboard players set #cost temp 0
- scoreboard players set #x temp 0
- scoreboard players set #y temp 0
- scoreboard players set #z temp 0
- summon Snowball ~ ~ ~ {CustomName:"a",NoGravity:1}
位移
执行位移共 5*3部分,每部分检测#x,#y,#z 是否落于1-9,10-99,100-999,1000-9999,10000-10000000内,然后进行移动。
- scoreboard players test #x temp 10000 100000000
- execute @e[name=a] ~ ~ ~ tp @e[name=a] ~10 ~ ~
- scoreboard players remove #x temp 10000
计算坐标
计算过程命令如下,依次为“检测与召唤”、“计算sint”(橙色),“计算cost”(紫色),“计算ρ,x,y”(黄色)
- scoreboard players test #t temp 0 19
- scoreboard players test #x temp 0 0
- scoreboard players test #y temp 0 0
- scoreboard players test #z temp 0 0
- 比较器
- entitydata @e[type=Snowball] {CustomName:""}
- summon Snowball ~ ~ ~ {CustomName:"a",NoGravity:1}
- scoreboard players add #t temp 1
- scoreboard players set #a temp 157080
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #b temp = #a temp
- scoreboard players set #a temp -64596
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #b temp += #a temp
- scoreboard players set #a temp 7969
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #b temp += #a temp
- scoreboard players operation #sint temp = #b temp
- scoreboard players set #b temp 100000
- scoreboard players set #a temp -123370
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #b temp += #a temp
- scoreboard players set #a temp 25367
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #a temp *= #t temp
- scoreboard players operation #a temp /= #N temp
- scoreboard players operation #b temp += #a temp
- scoreboard players operation #cost temp = #b temp
- scoreboard players operation #sint temp /= #shi temp
- scoreboard players operation #cost temp /= #shi temp
- scoreboard players set #rho temp 100000
- scoreboard players operation #rho temp += #cost temp
- scoreboard players operation #cost temp *= #rho temp
- scoreboard players operation #cost temp /= #yiwan temp
- scoreboard players operation #sint temp *= #rho temp
- scoreboard players operation #sint temp /= #yiwan temp
- scoreboard players operation #x temp = #cost temp
- scoreboard players operation #z temp = #sint temp
结果示例
下图是屁股线的1/4部分(第一象限,方向和上面的图相反)
将执行位移的命令添加上适当的符号,将函数由1+cos t 变成1-cos t,可以得到其他象限的图像。
利用此种方法可以处理任意由三角函数和初等运算组成极坐标的曲线,诸如
圆
ρ=sin3t
等等。不过现在只完成了第一象限的绘制,其它三个象限还没完成。另外精度上还可以略作提高,不过由于记分板数值的限制,还不能做到无限精确。
数学渣膜拜中……
(我第一次看到心形线被叫成屁股曲线)
(我第一次看到心形线被叫成屁股曲线)
好强。。不太明白在说什么
膜拜大神,不过恕我冒昧,运用MC计算出这些曲线的实际意义不大……
daolao……
火星浮云 发表于 2016-8-17 19:34
膜拜大神,不过恕我冒昧,运用MC计算出这些曲线的实际意义不大……
可以在建筑中作出各种曲线
可以,你摸到门路了,可以来和我学做菜了。
开玩笑的,虽然说这计分板的使用还是想吐点槽的,但是整体上使用的很不错,包括对计算结果的取舍。
开玩笑的,虽然说这计分板的使用还是想吐点槽的,但是整体上使用的很不错,包括对计算结果的取舍。
话说这样很卡吗?
Zevn 发表于 2016-8-22 00:55
话说这样很卡吗?
运行的时候因为位移花的时间比较长,略微有点卡,不是非常卡
明明是笛卡尔的最后一封情书好不好
准初三路过……
well三角函数
不是精确数值强迫症表示不爽但是能算出来也是非常nice了
嗯已收藏
嗯已收藏
真心不错{:10_512:}
。。第一次看的时候还不是很懂,这次看算是懂了大概的原理。
咸鱼的我...看不懂
sin x=x-x^3/6+x^5/120
cos x=1-x^2/2+x^4/24
这个帖子我可能只学到了这个
MCBBS有你更精彩~