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 α2 = new JTextField("58°11'");
      final JTextField β2 = new JTextField("69°6'");
      JPanel northPanel = new JPanel();
      final JTextField DAP = new JTextField();
      final JTextField DBP = new JTextField();
      JPanel WestPanel = new JPanel();
      JLabel pic= new JLabel();
      pic.setIcon(new ImageIcon("G:/workplace/角度前方交会/1.png"));
      WestPanel.add(pic);
      getContentPane().add(WestPanel, BorderLayout.WEST);
//角度前方交会
      northPanel.setLayout(new GridLayout(2, 10));
      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("α1: ", SwingConstants.CENTER));
      northPanel.add(α1);
      northPanel.add(new JLabel("β1: ", SwingConstants.CENTER));
      northPanel.add(β1);
      northPanel.add(new JLabel("α2: ", SwingConstants.CENTER));
      northPanel.add(α2);
      northPanel.add(new JLabel("β2: ", SwingConstants.CENTER));
      northPanel.add(β2);
      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 α_1=convert(α1.getText());
                Double β_1=convert(β1.getText());
                Double α_2=convert(α2.getText());
                Double β_2=convert(β2.getText());
                
          //A、B、P      
                Double D_AB=Math.sqrt( Math.pow((X1-X2),2)+Math.pow((Y1-Y2),2));
                Double D_AP=D_AB*Math.sin(β_1)/Math.sin(α_1+β_1);
                Double α_AB=90-Math.atan(Math.abs(Y2-Y1)/Math.abs(X2-X1));
                Double α_AP=α_AB-α_1;
                Double XP1=X1+D_AP*Math.cos(α_AP);
                Double YP1=Y1+D_AP*Math.sin(α_AP);
                
          //B、C、P
                Double D_BC=Math.sqrt( Math.pow((X3-X2),2)+Math.pow((Y3-Y2),2));
                Double D_BP=D_BC*Math.sin(β_2)/Math.sin(α_2+β_2);
                Double α_BC=Math.atan(Math.abs(Y2-Y3)/Math.abs(X2-X3));
                Double α_BP=α_BC-α_2;
                Double XP2=X2+D_BP*Math.cos(α_BP);
                Double YP2=Y1+D_BP*Math.sin(α_BP);
                
                 textArea.append("=====角度前方交会===="+"\n"+"参考值1:"+ "( " +XP1+","+YP1+")"
                        +  "\n"+"参考值2:"+"( " +XP2+","+YP2+")"
                        +  "\n"+"误差距离约:"+Math.round(miss(XP1,YP1,XP2,YP2))+"米");
                //textArea.append("测试:"+β_2);
            }
            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);
            }
         });
   }
}

三、运行结果

时间: 2024-10-04 10:02:52

JAVA:角度前方交会算法GUI实现的相关文章

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

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; /**  * A frame with sample text

java 24点算法实现

最近闲来无事,突然怀念起小时候和堂兄表姐们经常玩24点游戏,于是就琢磨着是不是开发一个安卓手机版本.然后上网上一搜,发现已经被别人给开发烂了啊.不过这只能说明这个小游戏要想赚广告费很难了,但是拿来锻炼和在妹纸面前装逼还是很有价值的,嘿嘿,想到这里,我最终还是花了3天时间开发了一个小游戏出来. 算法实现 在网上试玩了一个flash的版本,发现还需要实现计算所有正确的结果,然后网上稍微百度了下思路,就开始自己实现了.我开始时大概的思路就是穷举出所有的数字和算式的排列组合,然后一一进行验算,中间碰到两

java数据结构与算法之递归思维(让我们更通俗地理解递归)

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53452971 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设计与实现 j

java每日小算法(27)

/* [程序27]  题目:求100之内的素数    */ package test; import java.util.Scanner; public class test { public static boolean prime(int number) { boolean flag = true; int mid = (int)Math.sqrt(number); for(int i = 2; i< mid+1; i++) { if(number % i == 0) { flag = fa

java每日小算法(4)

[程序4] 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步. package test; import java.util.ArrayList;

Java密码学原型算法实现——第一部分:标准Hash算法

题注 从博客中看出来我是个比较钟爱Java的应用密码学研究者.虽然C在密码学中有不可替代的优势:速度快,但是,Java的可移植性使得开发人员可以很快地将代码移植到各个平台,这比C实现要方便的多.尤其是Android平台的出现,Java的应用也就越来越广.因此,我本人在密码学研究过程中实际上也在逐渐使用和封装一些知名的Java密码学库,主要是方便自己使用. Java JDK实际上自带了密码学库,支持几乎所有通用密码学原型的实现.然而,自带密码库有几个缺点:第一,由于版权问题,其并不支持全部的密码学

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

使用Java实现一则算法

[Java] 使用Java实现一则算法 前情提要 在学习Java的过程中,我的一个基友扔给了我一道算法题,为了检验自己对Java的学习情况我决定使用Java解决这道算法题. 具体问题 现有一株K叉树,我们知道其前序遍历与后序遍历,也知道K的值,求该K叉树有多少种可能形态.如一13叉树,前序遍历为abejkcfghid,后序遍历为jkebfghicda,则其可能形态有207352860种. 问题分析 根据遍历的定义我们可以知道: 前序遍历的第一个字母和后序遍历的最后一个字母是他的根. 前序遍历的根