雪墨810 2022-11-16 15:30 采纳率: 81.3%
浏览 36
已结题

使用Java语言,通过设计实验的方法,利用随机函数,在一个10*10的正方形中,计算其内切三角形的面积。

使用Java语言编写一个程序,通过设计实验的方法,利用随机函数,在一个10*10的正方形中,计算其内切三角形的面积。

注(思路):使用用随机函数实验求面积,计算三角形和正方形面积之比是多少,进不步求出三角形的面积。

正方形里面的三角形,有几种情形:

(1)三角形一条边正好重叠正方形一条边,另外一点在正方形对面一条边的中点;

(2)三角形一条边正好重叠正方形一条边,对面一点可以随意设置而构成的三角形;

(3)三点在正方形不同的三条边上,这三点随机产生。

用实验模拟方法求出三角形面积,实验方法就是统计10000个以上随机点落在三角形里面的数量,然后再试10万以上个随机点的情况,等等。

  • 写回答

3条回答 默认 最新

  • qfl_sdu 2022-11-16 16:12
    关注

    创建3个函数,分别对应3个三角形的创建方法,用随机数生成0-3的随机数,用来确定跟那条边重叠,代码如下:

    
    public class Triangle {
        private int nlen; //边长
        private int xstart;  //矩形左下角x坐标
        private int ystart; //矩形左下角y坐标
        
        private double[][] points; //三个顶点
        
        
        Triangle(int x,int y,int len){
            xstart = x;
            ystart = y;
            nlen = len;
            points = new double[3][2];
        }
        Triangle(int len){
            xstart = 0;
            ystart = 0;
            nlen = len;
            points = new double[3][2];
        }
        
        
        //三角形一条边正好重叠正方形一条边,另外一点在正方形对面一条边的中点
        void create1(){
            int index = (int)(Math.random()*3); //生成0-3的随机数,对应 左边、上边、右边、下边
            switch(index)
            {
            case 0: //左边
                points[0][0] = xstart;
                points[0][1] = ystart;
                points[1][0] = xstart;
                points[1][1] = ystart + nlen;
                points[2][0] = xstart + nlen;
                points[2][1] = ystart + nlen/2.0;
                break;
            case 1: //上边
                points[0][0] = xstart;
                points[0][1] = ystart + nlen;
                points[1][0] = xstart + nlen;
                points[1][1] = ystart + nlen;
                points[2][0] = xstart + nlen/2.0;
                points[2][1] = ystart;
                break;
            case 2: //右边
                points[0][0] = xstart + nlen;
                points[0][1] = ystart + nlen;
                points[1][0] = xstart + nlen;
                points[1][1] = ystart;
                points[2][0] = xstart;
                points[2][1] = ystart + nlen/2.0;
                break;
            case 3: //下边
                points[0][0] = xstart;
                points[0][1] = ystart;
                points[1][0] = xstart + nlen;
                points[1][1] = ystart;
                points[2][0] = xstart + nlen/2.0;
                points[2][1] = ystart + nlen;
                break;
            }
        }
        
        //三角形一条边正好重叠正方形一条边,对面一点可以随意设置而构成的三角形
        void create2(){
            int index = (int)(Math.random()*3); //生成0-3的随机数,对应 左边、上边、右边、下边
            switch(index)
            {
            case 0: //左边
                points[0][0] = xstart;
                points[0][1] = ystart;
                points[1][0] = xstart;
                points[1][1] = ystart + nlen;
                points[2][0] = xstart + nlen;
                points[2][1] = (int)((nlen*Math.random()))+ystart;
                break;
            case 1: //上边
                points[0][0] = xstart;
                points[0][1] = ystart + nlen;
                points[1][0] = xstart + nlen;
                points[1][1] = ystart + nlen;
                points[2][0] = (int)((nlen*Math.random()))+xstart;
                points[2][1] = ystart;
                break;
            case 2: //右边
                points[0][0] = xstart + nlen;
                points[0][1] = ystart + nlen;
                points[1][0] = xstart + nlen;
                points[1][1] = ystart;
                points[2][0] = xstart;
                points[2][1] = (int)((nlen*Math.random()))+ystart;
                break;
            case 3: //下边
                points[0][0] = xstart;
                points[0][1] = ystart;
                points[1][0] = xstart + nlen;
                points[1][1] = ystart;
                points[2][0] = (int)((nlen*Math.random()))+xstart;
                points[2][1] = ystart+nlen;
                break;
            }
        }
        
        //生成三角形,3个点在不同的3条边上
        void create3(){
            int index = (int)(Math.random()*3); //生成0-3的随机数,对应 左边、上边、右边、下边
            //排除该边,使用剩余的3条边
            switch(index)
            {
            case 0: //不用左边
                //上边点
                points[0][0] = (int)((nlen*Math.random()))+xstart;
                points[0][1] = ystart+nlen;
                //右边点
                points[1][0] = xstart + nlen;
                points[1][1] = (int)((nlen*Math.random()))+ystart;
                //下边点
                points[2][0] = (int)((nlen*Math.random()))+xstart;
                points[2][1] = ystart;
                break;
            case 1: //不用上边
                //左边点
                points[0][0] = xstart;
                points[0][1] = (int)((nlen*Math.random()))+ystart;
                //右边点
                points[1][0] = xstart + nlen;
                points[1][1] = (int)((nlen*Math.random()))+ystart;
                //下边点
                points[2][0] = (int)((nlen*Math.random()))+xstart;
                points[2][1] = ystart;
                break;
            case 2://不用右边
                //左边点
                points[0][0] = xstart;
                points[0][1] = (int)((nlen*Math.random()))+ystart;
                //上边点
                points[1][0] = (int)((nlen*Math.random()))+xstart;
                points[1][1] = ystart + nlen;
                //下边点
                points[2][0] = (int)((nlen*Math.random()))+xstart;
                points[2][1] = ystart;
                break;
            case 3: //不用下边
                //左边点
                points[0][0] = xstart;
                points[0][1] = (int)((nlen*Math.random()))+ystart;
                //上边点
                points[1][0] = (int)((nlen*Math.random()))+xstart;
                points[1][1] = ystart+nlen;
                //右边点
                points[2][0] = xstart + nlen;
                points[2][1] = (int)((nlen*Math.random()))+ystart;
                break;
            }
        }
        
        
        //计算边长
        double triLength(double x1,double y1,double x2,double y2){
            return Math.sqrt((y2-y1)*(y2-y1) + (x2-x1)*(x2-x1));
        }
        
        //计算三角形的面积
        double area(){
            double a = triLength(points[0][1],points[0][0],points[1][1],points[1][0]);
            double b = triLength(points[0][1],points[0][0],points[2][1],points[2][0]);
            double c = triLength(points[2][1],points[2][0],points[1][1],points[1][0]);
            double q = (a+b+c)/2;
            return Math.sqrt(q*(q-a)*(q-b)*(q-c));
        }
        
        //显示坐标点
        void show(){
            System.out.print("("+points[0][0]+","+points[0][1]+") ");
            System.out.print("("+points[1][0]+","+points[1][1]+") ");
            System.out.println("("+points[2][0]+","+points[2][1]+")");
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Triangle t1 = new Triangle(10);
            t1.create1();
            t1.show();
            System.out.println("area="+t1.area());
            
            Triangle t2 = new Triangle(10);
            t2.create2();
            t2.show();
            System.out.println("area="+t2.area());
            
            Triangle t3 = new Triangle(10);
            t3.create3();
            t3.show();
            System.out.println("area="+t3.area());
            
            
        }
    
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月28日
  • 已采纳回答 11月20日
  • 修改了问题 11月16日
  • 赞助了问题酬金15元 11月16日
  • 展开全部

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。