华为oj 之 判断点是否在三角形内

/*
* 任意顶点为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的同一侧。
*/

1 public class POINT {
2     int x;
3     int y;
4     public POINT(int x,int y)
5     {
6         this.x=x;
7         this.y=y;
8     }
9 }
 1 public class Main {
 2
 3     /*
 4      *      求叉积   正:Z轴正向 ;负:Z轴负向;绝对值:叉积的模(以两个向量为边的平行四边形的面积)
 5      *      eg : 求a*b  向量a = (x1, y1, z1) 向量b = (x2, y2, z2)
 6      *           因为a和b在三角形中,所以z1 = 0、z2 = 0,
 7      *           所以 |a*b| = |x1·y2 - x2·y1|
 8      *           详见:https://zh.wikipedia.org/zh/%E5%90%91%E9%87%8F%E7%A7%AF
 9      */
10     private static int crossProduct(POINT A, POINT B, POINT C, POINT D) {
11         int x1 = B.x - A.x;
12         int y1 = B.y - A.y;
13
14         int x2 = D.x - C.x;
15         int y2 = D.y - C.y;
16
17         return (x1*y2 - x2*y1);
18     }
19
20     // 叉积得到的方向是否相同 true:方向相同;false:方向不同
21     private static boolean isSameDirection(POINT A, POINT B, POINT C, POINT P) {
22         int Direction1 = crossProduct(A, B, B, C);
23         int Direction2 = crossProduct(A, B, B, P);
24         if (Direction1*Direction2 >= 0) { // 等于0:两个向量平行 (说明P点在三角形的AB边上)
25             return true;
26         }
27         return false;
28     }
29
30     // 判断P点是否在顶点为A、B、C的三角形内(在三角形的边上,也视作在三角形中)
31     public static  boolean isInTriangle(POINT A, POINT B, POINT C, POINT P)
32     {
33         if (isSameDirection(A, B, C, P) && isSameDirection(B, C, A, P) && isSameDirection(C, A, B, P)) {
34             return true;
35         }
36         return false;
37     }
38
39     public static void main(String[] args) {
40
41         POINT A=new POINT(0,0);
42         POINT B=new POINT(0,80);
43         POINT C=new POINT(80,0);
44         POINT P=new POINT(20,60);
45         boolean b1 = isInTriangle(A, B, C, P);  // true
46
47         POINT A2=new POINT(0,0);
48         POINT B2=new POINT(0,80);
49         POINT C2=new POINT(80,0);
50         POINT P2=new POINT(21,60);
51         boolean b2 = isInTriangle(A2, B2, C2, P2);  // false
52
53
54         String result = null;
55         System.out.println(result);
56     }
57 }
时间: 2024-08-05 02:26:40

华为oj 之 判断点是否在三角形内的相关文章

【华为练习题】判断点是否在三角形中

[华为练习题]判断点是否在三角形中 题目 一个二维坐标系中(100*100,每一维0~99),已知三角形三个顶点的坐标A.B.C,判断坐标系中的任意点:P,是否在三角形内(在三角形边上也认为在三角形内) 请实现如下接口 /* 功能:点是否在三角形内 输入:三角形三顶点坐标:A.B.C,以及待确认的点:P 输出:无 返回:在三角形内返回true,否则返回false */ public static boolean isInTriangle(POINTA, POINTB, POINTC, POINT

华为OJ:2199 判断输入字符串中的括号匹配

根据不同的括号有个计数器,在遍历时,当计数器小于0则返回false或者当遍历完后,计数器仍旧不为零,也返回false. import java.util.Scanner; public class bracketsMatch { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); int a=0; int b=0; int c=0; for

判断点是否在三角形内【转】

概述 给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内.这是游戏设计中一个常见的问题.需要注意的是,这里假定点和三角形位于同一个平面内. 本文介绍三种不同的方法,由浅入深 一 内角和法 连接点P和三角形的三个顶点得到三条线段PA,PB和PC,求出这三条线段与三角形各边的夹角,如果所有夹角之和为180度,那么点P在三角形内,否则不在,此法直观,但效率低下. 二 同向法 假设点P位于三角形内,会有这样一个规律,当我们沿着ABCA的方向在三条边上行走时,你会发现点P始终位于边AB,BC和

判断点是否在三角形内

http://www.cnblogs.com/graphics/archive/2010/08/05/1793393.html#!comments 本文只是翻译和整理,原文在此http://www.blackpawn.com/texts/pointinpoly/default.html 概述 给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内.这是游戏设计中一个常见的问题.需要注意的是,这里假定点和三角形位于同一个平面内. 本文介绍三种不同的方法,由浅入深 一 内角和法 连接点P和三

2D空间中判断一点是否在三角形内

本来打算做三角形填充多边形,但需要用到耳切法正在看.所以先研究了这个 要注意如果是XY坐标轴的2D空间,要取差乘分量z而不是y. 实现原理是,将三角形ABC三个边(AB,BC,CA)分别与比较点判断差乘,如果这3个差乘结果表示的方向一致,说明就在三角形内. 效果: 代码(Unity3D): using UnityEngine; using System.Collections; using System.Collections.Generic; public class TriangleColl

二维平面上判断点是否在三角形内

最近在项目中碰到的这个问题,在此记录一下.已知三角形的三个顶点坐标,判断某个点是否在三角形中(在三角形的边上,我们也视作在三角形中),本文给出了三种方法.   算法1 利用面积法,如上图所示,如果点P在三角形ABC的内部,则三个小三角形PAB, PBC, PAC的面积之和 = ABC的面积,反之则不相等. 已知三角形的三个顶点坐标求其面积,可以根据向量的叉乘,参考here. 该算法详见后面的函数:IsPointInTriangle1   算法2 首先看一下这个问题,如何判断某两个点在某条直线的同

【TOJ 3005】Triangle(判断点是否在三角形内)

描述 Given the coordinates of the vertices of a triangle,And a point. You just need to judge whether the point is in the Triangle. 输入 The input contains several test cases. For each test case, only line contains eight integer numbers , describing the c

华为OJ测试题——判断输入的字符串是不是一个有效的IP地址(附世上最全测试数据)

题目标题: 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP地址 约束 输入IP为XXX.XXX.XXX.XXX格式 字符串两端含有空格认为是合法IP 字符串中间含有空格认为是不合法IP 类似于 01.1.1.1, 1.02.3.4  IP子段以0开头为不合法IP 子段为单个0 认为是合法IP,0.0.

几种方法判断平面点在三角形内

最近在做一个Unity实现的3D建模软件,其中需要在模型表面进行操作的时候,需要用到点和三角形位置关系的判定算法.由于一个模型往往是几千个三角片,所以这个判定算法必须高效,否则会影响最终程序的整体性能.这里记录一下一些算法,如有误请指出,谢谢! 首先假设点和三角形在同一平面内,如果不在同一平面,需要用其它方法先筛选. 常用的几种平面点-三角形位置关系判定方法有(以下算法执行必须先保证点和三角形位于同平面): 1.顺时针/逆时针判定法 该方法要求点的顺序是顺时针或逆时针的,如果是顺时针的点,沿着3