您的位置:首页 > 理论基础 > 计算机网络

(某网络公司笔试题)判断一个点是否在三角形内

2017-09-18 17:15 330 查看
今天中午写的一个笔试题里的一个题目,算法思想有几种。

(图片来源:http://www.cnblogs.com/TenosDoIt/p/4024413.html)

题目:写一个程序判断点p是否在三角形内。

算法一:向量的叉乘

实现算法:向量的叉乘。



 a x b = (^n) * |a| * |b| * sin<a, b>

a x b >0 说明ap与ab同向且在左侧

所以只要判断向量p与各定点组成的向量与abc两两组成的向量的叉乘是否都大于0即可。

实现代码:

import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.util.ArrayList;

//判断点是否在三角形内
public class test2 {
public static void main(String[] args)
{
ArrayList<Point> al = new ArrayList<Point>();
InputStreamReader isr = new InputStreamReader (System.in);
BufferedReader br = new BufferedReader(isr);

//输入各点坐标,放入al中
for(int i=0;i<4;i++)
{
try {
double x=0;
double y=0;
if(i<3)
{

System.out.println("请输入三角形的一个顶点坐标:");

}
else{

System.out.println("请输入点p的坐标:");

}
System.out.println("x:");
String s_x=br.readLine();
x=Double.parseDouble(s_x);
System.out.println("y:");
String s_y = br.readLine();
y=Double.parseDouble(s_y);
Point u = new Point(x, y);
al.add(u);

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{

}
}
//创建三角形
Sanjiao abc = new Sanjiao(al.get(0), al.get(1), al.get(2));

if(checkInside(abc,al.get(3)))
{
//点在三角形里面
System.out.print("ok");
}else{
//点不在三角形里面
System.out.println("err");
}
}

//返回ab与ap的叉乘
public static double cross(Point a,Point b,Point p)
{
return ((b.x - a.x)*(p.y - a.y) - (b.y - a.y)*(p.x - a.x));
}

//判断点是否在三角形里面
public static boolean checkInside(Sanjiao abc,Point p)
{
boolean b =false;
//如果向量ab,ac,bc与ap,bp的叉乘大
4000
于0且三角形不是一条直线那么返回ture
if(cross(abc.a,abc.b,p)>0&&cross(abc.a,abc.c,p)>0
&&cross(abc.b,abc.c,p)>0&&cross(abc.a, abc.b, abc.c)!=0)
{
b=true;
}

return b;

}
}
//点坐标类
class Point
{
double x;
double y;
public Point(double x, double y)
{
this.x=x;
this.y=y;
}
}
//组成三角形类
class Sanjiao
{
Point a;
Point b;
Point c;
public Sanjiao(Point a,Point b,Point c)
{
this.a=a;
this.b=b;
this.c=c;
}
}

方法二:等面积法
实现算法:如果一个点在三角形内,其与三角形的三个点构成的三个子三角形的面积等于大三角形的面积。否则,大于大三角形的面积。

具体代码就不写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: