在matlab中回调

时间:2014-06-03 02:52:29

标签: matlab animation callback

我在matlab中有一个用户交互式动画,其中一个形状被翻译并在一个绘图上旋转,用户必须点击它。如果他们点击它,他们的分数会增加,如果没有,动画就会停止。由于某种原因,程序似乎没有注册用户的点击,我不确定为什么。我已经发布了以下代码。任何帮助将不胜感激。

动画功能:

function movingPolygon
global gUserHitPolygon;
global gCurrentXVertices;
global gCurrentYVertices;
gUserHitPolygon = true;
global gScore;
nSides =4;
%Polar points
r=1;
theta = pi/nSides * (1:2:2*nSides-1);

%Cartesisn points
x0 = r * cos(theta);
y0 = r * sin(theta);
nFrames = 100;
xx = linspace(0,10, nFrames);
yy = xx;

rr = linspace(0, 2*pi, nFrames);
h = figure;
set(h,'WindowButtonDownFcn',   @mouseDownCallback);
i=1;
while gUserHitPolygon

    rX = [cos(rr(i)), -sin(rr(i))];
    rY = [sin(rr(i)), cos(rr(i))];

    x1 = rX * [x0; y0];
    y1 = rY * [x0; y0];

    x2= x1 + xx(i);
    y2= y1 + yy(i);
    gCurrentXVertices=x2;
    gCurrentYVertices=y2;
    y=fill(x2, y2, 'b');

    xlim([0,10]); ylim([0,10]);
    hold on;
    pause(0.000000003);
    delete(y);
    title(sprintf('Score: %d', gScore));
    i=i+1;
    if i>nFrames
        i=1;
    end
end
end

回调功能

function mouseDownCallback(~,~)

global gUserHitPolygon;
global gCurrentXVertices;
global gCurrentYVertices;
global gScore;
gScore=0;

xVertices = gCurrentXVertices;
yVertices = gCurrentYVertices;

% if we have valid (so non-empty) sets of x- and y-vertices then...
if isempty(xVertices) && isempty(yVertices)

    % get the coordinate on the current axis
    coordinates = get(gca,'CurrentPoint');
    coordinates = coordinates(1,1:2);

    % if the coordinate is not in the polygon, then change the
    % flag
    if inpolygon(coordinates(1),coordinates(2),xVertices,yVertices)
        gUserHitPolygon = false;
    else
        gScore=gScore+1;
    end
end
end

1 个答案:

答案 0 :(得分:0)

我发现您的代码存在3个问题。

首先,在回调函数中将gScore的值初始化为0。这意味着每次单击鼠标时,gScore都设置为0.而是在主函数中将其初始化为0,就在将其定义为全局变量之后,只需调用global gScore回调。

其次,您使用if语句来确定您是否拥有点击的有效坐标集,如果是,则要执行某些代码。但是,您的if语句正在测试输入是否为空,并且仅在它们运行时才会测试。将if语句更改为

if ~isempty(xVertices) && ~isempty(yVertices)
如果您有有效(非空)输入,

将评估为1

第三,您对用户在多边形内部或外部单击的测试具有相同的问题。如果用户在多边形内部点击,inpolygon将为真,那么您将执行gUserHitPolygon = false;,而不是预期的gScore=gScore+1;。要解决这个问题,请再次否定您的情况:

if ~inpolygon(coordinates(1),coordinates(2),xVertices,yVertices)