首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Matlab中刻蚀素描图形

在Matlab中刻蚀素描图形
EN

Stack Overflow用户
提问于 2015-05-05 22:16:56
回答 1查看 364关注 0票数 1

我用Matlab制作了一个图形用户界面,并进行了以下设置:

然后我在滑块回调中得到了这个代码:

代码语言:javascript
运行
复制
plot(get(handles.slider2,'Value'),get(handles.slider1,'Value'));
plot(get(handles.slider2,'Value'),get(handles.slider1,'Value'));

所以,每次我调整左边的滑块,点就会垂直移动+1。当我调整底部的滑块时,点将水平移动+1。

我真正想要的是每次调整滑块时绘制一条线。并且之前的操作在图形上仍然可见。这样之后,你就可以看到从头到尾的整个路线。

EN

回答 1

Stack Overflow用户

发布于 2015-05-05 22:37:11

这里有一些东西可以让你继续下去。代码相当重复,诀窍在于:

1)创建一个Nx2数组来存储移动点/线的坐标,随着滑块的移动而更新。第一列是x坐标,第二列是y坐标。

2)创建一个与每个滑块关联的侦听器对象,以生成平滑、连续的绘图。

3)下发hold on命令后,只显示包含位置的数组的最后一行。

在这里,我使用散点图,但我将让您了解如何使用LineSeries对象。这很简单:)

您还可以自定义这些点的外观。这里我把起始点设为一个大黑点,每次释放滑块(当它的回调被执行时)都会显示一个蓝点。

代码语言:javascript
运行
复制
function DrawMarkerLine(~)
clc
clear

hFig = figure('Position',[100 100 400 400],'Units','normalized');

%// create axes with handle
handles.axes1 = axes('Position', [0.2 0.2 0.6 0.6],'XLimMode','manual','YLimMode','manual','XLim',[-4 4],'YLim',[-4 4]);

%// create x slider with handle
handles.x_slider = uicontrol('style', 'Slider','Min',-4,'Max',4,'Value', 0,'units','normalized','position', [0.2 0.08 0.6 0.08], 'callback', @(s,e) UpdateX);
handles.SliderxListener = addlistener(handles.x_slider,'Value','PostSet',@(s,e) XListenerCallBack);


%// create y slider with handle
handles.y_slider = uicontrol('style', 'Slider', 'Min', -4, 'Max', 4, 'Value', 0, 'units', 'normalized', 'position', [0.08 0.2 0.08 0.6], 'callback', @(s,e) UpdateY);
handles.SlideryListener = addlistener(handles.y_slider,'Value','PostSet',@(s,e) YListenerCallBack);

%// Initialize Nx2 array  (x and y coordinates) containing all the positions
handles.AllPositions = [0 0];
handles.Sc =  scatter(handles.axes1,handles.AllPositions(1,1),handles.AllPositions(1,2),200,'k','filled');


%// set axis equal to the sliders min and max
set(handles.axes1, 'YLim', [-4 4], 'XLim', [-4 4],'XTick',-4:1:4,'YTick',-4:1:4);

guidata(hFig,handles);

%// Listeners callbacks followed by sliders callbacks. They are all the ame
%// basically.

    function XListenerCallBack

        handles = guidata(hFig); %// Get handles.

        %// Get position of both sliders
        xval = (get(handles.x_slider,'value'));
        yval = (get(handles.y_slider,'value'));

        %// Concatenate all values
        handles.AllPositions = [handles.AllPositions; xval yval];

        hold on

        %// Draw markers        
        scatter(handles.AllPositions(end,1),handles.AllPositions(end,2),40,'r')
        drawnow

        set(handles.axes1, 'YLim', [-4 4], 'XLim', [-4 4]); %// Set axis limits

        guidata(hFig,handles);
    end

    function YListenerCallBack

        handles = guidata(hFig);

        xval = (get(handles.x_slider,'value'));
        yval = (get(handles.y_slider,'value'));

        handles.AllPositions = [handles.AllPositions; xval yval];

        hold on
         %// Draw markers        
        scatter(handles.AllPositions(end,1),handles.AllPositions(end,2),40,'r')
        drawnow

        set(handles.axes1, 'YLim', [-4 4], 'XLim', [-4 4]); %// Set axis limits

        guidata(hFig,handles);

    end

    function UpdateY(~)

         handles = guidata(hFig); %// Get handles.

        %// Get position of both sliders
        xval = (get(handles.x_slider,'value'));
        yval = (get(handles.y_slider,'value'));

        handles.AllPositions = [handles.AllPositions; xval yval];

        hold on
         %// Draw markers        
        scatter(handles.AllPositions(end,1),handles.AllPositions(end,2),100,'b','filled')
        drawnow

        set(handles.axes1, 'YLim', [-4 4], 'XLim', [-4 4]); %// Set axis limits


        guidata(hFig,handles);

    end

    function UpdateX(~)

         handles = guidata(hFig); %// Get handles.

        %// Get position of both sliders
        xval = (get(handles.x_slider,'value'));
        yval = (get(handles.y_slider,'value'));

        handles.AllPositions = [handles.AllPositions; xval yval];

        hold on
         %// Draw markers        
        scatter(handles.AllPositions(end,1),handles.AllPositions(end,2),100,'b','filled')
        drawnow

        set(handles.axes1, 'YLim', [-4 4], 'XLim', [-4 4]); %// Set axis limits


        guidata(hFig,handles);

    end
end

示例输出:

请注意,移动速度越慢,曲线图上的点就越接近。我移动得相当快,因此一些点之间有很大的空间。

玩得开心!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30055535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档