Java HdAcm1174
2014-03-20 22:38
281 查看
空间一般直线的方程是: (x-x0)/a=(y-y0)/b=(z-z0)/c, 这是一条过(x0,y0,z0),方向矢量为{a,b,c}的直线. 假设已知点的坐标是A(e,f,g),过A点,且与{a,b,c}垂直的平面是, a(x-e)+b(y-f)+c(z-g)=0,直线(x-x0)/a=(y-y0)/b=(z-z0)/c,与这个平面的交点是B, 再由两点的距离公式求出AB,即得.
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); while(n != 0){ float[] enemy = new float[5]; for(int i = 0; i < 5; i++){ enemy[i] = cin.nextFloat(); } float[] soldier = new float[8]; for(int i = 0; i < 8; i++){ soldier[i] = cin.nextFloat(); } boolean b = hit(enemy, soldier); if(b){ System.out.println("YES"); } else { System.out.println("NO"); } n--; } cin.close(); } public static boolean hit(float[] enemy, float[] soldier){ //敌人头的中心 h1,r1,x1,y1,z1 float r1 = enemy[1]; //float[] centerEnemyHead = {enemy[2], enemy[3], enemy[0] - enemy[1] + enemy[4]}; //警察瞄准敌人时人头的中心 h2,r2,x2,y2,z2,x3,y3,z3 float h2 = soldier[0]; float r2 = soldier[1]; float height = h2 * 0.9f - r2 ;//实际高度 低 0.1 float[] direction = {soldier[5], soldier[6], soldier[7]}; float a = direction[0], b = direction[1], c = direction[2]; float x0 = soldier[2], y0 = soldier[3], z0 = soldier[4] + height; float e = enemy[2], f = enemy[3], g = enemy[0] - enemy[1] + enemy[4]; float fenmu = a*a/b + b + c*c/b; float fenzi = a*a*y0/b - a*x0 + a*e + b*f + c*c*y0/b - c*z0 +c*g; float y = fenzi / fenmu; float x = a*(y - y0)/b + x0; float z = c*(y - y0)/b + z0; //两点距离平方 float doubleR = (x-e)*(x-e) + (y-f)*(y-f) + (z-g)*(z-g); if(doubleR > r1*r1) return false; else { return true; } } }
相关文章推荐
- Java 大数加法HdAcm1002
- java初学者必读-经验总结
- Java 线程综合述
- 运用加密技术保护Java源代码
- Java IO 综述
- java如何存取image字段
- java程序员面试复习资料2——[JAVA基本概念]
- Java中文处理学习笔记——Hello Unicode
- 跟老紫竹学Java-留言板项目
- java
- TIOBE的头头儿和“反Java”的教授
- JAVA APPLET读本地文件权限问题及解决办法一
- Java核心API需要掌握的程度
- 用Java的模式匹配来提取网页中所需内容
- java中环境变量设置
- JAVA基础知识(三)
- java与structs的国际化
- 使用Java中的final变量需要注意的地方
- JAVA代码实现执行CMD命令
- Java程序员的10个必备技能