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

时间:2021-08-30 10:24:42

                                                           转载请注明出处: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判断一个点是否在三角形内(随机函数的用法)


——————————我是低调的分割线————————————

下面说一下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");
}