zoukankan      html  css  js  c++  java
  • java 空间四点定位,可跟据已知的四点坐标(x,y,z)及距离计算所在位置坐标

          public static void main(String args[]) {
              
              try{
                
                float point[]=new float[3];
                Location loc = new Location();
    
                //获得坐标
                point[0] = 0;
                point[1] = 0;
                point[2] = (float) 0.5;
                loc.set_point(point,1);
    
                point[0] = 0;
                point[1] = -1;
                point[2] = 2;
                loc.set_point(point,2);
    
                point[0] = 0;
                point[1] = 1;
                point[2] = 0;
                loc.set_point(point,3);
    
                point[0] = 1;
                point[1] = 0;
                point[2] = 3;
                loc.set_point(point,4);
    
                //distance
                loc.set_distance(1,1);
                loc.set_distance(1,2);
                loc.set_distance(2,3);
                loc.set_distance(1,4);
    
                //calc
                float x[] = loc.calc();
                if (x == null)
                {
                    System.out.println("fail");
                }
                else
                {
                   System.out.println(x[0]+","+x[1]+","+ x[2]);
                }
                
              } catch(Exception ex){
                  ex.printStackTrace();
              }
    
          }
    package com.qmall.location;
    
    public class Location {
    
            //空间已知4点坐标   
            float p[][] = new float[4][3];  
            //空间已知4点距离   
            float d[] = new float[4] ;  
        
          //初始化空间4点坐标   
          //p:坐标,数组   
          //num:1-4   
          void set_point(float point[],int num)  throws Exception
          {  
              int j = 0;  
            
              for (j = 0;j < 3;j++)  
              {  
                  p[num - 1][j] = point[j];  
              }  
          }  
            
          //初始化空间4点距离   
          //distance:距离   
          //num:1-4   
          void set_distance(float distance,int num)  throws Exception
          {  
              d[num - 1] = distance;  
          }  
            
          //计算未知点坐标   
          //p:计算后的返回值   
          //fail:back -1   
          float[] calc()  throws Exception
          {  
              float point[]=new float[3];
                  //矩阵A   
                  float A[][] = new float[3][3];  
                  //矩阵B   
                  float B[]= new float[3];  
                  int i = 0;  
                  int j = 0;  
            
                  //初始化B矩阵   
                  for (i = 0;i < 3;i++)  
                  {  
                          B[i] = (LocationMath.d_p_square(p[i + 1]) - LocationMath.d_p_square(p[i]) - (d[i + 1] * d[i + 1] - d[i] * d[i])) / 2;  
                  }  
            
                  //初始化A矩阵   
                  for (i = 0;i < 3;i++)  
                  {  
                          for (j = 0;j < 3;j++)  
                          {  
                                  A[i][j] = p[i + 1][j] - p[i][j];  
                          }  
                  }  
            
                  //计算未知点坐标   
                  point = LocationMath.solve(A,B);
                  
                  return point;  
          }  
          
    }
    package com.qmall.location;
    
    public class LocationMath {
    
        
        public static void printf_matrix(float m[][]) throws Exception{
            int i = 0;  
            int j = 0;  
      
            for (i = 0;i < 3;i++)  
            {  
                    for (j = 0;j < 3;j++)  
                    {   
                            System.out.println(m[i*3][j]);  
                    }  
            }  
    
        }
        
        //三维行列式的值
        //m:3 * 3数组
        public static double det(float m[][]) throws Exception{
            double value = 0.0;  
              
            value = m[0][0] * m[1][1] * m[2][2] +  
                            m[0][1] * m[1][2] * m[2][0] + 
                            m[0][2] * m[1][0] * m[2][1] -   
                            m[0][1] * m[1][0] * m[2][2] -   
                            m[0][2] * m[1][1] * m[2][0] -   
                            m[0][0] * m[1][2] * m[2][1];  
      
            return value;  
        }
        
        //将一个行列式的值赋给另一个
        //src,dst:3 * 3数组
        public static void copy_matrix(float src[][],float dst[][]) throws Exception {
            int i = 0;  
            int j = 0;  
      
            for (i = 0;i < 3;i++)  
            {  
                    for (j = 0;j < 3;j++)  
                    {  
                            dst[i][j] = src[i][j];  
                    }  
            }  
    
        }
        
        //解方程
        //m:方阵,3 * 3数组
        //b:解
        //x:返回值
        //fail:back -1
        public static float[] solve(float m[][],float b[]) throws Exception {
            
            float det_m;  
            float det_m_temp;  
            float m_temp[][] = new float[3][3];  
            int i = 0;  
            int j = 0;  
            
            float x[]=new float[3];
      
            det_m = (float) det(m);  
            if (det_m == 0)  
            {  
                return null;  
            }  
            for (j = 0;j < 3;j++)  
            {  
                    //得到新的行列式   
                    copy_matrix(m,m_temp);  
                    for (i = 0;i < 3;i++)  
                    {  
                            m_temp[i][j] = b [i];  
                    }  
                    det_m_temp = (float) det(m_temp);  
      
                    //求解   
                    x[j] = det_m_temp / det_m;  
            }  
      
            return x;  
    
        }
        
        //计算空间点到原点距离的平方
        public static float d_p_square(float p[]) throws Exception {
            
            float d = 0;  
            int i = 0;  
      
            for (i = 0;i < 3;i++)  
            {  
                    d += p[i] * p [i];  
            }  
      
            return d;  
    
        }
    
    }
  • 相关阅读:
    网站后台编辑器怎样才能兼容IE6、IE8
    map area
    纯CSS圆角
    【转】Linux 查看某一进程的占用CPU的Cacti 脚本
    查看/修改Linux时区和时间,更新系统时间
    Centos下安装X Window+GNOME Desktop+FreeNX
    rhel6 kvm做桥接
    Gentoo网络配置
    常用正则表达式
    VS 设置备忘
  • 原文地址:https://www.cnblogs.com/niray/p/4306018.html
Copyright © 2011-2022 走看看