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

来源:互联网 发布:手机淘宝支付宝登陆 编辑:程序博客网 时间:2024/06/07 04:01

今天中午写的一个笔试题里的一个题目,算法思想有几种。

(图片来源: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 exceptione.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的叉乘大于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;}}

方法二:等面积法

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

具体代码就不写了。


原创粉丝点击