您的位置:首页 > 其它

【计算几何】击中目标 pascal 解题…

2015-02-02 19:25 232 查看
【计算几何】击中目标
Time Limit:1000MS  Memory
Limit:65536KTotal Submit:14 Accepted:9
Description
击中目标(inside.pas/c/cpp)【问题描述】现需要一个系统,对射击的准确率进行测试。一个射击者对一个目标发射n颗子弹,已知发射n颗子弹所击中的位置和目标所在位置,判断有多少颗子弹能打到目标内。目标是一个凸多边形区域,并且按顺时针或逆时针逐一给出顶点坐标,每一发子弹击中位置是一个坐标。规定子弹击中目标的边上或顶点也算打到目标内。请你编程实现这个系统。Input
输入文件中包含以下内容,第一行为多边形顶点数n和发射子弹数目m;接下来n行为每个顶点坐标(按顺时针或逆时针顺序);再接下来m行为每颗子弹所击中的位置坐标。Output
输出文件输出占一行,输出子弹击中目标的数目。Sample
Input


Sample
Output


Source
 
读入分为 顺时针 和
逆时针 两种。

当顺时针时,第三个读入的点在 第一,二个读入点组成的向量
的右边,d=false;

当逆时针时,第三个读入的点在 第一,二个读入点组成的向量
的左边,d=true;

当顺时针时,一点必须在所有边的右边(pan=false)或在边上,这点才在多边形中
当逆时针时,一点必须在所有边的左边(pan=true
)或在边上,这点才在多边形中

 
 
type arr=record x,y:longint; end; var d:boolean; n,m,i,tot,x,y:longint; a:array[1..100]of
arr; function
pan(p1,p2,x,y:longint):boolean;var i:longint;begin i:=(a[p2].x-a[p1].x)*(y-a[p1].y)-(a[p2].y-a[p1].y)*(x-a[p1].x); if
i>0 then exit(true); if
i<0 then exit(false); if
i=0 then exit(d);end; function
add(x,y:longint):boolean;var j:longint; b:boolean;begin   for
j:=1 to n-1 do   
if pan(j,j+1,x,y)<>d then
exit(false);   if
pan(n,1,x,y)<>d then
exit(false);  
exit(true);end; begin tot:=0; read(n,m); read(a[1].x,a[1].y); read(a[2].x,a[2].y); read(a[3].x,a[3].y); d:=pan(1,2,a[3].x,a[3].y);  for i:=4 to n
do 
read(a[i].x,a[i].y); for i:=1 to m
do 
begin  
read(x,y);   if
add(x,y) then inc(tot); 
end; writeln(tot);end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: