JAVA:角度後方交會算法GUI實現

編譯環境:

操作系統:Win8.1  64位

IDE平臺:Visual Studio 2013 Ultimate

一、原理


二、代碼實現

角度後方交會.java

package text;

import java.awt.*;
import java.awt.event.*;
import java.math.*;

import javax.swing.*;
import javax.swing.border.Border;

public class 角度後方交會 extends JFrame
{
   public static final int TEXTAREA_ROWS = 20;
   public static final int TEXTAREA_COLUMNS = 40; 
   public 角度後方交會()
   {
      final JTextField A_X = new JTextField("37477");
      final JTextField A_Y = new JTextField("16307");
      final JTextField B_X = new JTextField("37327");
      final JTextField B_Y = new JTextField("16078");    
      final JTextField C_X = new JTextField("37163");
      final JTextField C_Y = new JTextField("16046");
      final JTextField α_1 = new JTextField("40°41'");
      final JTextField β_1 = new JTextField("75°19'");
      final JTextField γ_1 = new JTextField("58°11'");
      final JTextField R_A = new JTextField("200");
      final JTextField R_B = new JTextField("200");
      final JTextField R_C = new JTextField("200");
      JPanel northPanel = new JPanel();
      JPanel WestPanel = new JPanel();
      JLabel pic= new JLabel();
      pic.setIcon(new ImageIcon("G:/workplace/角度後方交會/3.png"));
      WestPanel.add(pic);
      getContentPane().add(WestPanel, BorderLayout.WEST);
//角度前方交會
      northPanel.setLayout(new GridLayout(2, 6));
      northPanel.add(new JLabel("A_X: ", SwingConstants.CENTER));
      northPanel.add(A_X);
      northPanel.add(new JLabel("A_Y: ", SwingConstants.CENTER));
      northPanel.add(A_Y);
      northPanel.add(new JLabel("B_X: ", SwingConstants.CENTER));
      northPanel.add(B_X);
      northPanel.add(new JLabel("B_Y: ", SwingConstants.CENTER));
      northPanel.add(B_Y);
      northPanel.add(new JLabel("C_X: ", SwingConstants.CENTER));
      northPanel.add(C_X);
      northPanel.add(new JLabel("C_Y: ", SwingConstants.CENTER));
      northPanel.add(C_Y);
      northPanel.add(new JLabel("α: ", SwingConstants.CENTER));
      northPanel.add(α_1);
      northPanel.add(new JLabel("β: ", SwingConstants.CENTER));
      northPanel.add(β_1);
      northPanel.add(new JLabel("γ: ", SwingConstants.CENTER));
      northPanel.add(γ_1);
      northPanel.add(new JLabel("RA: ", SwingConstants.CENTER));
      northPanel.add(R_A);
      northPanel.add(new JLabel("RB: ", SwingConstants.CENTER));
      northPanel.add(R_B);
      northPanel.add(new JLabel("RC: ", SwingConstants.CENTER));
      northPanel.add(R_C);
      Border etched = BorderFactory.createEtchedBorder();
      Border titled = BorderFactory.createTitledBorder(etched, "角度後方交會");
      northPanel.setBorder(titled);
      getContentPane().add(northPanel, BorderLayout.NORTH);
      
      final JTextArea textArea = new JTextArea(20,40);
      JScrollPane scrollPane = new JScrollPane(textArea);

      getContentPane().add(scrollPane, BorderLayout.CENTER);

      // add button to append text into the text area

      JPanel southPanel = new JPanel();

      JButton insertButton = new JButton("計算P點座標");
      insertButton.addActionListener(new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
          //座標初始化
                Double X1=Double.valueOf(A_X.getText()).doubleValue();
                Double Y1=Double.valueOf(A_Y.getText()).doubleValue();
                Double X2=Double.valueOf(B_X.getText()).doubleValue();
                Double Y2=Double.valueOf(B_Y.getText()).doubleValue();
                Double X3=Double.valueOf(C_X.getText()).doubleValue();
                Double Y3=Double.valueOf(C_Y.getText()).doubleValue();
                Double α=convert(α_1.getText());
                Double β=convert(β_1.getText());
                Double γ=convert(γ_1.getText());
                
                Double RA=Double.valueOf(R_A.getText()).doubleValue();
                Double RB=Double.valueOf(R_B.getText()).doubleValue();
                Double RC=Double.valueOf(R_C.getText()).doubleValue();

          //A、B、P      
                Double D_AB=Math.sqrt( Math.pow((X1-X2),2)+Math.pow((Y1-Y2),2));
                Double α_AB=Math.atan(Math.abs(Y1-Y2)/Math.abs(X1-X2));
                Double α_21=Math.asin(RA*Math.sin(α)/D_AB);
                Double α_11=α_AB-α_21;
                Double XP1=X3+RC*Math.cos(α_11);
                Double YP1=Y3+RC*Math.sin(α_11);
                
          //B、C、P
                Double D_BC=Math.sqrt( Math.pow((X3-X2),2)+Math.pow((Y3-Y2),2));
                Double α_BC=Math.atan(Math.abs(Y2-Y3)/Math.abs(X2-X3));
                Double α_22=Math.asin(RB*Math.sin(α)/D_BC);
                Double α_12=α_BC-α_22;
                Double XP2=X3+RC*Math.cos(α_12);
                Double YP2=Y3+RC*Math.sin(α_12);
                
                textArea.append("=====角度後方交會===="+"\n"+"參考值1:"+ "( " +XP1+","+YP1+")"
                        +  "\n"+"參考值2:"+"( " +XP2+","+YP2+")"
                        +  "\n"+"誤差距離約:"+Math.round(miss(XP1,YP1,XP2,YP2))+"米");
            }
            public double miss(double XP1,double YP1,double XP2,double YP2){
                return Math.sqrt(Math.pow((XP1-XP2),2)+Math.pow((YP1-YP2),2));
            }
            public double convert(String input){
                Double a=Double.valueOf(input.split("°")[0]).doubleValue();
                Double b=Double.valueOf(input.split("°")[1].split("'")[0]).doubleValue();
                return a+b/60;
            }
         });

     add(insertButton, BorderLayout.SOUTH);
      pack();
   }
}


Test.java

package text;

import java.awt.*;
import javax.swing.*;

public class Test
{
   public static void main(String[] args)
   {
      EventQueue.invokeLater(new Runnable()
         {
            public void run()
            {
               JFrame frame = new 角度後方交會();
               frame.setTitle("角度後方交會");
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               frame.setVisible(true);
            }
         });
   }
}


三、運行結果



下載:角度後方交會算法JAVA工程包





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章