雪墨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 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启