1:首先需要知道起点,终点,激光宽度
2:判断所有的敌人与激光起点,终点连接起来的线段的垂直距离,如果小于激光宽度/2就说明打到了(注意敌人是有体积的)
基本没什么难点,如果有就是计算敌人与线段的垂直距离。
下面是计算距离的代码
/*********************************/
// 如果经过点做直线的垂足,垂足落在线段上,则取垂线段的距离
// 否则取到线段两端点距离的最小值
//
// 参数:
// point: 存储点的xy坐标
// p1, p2: 线段的两点
//
// return: 点到线段的最小距离
/*********************************/
private static double distance(Point p, Point p1) {
return Math.hypot(p.x-p1.x, p.y-p1.y);
}
//点到线段的最短距离,x0,y0是圆心
private static double pointToLine(Point p1,Point p2, Point p) {
double ans = 0;
double a, b, c;
a = distance(p1, p2);
b = distance(p1, p);
c = distance(p2, p);
if (c+b==a) {//点在线段上
ans = 0;
return ans;
}
if (a<=0.00001) {//不是线段,是一个点
ans = b;
return ans;
}
if (c*c >= a*a + b*b) { //组成直角三角形或钝角三角形,p1为直角或钝角
ans = b;
return ans;
}
if (b * b >= a * a + c * c) {// 组成直角三角形或钝角三角形,p2为直角或钝角
ans = c;
return ans;
}
// 组成锐角三角形,则求三角形的高
double p0 = (a + b + c) / 2;// 半周长
double s = Math.sqrt(p0 * (p0 - a) * (p0 - b) * (p0 - c));// 海伦公式求面积
ans = 2*s / a;// 返回点到线的距离(利用三角形面积公式求高)
return ans;
}
网友评论