现在的位置: 首页 > 综合 > 正文

Java判断一个点是否在三角形内(随机函数的用法)

2013年10月21日 ⁄ 综合 ⁄ 共 1993字 ⁄ 字号 评论关闭

                                                           转载请注明出处: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");
		}

抱歉!评论已关闭.