代码先锋网 代码片段及技术文章聚合

Java实现Lagan法射线追踪(lagan.java)

import java.io.*;

class laganRayTracing{

        private float pi = 3.141592653f;

        private int nx,nz,nshot,nray,ngrid;
        private float dx,dz,s,dangle,fangle;

        private float[] v0;

        private String raypath;

        laganRayTracing(){
                
                nx = nz = 301;
                dx = dz = 5f;
                s = 0.5f;
                fangle = 0f;
                dangle = 4f;
                nray = 2;
                ngrid = nx * nz;

                raypath = "raypath.txt";

                v0 = new float [ngrid];
                for(int i=0;i<ngrid;i++){
                        v0[i] = 2000.0f;
                        if(i>150*nz)v0[i] = 3000f;
                    }
          }
        public void makeRay()throws java.io.IOException{

                float p_x,p_z,n_x,n_z,l_x,l_z;
                float p_xend,p_zend;
                float n_xnew,n_znew;

                float p_x0, p_z0, dip;

                int ip_lux,ip_ldx,ip_rux,ip_rdx;
                int ip_luz,ip_ldz,ip_ruz,ip_rdz;
                int irayon,ishot;

                float angle,time,v;

                p_x0 = (nx-1)*dx / 3;
                p_z0 = (nz-1)*dz / 2;

                p_x = p_x0;
                p_z = p_z0;

                Writer rayfp = new FileWriter(raypath);

                for(int iray = 0; iray < nray; iray++){

                        p_x = p_x0;
                        p_z = p_z0;

                        angle = fangle + iray*dangle;
                        angle = angle*pi/180.0f;
        
                        //System.out.println(angle);

                        n_x = (float)Math.cos(angle);
                        n_z = (float)Math.sin(angle);

                        time = 0.0f;


                        do{
                                /* cal_gridpoint */
                                ip_lux = (int)(p_x/dx);
                                ip_luz = (int)(p_z/dz);

                                ip_ldx = ip_lux;
                                ip_ldz = ip_luz+1;

                                ip_rux = ip_lux+1;
                                ip_ruz = ip_luz;

                                ip_rdx = ip_lux+1;
                                ip_rdz = ip_luz+1;


                                /* cal_gridvel */
                                float l_x1 = (v0[ip_rux*nz + ip_ruz]-v0[ip_lux*nz + ip_luz])/dx;
                                float l_x2 = (v0[ip_rdx*nz + ip_rdz]-v0[ip_ldx*nz + ip_ldz])/dx;
                                l_x = ( l_x1+l_x2 ) / 2.0f;

                                float l_z1=(v0[ip_ldx*nz + ip_ldz]-v0[ip_lux*nz + ip_luz])/dz;
                                float l_z2=(v0[ip_rdx*nz + ip_rdz]-v0[ip_rux*nz + ip_ruz])/dz;
                                l_z=(l_z1+l_z2)/2.0f;

                                v=v0[ip_rux*nz + ip_ruz]+v0[ip_lux*nz + ip_luz]+v0[ip_rdx*nz + ip_rdz]
                                        +v0[ip_ldx*nz + ip_ldz];
                                v=v/4.0f;

                                //System.out.println(v);

                                /* cal_path */
                                float dotmult_ln=l_x*n_x+l_z*n_z;
                                float dotmult_ll=l_x*l_x+l_z*l_z;
                                p_xend=p_x+n_x*s*(1f+dotmult_ln*0.5f*s/v)-0.5f*l_x*s*s/v
                                        -n_x*s*s*s*(dotmult_ll-dotmult_ln*dotmult_ln)/(6.0f*v*v);

                                p_zend=p_z+n_z*s*(1f+dotmult_ln*0.5f*s/v)-0.5f*l_z*s*s/v
                                        -n_z*s*s*s*(dotmult_ll-dotmult_ln*dotmult_ln)/(6.0f*v*v);

                                n_xnew=n_x*(1f+dotmult_ln*s/v)-l_x*s/v
                                        -n_x*s*s*(dotmult_ll-dotmult_ln*dotmult_ln)/(2.0f*v*v);

                                n_znew=n_z*(1f+dotmult_ln*s/v)-l_z*s/v
                                        -n_z*s*s*(dotmult_ll-dotmult_ln*dotmult_ln)/(2.0f*v*v);

                                time+=s/v*(1f+s*s*(dotmult_ll+dotmult_ln*dotmult_ln)
                                        /(6f*v*v)-dotmult_ln*s/(2f*v));

                                /* buffer */
                                p_x = p_xend;
                                p_z = p_zend;
                                n_x = n_xnew;
                                n_z = n_znew;

                                rayfp.write(p_x+"         "+p_z+"        \n");
                                //System.out.println(p_x+"         "+p_z+"        ");
                        
                        }while((p_xend>=0.0f)&&(p_xend<((nx-1f)*dx))&&(p_zend>=0.0f)&&(p_zend<(nz-1f)*dz));

                        rayfp.write("-999999.9      -999999.9   \n");
                    }
                rayfp.close();
          }

        public static void main(String[]args)throws java.io.IOException{
        
                laganRayTracing l = new laganRayTracing();
                l.makeRay();
          }
}

版权声明:本文为Rong_Toa原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Rong_Toa/article/details/78219846

智能推荐

Java模拟Tracert和ping命令实现跃点追踪

1. Tracert(跟踪路由)用于确定 IP数据包访问目标所采取的路径。 Tracert 命令使用用 IP 生存时间  (TTL) 字段和 ICMP错误消息来确定从一个Host到网络上其他主机的Router tracert命令能够显示你的数据包在网络上进行传输时经历的一个个大大小小的ISP的路由器。 2. PING (Packet Internet Groper),即因特网包...

java技术--SpringCloud:服务追踪Sleuth代码实现(20)

1.主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件 2.构建工程 3.构建ZipkinServer工程 4.改造EurekaClients 5.改造EurekaClientApplication,代码示例如下: 6.启动工程,演示追踪 7.参考文档...

Java Debug追踪,斗地主案例的简单实现

1、Debug追踪 Debug调试程序: 可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug。 使用方式: 在行号的右边,鼠标左键单击,添加断点(初学可以添加到每个方法的第一行,熟练之后哪里有bug添加到哪里) 右键,选择Debug执行程序,程序就会停留在添加的第一个断点处 执行程序: F8:逐行执行程序 F7:进入到方法中 shift + F8:跳出方法 F9:跳到下一个断点,如果没...

Java Agent字节码增强技术实现链路追踪

说明:使用bytebuddy框架来实现 RestTemplate链路追踪,并且将日志id追加到头部,借鉴 skywalking 中增强技术;直接上代码。 maven依赖 1. 入口类 2. 插件读取器 3. agent-plugin.def文件定义 4. 插件持有器 5. 插件定义的顶级接口类 6. 抽象插件类 7. 增强方法的顶级接口 8. 环绕方法的拦截器 9. 方法执行的包装方法 10. 实...

Java射线法判断一个点是否在一个多边形内部

看到网络上大量重复的博客,书写类似的代码。但英文解释并不清晰,希望通过此博客给出详尽解释。...

猜你喜欢

牛顿法和弦截法java实现

Java实现牛顿法和弦截法 写个数值分析作业用计算器算起来太麻烦咯,还是写些代码自动化一下 输出结果: ---------------------牛顿迭代法------------------------ x1=0.5663110031972182 x2=0.5671431650348623 x3=0.5671432904097811 x4=0.567143290409784 x5=0.56714...

Java动态追踪技术探究

引子 在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话: “Debug一下吧。” “线上机器,没开Debug端口。” “看日志,看看请求值和返回值分别是什么?” “那段代码没打印日志。” “改代码,加日志,重新发布一...

Java Web之会话追踪

会话追踪: Cookie: Session:...

快速排序法 Java实现

   快速排序法又叫二分法排序:  ...

鼠标操作贝塞尔曲线

1 贝塞尔曲线 贝塞尔曲线(The Bézier Curves),是一种在计算机图形学中相当重要的参数曲线(三维空间中称为贝塞尔曲面). 贝塞尔曲线由法国工程师皮埃尔·贝塞尔(Pierre Bézier)于1962年发表,他运用贝塞尔曲线来为汽车的主体进行设计. 接下来将从一次贝塞尔曲线开始(以下简称一次曲线. 类似的,N次贝塞尔曲线称为N次曲线),研究贝...