首先,先说一下两点画圆就是类似于圆规画圆的方式,简单说有以下步骤
- 获得圆心
- 获得半径
- 获得每次旋转角度
- 旋转圆心,在前方半径长度处放方块,并不断重复此步骤直到画圆完成。
这里说明一下迭代获得半径与获得每次旋转角度,与迭代。
迭代获得半径
接下来,我们认为圆心是第二个定位点,”圆规的笔尖“是第三个定位点,
首先,在圆心处创建一个盔甲架,并将其指向“笔尖”;初始化记分板中的#r变量,来保存半径;
接下来,调用一个自循环的函数,每一次循环都这样做:让盔甲架向“笔尖”迈0.5格,并将#r +50,直到盔甲架与“笔尖”重合(距离小于0.5)。
这样我们就通过迭代获得了圆的半径。
命令贴在下方:
- #@s 指临时盔甲架
- #@e[tag=tool_belong,scores={tool_selector=3},limit=1] 指笔尖
- #传送
- tp @s ^ ^ ^0.5
- #记分板设置
- scoreboard players add #r tool_calc 50
- #再循环
- execute as @s at @s unless entity @e[tag=tool_belong,scores={tool_selector=3},limit=1,distance=..0.5] run function tool:circle/loop_get_r
复制代码 获得每次旋转角度说白了就是下面这一个公式:
但是为了更加的精确,每次旋转可能还要除以2或4,这样就得到了每次旋转角度。
迭代画圆
画圆的实现是一个双层循环:外层旋转中心,内层将笔尖移到半径处,具体如下动图:语文不好,动图来凑
再看一看命令:外层循环
- #定义还剩的 半径
- scoreboard players operation #r_left tool_calc = #r tool_calc
- #调整角度,并重置位置
- execute at @e[tag=tool_circle_center,limit=1] run tp @s ~ ~ ~ ~ ~
- #调用循环
- execute at @s as @s run function tool:arc/loop_to_r
- #复制
- function tool:clone/clone
- #旋转
- #获得旋转
- scoreboard players operation #rotation_left tool_calc -= #rd tool_calc
- #写入
- execute store result entity @e[tag=tool_circle_center,limit=1] Rotation[0] float 0.01 run scoreboard players get #rotation_left tool_calc
- #循环
- execute if score #rotation_left tool_calc matches 0.. as @s at @s run function tool:arc/loop_cw
复制代码 内层循环- #传送
- tp @s ^ ^ ^0.5
- #减积分
- scoreboard players remove #r_left tool_calc 50
- #循环
- execute unless score #r_left tool_calc matches ..0 as @s at @s run function tool:arc/loop_to_r
复制代码 再来一点细节:这里有两个变量来控制循环,一个是 #r_left ,指还剩多少距离,另一个是 #rotation_left,指还剩多少角度。
好了,这一整个画圆的过程基本讲完了
|