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

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

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

方法二:等面积法

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

具体代码就不写了。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值