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;  

    }

}
时间: 2024-10-20 10:52:49

java 空间四点定位,可跟据已知的四点坐标(x,y,z)及距离计算所在位置坐标的相关文章

Scala实现:已知三点坐标,求最短距离(如果在垂足不在线段内,最短距离为到其中一点的直线距离)

/** * 已知三点坐标,求其中一点到另两点的垂线距离 * (如果在垂足不在线段内,最短距离为到其中一点的直线距离) * Created by wzq on 17-11-2. */object Point2lineDistance { def main(args: Array[String]) { val v: Double = pointToLine(-3, 0, 3, 0, 0, 3) System.out.println(v) } def pointToLine(x1: Int, y1:

POJ3449 正方形已知对角线两点坐标,求另外两点

已知对角线两点(x0,y0) (x1,y1) x1+x3 = x0+x2; x1-x3  =  y2-y0; y1+y3 =  y0-y2; y1-y3 =  x0-x2; 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <queue> 6 #include <map> 7 #inclu

Android根据已知的经纬度坐标获取当前位置

例如:经度:10.123456   纬度:20.654321 根据以上坐标获取到实际位置(不借用百度地图或高德地图的API) 代码如下: //放入经纬度就可以了 public String getAddress(double latitude, double longitude) {         Geocoder geocoder = new Geocoder(this, Locale.getDefault());         try {             List<Address

matlab 已知函数值纵坐标值(Y值)获得对应的横坐标

clear all;clc; x=-pi/2:pi/50:pi; y=sin(x); plot(x,y); grid on; fm=max(y) id=find(y==fm); xm=x(id) 转自:http://zhidao.baidu.com/question/547247688.html 另一种方法: [~,freq]=max(M); M为fft变换序列,freq即对应频率点. 一般如果直接做fft的话,freq为对应频率点的位置,需要转换为实际的频率, 具体做法参考matlab中hel

【转】java性能测试 问题定位

性能测试的概念是什么,基本目的是什么,我想大家都基本清楚,不作详述,总之,性能测试只是测试过程中的一种方式,帮助我们的功能更好的运行,如果功能测试是可用,易用,满足需求.用户使用为目的,性能测试无非就是让这些目的更流畅.没有什么专业的概念,无非实现两个字:好用!所以,性能测试这种测试方式在发生过程中,其中一个过渡性的工作,就是对执行过程中的问题,进行定位,对功能的定位,对负载的定位,最重要的,当然就是问题中说的“瓶颈”,接触性能测试不深,更非专家,自己的理解,瓶颈产生在以下几方面: 1.网络瓶颈

无法为数据库中的对象分配空间,因为&#39;PRIMARY&#39;文件组已满

用SQL Server2012,做数据保存时出错,错误信息:无法为数据库'***'中的对象'***'分配空间,因为'PRIMARY'文件组已满.请删除不需要的文件.删除文件组中的对象.将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间. 解决办法:打开SQL Server Management Studio,右键报错的数据库,选择"属性",弹出对话框,选择"文件"页签,查看是否限制了数据库文件增长,若没有做限制,再查看磁盘剩余空间是否足够

[SQL_Server_Question]Msg 1105无法为数据库 &#39;tempdb&#39; 中的对象分配空间,因为 &#39;PRIMARY&#39; 文件组已满

错误消息: Msg 1105, Level 17, State 2, Line 266Could not allocate space for object 'dbo.Large Object Storage System object: 422392492982272' in database 'tempdb' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropp

Java集合-5. (List)已知有一个Worker 类如下: 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循

第六题 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private double salary; public Worker (){} public Worker (String name, int age, double salary) { this.name = name; this.age = age; this.salary = salary; } public

POJ 2208 已知空间四面体六条边长度,求体积

Pyramids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2718   Accepted: 886   Special Judge Description Recently in Farland, a country in Asia, a famous scientist Mr. Log Archeo has discovered ancient pyramids. But unlike those in Egyp