马黑黑 发表于 2023-6-30 12:38

理解二次贝塞尔曲线

本帖最后由 马黑黑 于 2023-6-30 12:43 编辑 <br /><br /><style>
.mysvg { display: block; margin: 10px auto; width: 600px; height: 600px; border: 1px solid gray; }
</style>

<p>二次贝塞尔曲线由三组XY坐标描述:d="M<span style="color:red">100,300</span> Q<span style="color:blue">300,300</span> <span style="color:green">500,300</span>",红色组通过M指令定位,是曲线的开始点;另两组由Q指令带出,蓝色组为曲线的控制点,绿色组是曲线的终点。<br><br></p>
<p>如果控制点在中央,则二次贝塞尔曲线其实是直线(如下面所示,紫色圆圈的圆心是控制点)。想象一下它是一根能整体弯曲的小钢丝线,头尾两端保持固定不变,现在,尝试改变控制点的XY坐标值,看看会发生什么:<br><br></p>
<svg class="mysvg">
        <path id="myPath" d="M100,300 Q300,300 500,300" fill="none" stroke="red" />
        <circle id="circ" cx="300" cy="300" r="4" fill="purple" />
</svg>
<p id="msgBox" style="text-align:center">路径:</p>
<p>
        <label for="controlX">控制点X坐标: </label>
        <input type="range" id="controlX" min="-200" max="800" step="1" value="300" oninput="cX.value=controlX.value" />
        <output id="cX" for="controlX">300</output>
</p>
<p>
        <label for="controlX">控制点Y坐标: </label>
        <input type="range" id="controlY" min="-300" max="900" step="1" value="300" oninput="cY.value=controlY.value" />
        <output id="cY" for="controlX">300</output>
</p>
<p><br><br>【说明】控制点标识特定情况下会消失,因为它已经跑到了svg画布外面去了。</p>

<script>
let pathStr = window.getComputedStyle(myPath).getPropertyValue('d');
msgBox.innerText = '路径: ' + pathStr;
controlX.onchange = controlY.onchange = () => {
        pathStr = `M100,300 Q${controlX.value},${controlY.value} 500,300`;
        circ.setAttribute('cx',controlX.value);
        circ.setAttribute('cy',controlY.value);
        myPath.setAttribute('d',pathStr);
        msgBox.innerText = '路径: ' + pathStr;
};
</script>

岩新新 发表于 2023-6-30 12:45

欣赏精彩制作!

红影 发表于 2023-6-30 13:43

又是一个实用的工具,通过控制点的变化,可以直接看到二次贝塞尔曲线的变化呢{:4_199:}

红影 发表于 2023-6-30 13:44

X不动,可以很清楚地看出对称曲线在Y变化的情况下的变化。{:4_187:}

梦缘 发表于 2023-6-30 17:14

谢谢老师的精彩分享,问好!{:4_190:}

马黑黑 发表于 2023-6-30 17:53

梦缘 发表于 2023-6-30 17:14
谢谢老师的精彩分享,问好!

下午好

马黑黑 发表于 2023-6-30 17:54

红影 发表于 2023-6-30 13:43
又是一个实用的工具,通过控制点的变化,可以直接看到二次贝塞尔曲线的变化呢

通过观察,慢慢理解曲线

马黑黑 发表于 2023-6-30 17:55

红影 发表于 2023-6-30 13:44
X不动,可以很清楚地看出对称曲线在Y变化的情况下的变化。

嗯嗯

马黑黑 发表于 2023-6-30 18:02

<p>看看:&#127811;</p>

小辣椒 发表于 2023-6-30 18:02

这个不懂{:4_198:}

马黑黑 发表于 2023-6-30 18:02

小辣椒 发表于 2023-6-30 18:02
这个不懂

拉两下底部的滑杆就懂了

南无月 发表于 2023-6-30 18:05

黑师强悍,做成动画形式了。。。看上去更加直观

马黑黑 发表于 2023-6-30 19:02

南无月 发表于 2023-6-30 18:05
黑师强悍,做成动画形式了。。。看上去更加直观

能帮助理解就好

红影 发表于 2023-6-30 21:20

马黑黑 发表于 2023-6-30 17:54
通过观察,慢慢理解曲线

嗯这曲线还是很漂亮的。

红影 发表于 2023-6-30 21:21

马黑黑 发表于 2023-6-30 18:02
看看:&#127811;

这个就是新帖子里的那个播放器按钮吧。{:4_173:}

马黑黑 发表于 2023-6-30 21:23

红影 发表于 2023-6-30 21:21
这个就是新帖子里的那个播放器按钮吧。

对。论坛使用gbk编码,不能直接显示,自动转换成了编码符号。

马黑黑 发表于 2023-6-30 21:23

红影 发表于 2023-6-30 21:20
嗯这曲线还是很漂亮的。

不是漂亮不漂亮的问题,而是控制点与曲线形状的关系

红影 发表于 2023-6-30 21:43

马黑黑 发表于 2023-6-30 21:23
对。论坛使用gbk编码,不能直接显示,自动转换成了编码符号。

就是你说的emoji字符吧。

红影 发表于 2023-6-30 21:43

马黑黑 发表于 2023-6-30 21:23
不是漂亮不漂亮的问题,而是控制点与曲线形状的关系

嗯,这个帖子能够看的非常直观。

马黑黑 发表于 2023-6-30 22:51

红影 发表于 2023-6-30 21:43
嗯,这个帖子能够看的非常直观。

领会控制点与曲线形态的关系问题,就能理解了二次贝塞尔曲线的原理
页: [1] 2 3 4
查看完整版本: 理解二次贝塞尔曲线