编译环境:
操作系统: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); } }); } }
三、运行结果
原文地址:http://blog.csdn.net/cooelf/article/details/40627407