10 绘制数字

前言

题目来自于”编程珠玑

问题描述

在生活中, 我们经常看到使用6条线[横线, 竖线] 来表示各个数字对不对, 比如说 : 电子手表上面, 电表上面, 公交车上面等等
这里写图片描述

思路

思路 : 将各个线条进行编码, 对于0-9各个数字 编辑对应的编码, 如果对应的线条存在, 则对应的位为true, 否则 为false, 各个线条的位置 以左上角为基准, 进行计算, 然后 绘制出来

这里我对各个线条的编码如下 :
这里写图片描述

参考代码

/**
 * file name : Test29ShowNumber.java
 * created at : 3:57:05 PM Jun 12, 2015
 * created by 970655147
 */

package com.hx.test05;

public class Test29ShowNumber {

    // 横条的宽, 竖条的高
    static int WIDTH = 20;
    static int HEIGHT = 20;

    // 利用八条线绘制数字
    public static void main(String []args) {

        Number[] nums = new Number[]{
                new Number(3, new Point(100, 100) ), 
                new Number(4, new Point(200, 100) ) 
        };

        JFrame frame = new JFrame();
        frame.add(new MyPanel(nums) );

        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(100, 100, 400, 300);
        frame.setResizable(false);
    }

    // Panel  用于显示num
    static class MyPanel extends JPanel {
        Number[] nums;

        // 初始化
        public MyPanel() {
            super();
        }
        public MyPanel(Number[] nums) {
            super();
            this.nums = nums;
        }

        // 重写, 绘制num
        public void paint(Graphics g) {
            super.paint(g);
            g.setColor(Color.white);
            g.fillRect(0, 0, 400, 300);

            drawNum(g);
        }

        // 绘制num
        private void drawNum(Graphics g) {
            g.setColor(Color.green);
            if(nums != null) {
                for(Number num : nums) {
                    for(int i=0; i<num.numLength(); i++) {
                        if(num.isNeedDraw(i) ) {
                            Point[] line = num.posOf(i);
                            g.drawLine(line[0].x, line[0].y, line[1].x, line[1].y);
                        }
                    }
                }
            }
        }

    }

    // 表示一个[0, 9]的模拟, 从上到下, 从左到右依次为 [0 - 6]
    // ---
    //|   |
    // ---
    //|   |
    // ---
    static class Number {
            // 0 - 9, 线的宽高
        static boolean[][] oneToNine = new boolean [][] {
                generateNumModel(new int[] {0, 1, 2, 4, 5, 6 } ),
                generateNumModel(new int[] {2, 5 } ),
                generateNumModel(new int[] {0, 2, 3, 4, 6 } ),
                generateNumModel(new int[] {0, 2, 3, 5, 6 } ),
                generateNumModel(new int[] {1, 2, 3, 5 } ),
                generateNumModel(new int[] {0, 1, 3, 5, 6 } ),
                generateNumModel(new int[] {0, 1, 3, 4, 5, 6 } ),
                generateNumModel(new int[] {0, 2, 5 } ),
                generateNumModel(new int[] {0, 1, 2, 3, 4, 5, 6 } ),
                generateNumModel(new int[] {0, 1, 2, 3, 5, 6 } )
        };
        // 数据, 可以吧boolean[] 换成int/ byte/ ... [] [这样的话 就只需要, 需要绘制的路径的数据了...]
        boolean[] num;
        Point leftUp;

        // 初始化
        public Number(int i, Point leftUp) {
            num = oneToNine[i];
            this.leftUp = leftUp;
        }

        // idx所在的路径需要绘制吗
        public boolean isNeedDraw(int idx) {
            return num[idx];
        }
        // 需要绘制的线的个数
        public int numLength() {
            return num.length;
        }

        // 根据让data所在的位置为true, 返回一个data的模型
        private static boolean[] generateNumModel(int[] data) {
            boolean[] res = new boolean[8];
            for(int i=0; i<data.length; i++) {
                res[data[i]] = true;
            }

            return res;
        }

        // 获取指定索引所在直线的位置
//          从上到下, 从左到右依次为 [0 - 6]
            // ---
            //|   |
            // ---
            //|   |
            // ---
        public Point[] posOf(int idx) {
            Point[] line = null;
            switch(idx) {
                case 0:
                    line = new Point[] {leftUp, new Point(leftUp.x + WIDTH, leftUp.y) };
                    break;
                case 1:
                    line = new Point[] {leftUp, new Point(leftUp.x, leftUp.y + HEIGHT) };
                    break;
                case 2:
                    line = new Point[] {new Point(leftUp.x + WIDTH, leftUp.y), new Point(leftUp.x + WIDTH, leftUp.y + HEIGHT) };
                    break;
                case 3:
                    line = new Point[] {new Point(leftUp.x, leftUp.y + HEIGHT), new Point(leftUp.x + WIDTH, leftUp.y + HEIGHT) };
                    break;
                case 4:
                    line = new Point[] {new Point(leftUp.x, leftUp.y + HEIGHT), new Point(leftUp.x, leftUp.y + (HEIGHT << 1) ) };
                    break;
                case 5:
                    line = new Point[] {new Point(leftUp.x + WIDTH, leftUp.y + HEIGHT), new Point(leftUp.x + WIDTH, leftUp.y + (HEIGHT << 1) ) };
                    break;
                case 6:
                    line = new Point[] {new Point(leftUp.x, leftUp.y + (HEIGHT << 1)), new Point(leftUp.x + WIDTH, leftUp.y + (HEIGHT << 1) ) };
                    break;
                default : 
                    throw new RuntimeException("error ...");
            }

            return line;
        }
    }

}

效果截图

这里写图片描述

总结

自己瞎扯淡, 没事写的, 似乎 没什么技术含量

注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值