资讯型电商网站优缺点,长沙一站式网站建设,中山网络公司网站,本地做网站MATLAB交互式贝塞尔曲线演示
以下是一个MATLAB交互式贝塞尔曲线演示代码#xff0c;允许用户通过点击界面来添加控制点并实时查看贝塞尔曲线的变化#xff1a;
function interactive_bezier()% 创建图形窗口fig figure(Name,交互式贝塞尔曲线演示, NumberTitle,off);ax a…MATLAB交互式贝塞尔曲线演示
以下是一个MATLAB交互式贝塞尔曲线演示代码允许用户通过点击界面来添加控制点并实时查看贝塞尔曲线的变化
function interactive_bezier()% 创建图形窗口fig figure(Name,交互式贝塞尔曲线演示, NumberTitle,off);ax axes(Parent, fig);title(ax, 点击添加控制点 (右键结束));xlabel(ax, X轴);ylabel(ax, Y轴);grid(ax, on);hold(ax, on);axis(ax, [0 10 0 10]);% 初始化控制点controlPoints [];bezierCurve [];% 设置鼠标点击回调函数set(fig, WindowButtonDownFcn, addControlPoint);% 添加控制点函数function addControlPoint(~, ~)% 获取点击位置pt get(ax, CurrentPoint);x pt(1,1);y pt(1,2);% 检查是否是右键点击 (结束)if strcmp(get(fig, SelectionType), alt)if size(controlPoints, 1) 2% 结束添加允许拖动控制点set(fig, WindowButtonDownFcn, selectControlPoint);title(ax, 可以拖动控制点 (右键清除));endreturn;end% 添加新控制点垂直拼接controlPoints [controlPoints; x, y];% 绘制控制点和连线cla(ax);plot(ax, controlPoints(:,1), controlPoints(:,2), ro-, MarkerFaceColor, r);% 如果有足够点绘制贝塞尔曲线if size(controlPoints, 1) 2updateBezierCurve();endend% 更新贝塞尔曲线函数function updateBezierCurve()% 计算贝塞尔曲线t linspace(0, 1, 100);n size(controlPoints, 1) - 1;curve zeros(length(t), 2);for i 0:n% 计算伯恩斯坦多项式B nchoosek(n,i) * (t.^i) .* ((1-t).^(n-i));curve curve B .* controlPoints(i1,:);end% 绘制曲线if ~isempty(bezierCurve)delete(bezierCurve);endbezierCurve plot(ax, curve(:,1), curve(:,2), b-, LineWidth, 2);end% 选择控制点函数function selectControlPoint(~, ~)% 检查是否是右键点击 (清除所有点)if strcmp(get(fig, SelectionType), alt)controlPoints [];cla(ax);set(fig, WindowButtonDownFcn, addControlPoint);title(ax, 点击添加控制点 (右键结束));return;end% 获取点击位置pt get(ax, CurrentPoint);x pt(1,1);y pt(1,2);% 查找最近的控制点if ~isempty(controlPoints)distances sqrt((controlPoints(:,1)-x).^2 (controlPoints(:,2)-y).^2);[~, idx] min(distances);% 设置拖动回调函数set(fig, WindowButtonMotionFcn, {dragControlPoint, idx});set(fig, WindowButtonUpFcn, stopDrag);endend% 拖动控制点函数function dragControlPoint(~, ~, idx)% 获取当前鼠标位置pt get(ax, CurrentPoint);x pt(1,1);y pt(1,2);% 更新控制点位置controlPoints(idx,:) [x, y];% 重绘cla(ax);plot(ax, controlPoints(:,1), controlPoints(:,2), ro-, MarkerFaceColor, r);updateBezierCurve();end% 停止拖动函数function stopDrag(~, ~)set(fig, WindowButtonMotionFcn, );set(fig, WindowButtonUpFcn, );end
end使用说明
运行上述代码将创建一个交互式图形窗口添加控制点用鼠标左键点击图形区域添加控制点结束添加右键点击结束控制点添加阶段拖动控制点在结束添加后可以点击并拖动现有控制点重置右键点击清除所有控制点并重新开始
运行结果
贝塞尔曲线原理
这段代码实现了n阶贝塞尔曲线的计算使用伯恩斯坦多项式 B ( t ) ∑ i 0 n ( n i ) ( 1 − t ) n − i t i P i , t ∈ [ 0 , 1 ] \mathbf{B}(t) \sum_{i0}^n \binom{n}{i} (1-t)^{n-i} t^i \mathbf{P}_i, \quad t \in [0,1] B(t)i0∑n(in)(1−t)n−itiPi,t∈[0,1]
其中 P i \mathbf{P}_i Pi 是第 i i i 个控制点向量。 ( n i ) \binom{n}{i} (in) 是二项式系数组合数。
曲线会实时更新以反映控制点的变化。
您可以将此代码保存为.m文件并在MATLAB中运行或者直接在命令窗口中执行。