转载请注明出处:http://blog.csdn.net/sunquana/article/details/12061671
Java判断一个点是否在三角形内(随机函数的用法) --------------By sunquan
题目: 本程序通过随机产生一个三角形,然后从控制台输入一个点P,结果判断点P是否在三角形内。
思路:是根据点P计算三角形的面积,来判断点是否在三角形内部。
//package sunquan; import java.math.*; import java.util.*; public class Triangle{ public static void main(String args[]) { int[] x = new int[3]; int[] y = new int[3]; // 三角形3个点 int px, py; Random r= new Random(30);//new 一个随机数对象给定种子(seed),如果两个种子相同产生的随机数序列相同 for (int i = 0; i < 3; i++) { x[i] =r.nextInt(30);//[0,30)之间的整数 y[i] = r.nextInt(30); //输出三角形的三个点 System.out.print("x["+i+"]=="+x[i]+" y["+i+"]=="+y[i]+"\n"); } System.out.print("please input the point of P :\n"); Scanner in = new Scanner(System.in); px = in.nextInt(); py = in.nextInt(); int Parea2 = 0; for (int i = 0; i < 3; i++) Parea2 += getArea(x[i] - px, y[i] - py, x[(i + 1) % 3] - px, y[(i + 1) % 3] - py); int area_ABC2 = getArea(x[1] - x[0], y[1] - y[0], x[2] - x[0], y[2] - y[0]); if (area_ABC2 == Parea2) System.out.print("点P在三角形内,因为"+area_ABC2+"=="+Parea2+"\n"); else System.out.print("点P不在三角形内,因为"+area_ABC2+"!="+Parea2+"\n"); } //计算三角形面积(这里是2倍) public static int getArea(int x1, int y1, int x2, int y2) { int area2 = (x1 * y2 - x2 * y1); return area2 < 0 ? -area2 : area2; } }
测试结果:
下面画一幅图,来解释这个用例:
-------------------------------我是低调的分割线-------------------------------------
下面说一下Java中随机函数的用法:
Java中其实存在着两种Random函数:
一、 java.lang.Math.Random;
Math.Random()函数是一个静态方法,(不能接收参数,默认种子为系统时间)能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。
for(int i=0;i<5;i++) { int rand=(int)(Math.random()*30);//需要强制转型为int System.out.println("num == "+rand); }
二、 java.util.Random;
在Java的API帮助文档中,总结了一下对这个Random()函数功能的描述:
1、 java.util.Random类中实现的随机算法是伪随机,默认种子(seed)的为系统当前时间,可自己设定一个种子(long类型);
2、相同种子数的Random对象,相同次数生成的随机数字是完全相同的;
3、Random类中各方法生成的随机数字都是均匀分布的;
Random r= new Random(30);//new 一个随机数对象给定种子(seed),如果两个随机数对象的两个种子相同, 那么产生的随机数序列相同
我们发现每次初次运行的三角形都相同,那是因为我们设定的随机数种子是个常量;
so,我们一般不设定随机种子,直接默认为系统时间,那么每次运行的结果就不同了;
Random r= new Random(30);//new 一个随机数对象给定种子(seed),如果两个种子相同产生的随机数序列相同 for (int i = 0; i < 3; i++) { int num =r.nextInt(30);//[0,30)之间的整数 System.out.print("num=="+num+"\n"); }