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  用于显示numstatic class MyPanel extends JPanel {Number[] nums;// 初始化public MyPanel() {super();}public MyPanel(Number[] nums) {super();this.nums = nums;}// 重写, 绘制numpublic void paint(Graphics g) {super.paint(g);g.setColor(Color.white);g.fillRect(0, 0, 400, 300);drawNum(g);}// 绘制numprivate void drawNum(Graphics g) {g.setColor(Color.green);if(nums != null) {for(Number num : nums) {for(int i=0; iif(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; itrue;}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, 所以请大家指出!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部