function score=scene_two_plot()
%函数实现目标在山上柱子上的场景.
%函数返回分数.
%绘制背景
varible=scene_two();
[A,hill_distance,hill_start,hill_end,object_x,object_hill_high,object_y,frequency]=varible_interpretation(varible) %参数传递
%鼠标点击获取速度和角度
initialization=initialize;
[vx_start,vy_start,g]=initialization_interpretition(initialization)
%时间的计算
t_pillar=object_x/vx_start; %达到目标点横坐标的时间
fly_height_pillar=vy_start*t_pillar-0.5*g*t_pillar^2; %达到目标点横坐标时飞行的高度
hill_center=(hill_start+hill_end)/2; %山的中心点位置
t_hill_center=hill_center/vx_start; %飞行到山的中心位置的时候的时间
fly_height_hill_center=vy_start*t_hill_center-0.5*g*t_hill_center^2;%飞行到山的中心位置的高度
t_hill_start=hill_start/vx_start; %飞行到山最左边的时间
fly_height_hill_start=vy_start*t_hill_start-0.5*g*t_hill_start^2;%飞行到山最左边时的高度
t_hill_end=hill_end/vx_start; %飞行到山最右边的时间
fly_height_hill_end=vy_start*t_hill_end-0.5*g*t_hill_end^2;%飞行到山最右边时的高度
t_fall=vy_start/g*2; %落地时间
fly_xmax=t_fall*vx_start; %落地最大距离
%各种情况的判断
if object_x<=hill_center %如果柱子在山左半边
%如果没有达到山,直接落地
if fly_xmax<=hill_start
condition_fall_plot(fly_xmax,vy_start,vx_start,g);
else
%如果击在柱子上或者目标上
if (fly_height_pillar>=object_hill_high)&&(fly_height_pillar<=object_y) %如果在柱子上
[horizantal_collision,height_collision,score]=shoot_pillar(object_x,object_y,vx_start,vy_start,g);%击在柱子上判断
plot_left1_2_3_4(horizantal_collision,height_collision,g,vx_start,vy_start);%绘制轨迹和撞击点
%如果撞到山左端点和柱子中间位置
elseif fly_height_pillar<object_hill_high
deta_final =110; %初始化
for t=t_hill_start:0.00001:t_pillar %飞到山的左边的时间-飞到柱子横坐标对应的时间
fly_height=vy_start*t-0.5*g*t^2; %此时飞行的高度
hill_height=A*sin(frequency*(vx_start*t-hill_start));%此时山的高度
deta = abs(fly_height - hill_height); %计算飞行高度与山高度差
%找到山高与飞行高度差值最小的点作为撞击点
if(deta<deta_final) %与初始差值比较
deta_final = deta; %若小于则保存
t_collision=t; %撞击时间为当前的时间
height_collision=fly_height; %撞击竖直位置为飞行高度
horizantal_collision=vx_start*t_collision; %撞击水平位置
end
end
plot_left1_2_3_4(horizantal_collision,height_collision,g,vx_start,vy_start);%轨迹展示
% disp('击在山上'); %结果展示
score=0; %分数返回
show_result(score);
%击中在柱子右侧,山峰左侧的位置
elseif (fly_height_pillar>object_y)&&(fly_height_hill_center<=A) %如果在柱子横坐标位置高度大于目标点高度,同时在山的中心点高度小于等于山峰值
deta_final=110; %初始化
for t=t_pillar:0.00001:t_hill_center
fly_height=vy_start*t-0.5*g*t^2; %此时飞行的高度
hill_height=A*sin(frequency*(vx_start*t-hill_start));%此时山的高度
deta = abs(fly_height - hill_height); %计算飞行高度与山高度差
%找到山高与飞行高度差值最小的点作为撞击点
if(deta<deta_final) %与初始差值比较
deta_final = deta; %若小于则保存
t_collision=t; %撞击时间为当前的时间
height_collision=fly_height; %撞击竖直位置为飞行高度
horizantal_collision=vx_start*t_collision; %撞击水平位置
end
end
plot_left1_2_3_4(horizantal_collision,height_collision,g,vx_start,vy_start);%路线展示
% disp('击在山上'); %结果展示
score=0; %分数返回
show_result(score);
%如果越过山峰且击中在右半边山上
elseif (fly_height_hill_center>A)&&(fly_xmax<hill_end)
deta_final=110; %初始化
for t=t_hill_center:0.00001:t_fall
fly_height=vy_start*t-0.5*g*t^2; %此时飞行的高度
hill_height=A*sin(frequency*(vx_start*t-hill_start));%此时山的高度
deta = abs(fly_height - hill_height); %计算飞行高度与山高度差
%找到山高与飞行高度差值最小的点作为撞击点
if(deta<deta_final) %与初始差值比较
%%disp('ooooxxxx');
deta_final = deta; %若小于则保存
t_collision=t; %撞击时间为当前的时间
height_collision=fly_height; %撞击竖直位置为飞行高度
horizantal_collision=vx_start*t_collision; %撞击水平位置
end
end
plot_left1_2_3_4(horizantal_collision,height_collision,g,vx_start,vy_start); %路线展示
% disp('击在山上');
score=0;
show_result(score);
%如果直接越过整座山
else
score=directly_fall_plot(fly_xmax,vx_start,vy_start,g); %路线展示
end
end
%%柱子在右半边的山上
else
%直接落地的情况
if fly_xmax<=hill_start
condition_fall_plot(fly_xmax,vy_start,vx_start,g);
else
%击在左半边的山上
if fly_height_hill_center<A %如果飞行到山中间位置上的高度小于山峰高度
deta_final=110; %初始化
for t=t_hill_start:0.00001:t_hill_center %在最左边和中间检测撞击点
fly_height=vy_start*t-0.5*g*t^2; %此时飞行的高度
hill_height=A*sin(frequency*(vx_start*t-hill_start));%此时山的高度
deta = abs(fly_height - hill_height); %计算飞行高度与山高度差
%找到山高与飞行高度差值最小的点作为撞击点
if(deta<deta_final) %与初始差值比较
deta_final = deta; %若小于则保存
t_collision=t; %撞击时间为当前的时间
height_collision=fly_height; %撞击竖直位置为飞行高度
horizantal_collision=vx_start*t_collision; %撞击水平位置
end
end
plot_left1_2_3_4(horizantal_collision,height_collision,g,vx_start,vy_start);%路线展示
% disp('击在山上');
score=0;
show_result(score);
%击在柱子与山峰之间
elseif (fly_height_hill_center>A)&&(fly_height_pillar<object_hill_high)
deta_final=110; %初始化
for t=t_hill_center:0.00001:t_pillar %在山中间到柱子中间找到撞击点
fly_height=vy_start*t-0.5*g*t^2; %此时飞行的高度
hill_height=A*sin(frequency*(vx_start*t-hill_start));%此时山的高度
deta = abs(fly_height - hill_height); %计算飞行高度与山高度差
%找到山高与飞行高度差值最小的点作为撞击点
if(deta<deta_final) %与初始差值比较
deta_final = deta;