Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 445|回复: 0

[Swing学习]求凸包Swing演示程序

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-13 23:59:43 | 显示全部楼层 |阅读模式
    求凸包java演示程序:
    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. import javax.swing.event.*;
    5. import javax.swing.border.*;
    6. import java.util.*;
    7. /*
    8. *        直线类
    9. */
    10. class Line {
    11. Point p1, p2;
    12. Line(Point p1, Point p2) {
    13.   this.p1 = p1;
    14.   this.p2 = p2;
    15. }
    16. void draw(Graphics g) {
    17.         g.drawLine(p1.x, p1.y, p2.x, p2.y);
    18. }
    19. public String toString() {
    20.    return "(" + p1.x + ", " + p1.y + ") -> (" + p2.x + ", " + p2.y + ")";
    21. }
    22. }
    23. /*
    24. *        凸包接口
    25. */
    26. interface TuBao {
    27.         void setPointList(java.util.List< Point> pts);
    28.         java.util.List< Line> eval();
    29. }
    30. /*
    31. *        暴力法求凸包
    32. */
    33. class BaoLiTuBao implements TuBao {
    34.   java.util.List< Point> pts = null;
    35.   java.util.List< Line> lines = new ArrayList< Line>();
    36.    public void setPointList(java.util.List< Point> pts) {
    37.      this.pts = pts;
    38.    }
    39.        
    40.    public java.util.List< Line> eval() {
    41.     lines.clear();
    42.     if (pts == null) { return lines; }
    43.     int n = pts.size();
    44.     int a, b, c, cc, l, r;
    45.     for (int i = 0; i < n; i++) {
    46.      for (int j = i+1; j < n; j++) {
    47.        a = pts.get(j).y - pts.get(i).y;
    48.        b = pts.get(i).x - pts.get(j).x;
    49.        c = pts.get(i).x * pts.get(j).y -pts.get(i).y * pts.get(j).x;
    50.        l = r = 0;
    51.        int k;
    52.        for (k = 0; k < n; k++) {
    53.          cc = a * pts.get(k).x + b * pts.get(k).y;
    54.          if (cc > c) l++;
    55.          else if (cc < c) r++;
    56.          if (l * r != 0) break;
    57.        }
    58.       if (k == n) {
    59.         lines.add(new Line(pts.get(i), pts.get(j)));
    60.       }
    61.      }
    62.    }
    63.    return lines;
    64.   }
    65. }
    66. /*
    67. *        分治法求凸包
    68. */
    69. class QuickTuBao implements TuBao {
    70. java.util.List< Point> pts = null;
    71. java.util.List< Line> lines = new ArrayList< Line>();
    72.        
    73. public void setPointList(java.util.List< Point> pts) {
    74.         this.pts = pts;
    75. }

    76.   //求凸包,结果存入lines中
    77.   public java.util.List< Line> eval() {
    78.     lines.clear();
    79.     if (pts == null || pts.isEmpty()) { return lines; }
    80.                
    81.     java.util.List< Point> ptsLeft = new ArrayList< Point>();
    82.     java.util.List< Point> ptsRight = new ArrayList< Point>();
    83.                
    84.     //按x坐标对pts排序
    85.      Collections.sort(pts, new Comparator< Point>() {
    86.        public int compare(Point p1, Point p2) {
    87.           return p1.x-p2.x;
    88.        }
    89.     });
    90.     Point p1 = pts.get(0);        //最左边的点
    91.     Point p2 = pts.get(pts.size()-1);        //最右边的点
    92.     Point p3 = null;
    93.     int area = 0;
    94.     for (int i = 1; i < pts.size(); i++) {
    95.        p3 = pts.get(i);
    96.        area = getArea(p1, p2, p3);
    97.        if (area > 0) {               
    98.          ptsLeft.add(p3);
    99.        } else if (area < 0) {
    100.          ptsRight.add(p3);
    101.        }
    102.      }
    103.      d(p1, p2, ptsLeft);
    104.      d(p2, p1, ptsRight);
    105.       return lines;
    106.    }
    107.    private void d(Point p1, Point p2, java.util.List< Point> s) {
    108.       //s集合为空
    109.       if (s.isEmpty()) {
    110.         lines.add(new Line(p1, p2));
    111.         return;
    112.        }
    113.        //s集合不为空,寻找Pmax
    114.        int area = 0;
    115.        int maxArea = 0;
    116.        Point pMax = null;
    117.        for (int i = 0; i < s.size(); i++) {
    118.          area = getArea(p1, p2, s.get(i));
    119.          if (area > maxArea) {
    120.             pMax = s.get(i);
    121.             maxArea = area;
    122.           }
    123.         }
    124.           //找出位于(p1, pMax)直线左边的点集s1
    125.           //找出位于(pMax, p2)直线左边的点集s2
    126.         java.util.List< Point> s1 = new ArrayList< Point>();
    127.         java.util.List< Point> s2 = new ArrayList< Point>();
    128.         Point p3 = null;
    129.         for (int i = 0; i < s.size(); i++) {
    130.             p3 = s.get(i);
    131.             if (getArea(p1, pMax, p3) > 0) {
    132.                s1.add(p3);
    133.             } else if (getArea(pMax, p2, p3) > 0) {
    134.                s2.add(p3);
    135.             }
    136.          }
    137.          //递归
    138.          d(p1, pMax, s1);
    139.          d(pMax, p2, s2);       
    140.     }
    141.        
    142.        // 三角形的面积等于返回值绝对值的二分之一
    143.        // 当且仅当点p3位于直线(p1, p2)左侧时,表达式的符号为正
    144.         private int getArea(Point p1, Point p2, Point p3) {
    145.            return p1.x * p2.y + p3.x * p1.y + p2.x * p3.y -
    146.             p3.x * p2.y - p2.x * p1.y - p1.x * p3.y;
    147.         }
    148. }
    149. /*
    150. *        绘制点及凸包的面板
    151. */
    152. class DrawPanel extends JPanel {
    153.         public static final int WIDTH = 640;
    154.         public static final int HEIGHT = 480;
    155.         public static final int BORDER = 100;
    156.         java.util.List< Point> pts = new ArrayList< Point>();
    157.         TuBao tuBao = null;
    158.         int n;
    159.         public DrawPanel() {
    160.             setPreferredSize(new Dimension(WIDTH, HEIGHT));
    161.             setBorder(new LineBorder(Color.RED));
    162.             n = 100;
    163.         }
    164.         public void setN(int n) { this.n = n; }
    165.         public void setTuBao(TuBao tuBao) {
    166.                 this.tuBao = tuBao;
    167.                 tuBao.setPointList(pts);
    168.         }
    169.         public void randPoints() {
    170.           pts.clear();
    171.           Random rd = new Random(new Date().getTime());
    172.           for (int i = 0; i < n; i++) {
    173.           pts.add(new Point(rd.nextInt(WIDTH-BORDER*2)+BORDER,
    174.              rd.nextInt(HEIGHT-BORDER*2)+BORDER));
    175.         }
    176.      }
    177.      public void paintComponent(Graphics g) {
    178.         super.paintComponent(g);       
    179.         Color c = g.getColor();
    180.         g.setColor(Color.red);
    181.         for (Point pt : pts) {
    182.            g.fillOval(pt.x, pt.y, 5, 5);
    183.         }
    184.         g.setColor(c);
    185.         if (tuBao == null) return;
    186.         for (Line line : tuBao.eval()) {
    187.                 line.draw(g);
    188.         }
    189.         tuBao = null;
    190.      }
    191.   }
    192. /*
    193. *        主窗体
    194. */
    195. public class GetTuBao extends JFrame {
    196.         DrawPanel drawPanel;
    197.         JSlider sd;
    198.         JLabel lb;
    199.         TuBao baoLiTuBao = new BaoLiTuBao();
    200.         TuBao quickTuBao = new QuickTuBao();
    201.         public GetTuBao() {
    202.           setTitle("凸包问题演示");
    203.                
    204.           JPanel menu = new JPanel();
    205.           menu.setLayout(new FlowLayout(FlowLayout.LEFT));
    206.           sd = new JSlider(JSlider.HORIZONTAL, 0, 100, 100);
    207.           sd.setMajorTickSpacing(20);
    208.           sd.setMinorTickSpacing(10);
    209.           sd.setPaintTicks(true);
    210.           lb = new JLabel("100");
    211.           JButton btnRand = new JButton("随机点");
    212.           JButton btnBaoLi = new JButton("暴力法");
    213.           JButton btnQuick = new JButton("快包法");
    214.           menu.add(sd);
    215.           menu.add(lb);
    216.           menu.add(btnRand);
    217.           menu.add(btnBaoLi);
    218.           menu.add(btnQuick);
    219.                
    220.           drawPanel = new DrawPanel();
    221.           add(BorderLayout.NORTH, menu);
    222.           add(BorderLayout.CENTER, drawPanel);
    223.                
    224.           pack();
    225.           setResizable(false);
    226.                
    227.           sd.addChangeListener(new ChangeListener() {
    228.             public void stateChanged(ChangeEvent e) {
    229.                 lb.setText(String.valueOf(sd.getValue()));
    230.                 drawPanel.setN(sd.getValue());
    231.             }
    232.           });
    233.                
    234.         btnRand.addActionListener(new ActionListener() {
    235.            public void actionPerformed(ActionEvent e) {
    236.                 drawPanel.randPoints();
    237.                 repaint();
    238.            }
    239.         });
    240.                
    241.         btnBaoLi.addActionListener(new ActionListener() {
    242.            public void actionPerformed(ActionEvent e) {
    243.                 drawPanel.setTuBao(baoLiTuBao);
    244.                 repaint();
    245.            }
    246.         });
    247.                
    248.         btnQuick.addActionListener(new ActionListener() {
    249.            public void actionPerformed(ActionEvent e) {
    250.                 drawPanel.setTuBao(quickTuBao);
    251.                 repaint();
    252.                
    253.            }
    254.         });
    255.                
    256.         setVisible(true);
    257.      }
    258.     public static void main(String[] args) {
    259.       try {
    260.         UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    261.       } catch(Exception e) {
    262.         e.printStackTrace();
    263.       }
    264.                
    265.       EventQueue.invokeLater(new Runnable() {
    266.             public void run() {
    267.                 GetTuBao getTuBao = new GetTuBao();
    268.            }
    269.        });
    270.     }
    271. }
    复制代码



       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/13/235943406.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:44 , Processed in 0.361466 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表