我在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
答案 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)