华为oj 之 判断点是否在三角形内
2016-01-11 03:01
405 查看
/*
* 任意顶点为A、B、C的三角形,如果点P在三角形内,那么
* 1)点P和点C在AB边的同一侧 2)点P和点A在BC边的同一侧 3)点P和点B在AC边的同一侧
* 反之亦然(充要条件)
*
* 关键:如何判断某两个点在某条直线的同一侧
* 参考图示发现:
* 对于点P: AB*BC的方向 和 AB*BP的方向相同
* 对于点P1: AB*BC的方向 和 AB*BP1的方向不同
* 故:对于边AB,以及点C、P,如果AB*BC的方向 和 AB*BP的方向相同,
* 那么点P和C在边AB的同一侧。
*/
* 任意顶点为A、B、C的三角形,如果点P在三角形内,那么
* 1)点P和点C在AB边的同一侧 2)点P和点A在BC边的同一侧 3)点P和点B在AC边的同一侧
* 反之亦然(充要条件)
*
* 关键:如何判断某两个点在某条直线的同一侧
* 参考图示发现:
* 对于点P: AB*BC的方向 和 AB*BP的方向相同
* 对于点P1: AB*BC的方向 和 AB*BP1的方向不同
* 故:对于边AB,以及点C、P,如果AB*BC的方向 和 AB*BP的方向相同,
* 那么点P和C在边AB的同一侧。
*/
public class POINT { int x; int y; public POINT(int x,int y) { this.x=x; this.y=y; } }
public class Main { /* * 求叉积 正:Z轴正向 ;负:Z轴负向;绝对值:叉积的模(以两个向量为边的平行四边形的面积) * eg : 求a*b 向量a = (x1, y1, z1) 向量b = (x2, y2, z2) * 因为a和b在三角形中,所以z1 = 0、z2 = 0, * 所以 |a*b| = |x1·y2 - x2·y1| * 详见:https://zh.wikipedia.org/zh/%E5%90%91%E9%87%8F%E7%A7%AF */ private static int crossProduct(POINT A, POINT B, POINT C, POINT D) { int x1 = B.x - A.x; int y1 = B.y - A.y; int x2 = D.x - C.x; int y2 = D.y - C.y; return (x1*y2 - x2*y1); } // 叉积得到的方向是否相同 true:方向相同;false:方向不同 private static boolean isSameDirection(POINT A, POINT B, POINT C, POINT P) { int Direction1 = crossProduct(A, B, B, C); int Direction2 = crossProduct(A, B, B, P); if (Direction1*Direction2 >= 0) { // 等于0:两个向量平行 (说明P点在三角形的AB边上) return true; } return false; } // 判断P点是否在顶点为A、B、C的三角形内(在三角形的边上,也视作在三角形中) public static boolean isInTriangle(POINT A, POINT B, POINT C, POINT P) { if (isSameDirection(A, B, C, P) && isSameDirection(B, C, A, P) && isSameDirection(C, A, B, P)) { return true; } return false; } public static void main(String[] args) { POINT A=new POINT(0,0); POINT B=new POINT(0,80); POINT C=new POINT(80,0); POINT P=new POINT(20,60); boolean b1 = isInTriangle(A, B, C, P); // true POINT A2=new POINT(0,0); POINT B2=new POINT(0,80); POINT C2=new POINT(80,0); POINT P2=new POINT(21,60); boolean b2 = isInTriangle(A2, B2, C2, P2); // false String result = null; System.out.println(result); } }
相关文章推荐
- php配置文件中Directory和filematch互相影响
- Mac上的软件使用介绍
- 使用TCP协议传输信息演示
- ROS7—理解ROS服务和参数
- sublime3侧边栏颜色修改,推荐主题
- MapReduce初探
- Hbase和Oracle的对比
- 关于flask 上直接使用py.test测试框架进行测试
- Hbase建模
- apache用户认证和静态缓存疑惑
- [树]输出二叉树的节点层数
- redhat5.9安装filezilla3.7报错
- LeetCode Lowest Common Ancestor of a Binary Tree
- Android笔记(七十五) Android中的图片压缩
- ISO/IEC 9899:2011 条款6.9——外部定义
- BrocastReceiver初阶
- navigationBar上的一些操作
- C语言-十进制转二进输出
- Facebook POP 进阶指南
- 《C语言及程序设计初步》第33讲实践项目