(某网络公司笔试题)判断一个点是否在三角形内
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;
}
}
方法二:等面积法
实现算法:如果一个点在三角形内,其与三角形的三个点构成的三个子三角形的面积等于大三角形的面积。否则,大于大三角形的面积。
具体代码就不写了。
(图片来源: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;
}
}
方法二:等面积法
实现算法:如果一个点在三角形内,其与三角形的三个点构成的三个子三角形的面积等于大三角形的面积。否则,大于大三角形的面积。
具体代码就不写了。
相关文章推荐
- js判断一点是否在一个三角形内
- 判断输入的三个数据是否可以构成一个三角形
- 写一个方法void triangle(int a,int b,int c),判断三个参数是否能构成一个三角形。如果不能则抛出异常IllegalArgumentException,显示异常信息:a,b,
- 判断是否为递增数组(某同事最近去某公司遇到的笔试题)
- 其他题目---判断一个点是否在三角形内部
- Algorithm: 如何判断一个点是否在一个三角形内
- 判断点是否在一个三角形内部
- 一行代码判断一个数x是否是2的次幂(笔试题)
- 判断点是否在一个三角形内部
- 怎样判断一个坐标是否在已知三角形内?
- Algorithm: 如何判断一个点是否在一个三角形内
- 判断一个点是否在三角形内(面积法,三个点求三角形面积)
- 判断一个点是否在一个三角形面内
- js判断一点是否在一个三角形内
- 设计一个三角形类,能够输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形
- 判断三个参数是否能构成一个三角形
- Qt 判断一个点是否落在三角形内(算法)
- 定义一个函数,判断三个整形边长能否构成三角形,如果是三角形,则判断它是否是直角三角形。
- 判断一个点是否在一个三角形内(二维)
- Algorithm: 如何判断一个点是否在一个三角形内