java 绘制五位图 比例图

说明:其中的关键代码属于网络,具体是谁写的我也忘记了,因为这个是代码分好几个空闲时间段写的

其他的也不多说,直接上代码,没有什么思路可说的,要说真的有也就是画图顺序逐一一下,好了,贴代码


import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class DrawLine {
    public static void main(String[] args) throws IOException {
        int [] vn = new int[5];//定义边数
        for(int i = 0;i<vn.length;i++){
            int n = (int)(Math.random()*100);//定义站多边形比例
            vn[i]=n;
        }
        int width = 5000;
        int height = 5000;
        int num = 3;
        int excessiveVariable = 800;
        int margin = 300;
        drawPolygon(vn, width, height, num, excessiveVariable, margin, "E://image.jpg");
    }

    /**
     * 绘制多边形
     * @param vn 
     * @param width 图宽(像素)
     * @param height    图高(像素)
     * @param num   内多边形个数
     * @param excessiveVariable 最内侧多边形大小(像素)
     * @param margin    累加尺寸大小(像素)
     * @throws IOException io异常
     */
    private static void drawPolygon(int[] vn, int width, int height, int num,
            int excessiveVariable, int margin, String filePath) throws IOException {
        int bian = vn.length;//边数
        File file = new File(filePath);   
        Font font = new Font("Serif", Font.BOLD, 10);   
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);   
        Graphics2D g = (Graphics2D) bi.getGraphics();
        Color c=g.getColor();
        g.setColor(Color.getColor("#ffffff"));
        g.fillRect(0,0,width,height);
        g.setColor(c);
        g.setColor(Color.black);
        g.setStroke(new BasicStroke(2F));
        int min = 30,deta=100,mark=50;  
        int [][]px = new int[bian][num];  //一维:五个角中的那个角,二维:从里到外0-4
        int [][]py = new int[bian][num];
        Double centerX = width/2D-50;//中心坐标
        Double centerY = height/2D;//中心坐标
        int fontSize = 300;
        double angle=0.0;  
        //计算n个五边形的顶点。  
        for(int i=0; i<bian; i++){  
            angle = 360/bian*Math.PI*i/180; 
            for(int j=0; j<num; j++){  
                px[i][j]=(int) Math.round(centerX+(excessiveVariable+j*margin)*Math.sin(angle));
                py[i][j]=(int) Math.round(centerY-(excessiveVariable+j*margin)*Math.cos(angle));
            }  
        }
        Color lineColor = new Color(230, 230, 230);
        Color propColor = new Color(255, 169, 151);
        drawLine(centerX, centerY, bian, num, g, px, py, lineColor, 15f); //画线
        drawProportion(vn, bian, num, excessiveVariable, margin, g, centerX, centerY, propColor, 15f);//画比例图
        drawDot(vn, bian, num, excessiveVariable, margin, g, centerX, centerY, new Color(255, 82, 46), propColor, ((int)(width*0.012))*2);//画点
        drawString(g, centerX, centerY, fontSize);//画字
        ImageIO.write(bi, "jpg", file);
    }

    private static void drawString(Graphics2D g, Double centerX,
            Double centerY, int fontSize) {
        String str = "张三李四";
        g.setFont(new Font("宋体", Font.PLAIN, fontSize+4));// 设置字体
        g.setColor(new Color(127, 127, 127));
        g.drawString(str, centerX.intValue()-g.getFontMetrics().stringWidth(str)/2-6, centerY.intValue()+g.getFontMetrics().getHeight()/2-16);
        g.setFont(new Font("宋体", Font.PLAIN, fontSize-2));
        g.setColor(new Color(174, 174, 174));
        g.drawString(str, centerX.intValue()-g.getFontMetrics().stringWidth(str)/2-3, centerY.intValue()+g.getFontMetrics().getHeight()/2-8);
        g.setFont(new Font("宋体", Font.PLAIN, fontSize));
        g.setColor(new Color(255, 255, 255));
        g.drawString(str, centerX.intValue()-g.getFontMetrics().stringWidth(str)/2, centerY.intValue()+g.getFontMetrics().getHeight()/2);
    }
    /**
     * 画线
     * @param width 宽
     * @param height    高
     * @param bian  边数
     * @param num   个数
     * @param g 
     * @param px
     * @param py
     */
    private static void drawLine(Double width, Double height, int bian, int num,
            Graphics2D g, int[][] px, int[][] py, Color lineColor, float lineSize) {
        int [] x = new int[bian*bian+bian];
        int [] y = new int[bian*bian+bian];
        g.setStroke(new BasicStroke(lineSize));
        g.setColor(lineColor);
        for(int j = 0;j<num;j++){
            for(int i = 0;i<bian;i++){
                x[i] = px[i][j];
                y[i] = py[i][j];
                g.drawLine(x[i], y[i], width.intValue(), height.intValue());
            }
            g.drawPolygon(x, y, bian); 
        }
    }
    /**
     * 画比例
     * @param vn
     * @param bian
     * @param num
     * @param excessiveVariable
     * @param margin
     * @param g
     * @param centerX
     * @param centerY
     */
    private static void drawProportion(int[] vn, int bian, int num,
            int excessiveVariable, int margin, Graphics2D g, Double centerX,
            Double centerY, Color proColor, float lineSize) {
        double angle;
        int []minX = new int[bian];
        int []minY = new int[bian];
        for(int i = 0;i<bian;i++){
            angle = 360/bian*Math.PI*i/180; 
            minX[i] = (int) Math.round(centerX+((excessiveVariable+(num-1)*margin)/100*vn[i])*Math.sin(angle)); 
            minY[i] = (int) Math.round(centerY-((excessiveVariable+(num-1)*margin)/100*vn[i])*Math.cos(angle));
        }

        //向定点画字
        double [] topPotTextX = new double[bian];
        double [] topPotTextY = new double[bian];
        for(int i = 0;i<bian;i++){
            angle = 360/bian*Math.PI*i/180; 
            topPotTextX[i] = Math.round(centerX+((excessiveVariable+(num-1)*margin)/100*130)*Math.sin(angle)); 
            topPotTextY[i] = Math.round(centerY-((excessiveVariable+(num-1)*margin)/100*130)*Math.cos(angle));
            drawString(g, topPotTextX[i], topPotTextY[i], 200);
        }



        g.setColor(proColor);
        g.setStroke(new BasicStroke(lineSize));
        g.drawPolygon(minX, minY, bian);
        g.setStroke(new BasicStroke());
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.1f));
        g.fillPolygon(minX, minY, bian);
    }
    /**
     * 画比例定点
     * @param vn
     * @param bian
     * @param num
     * @param excessiveVariable
     * @param margin
     * @param g
     * @param centerX
     * @param centerY
     * @param dotColor
     * @param centerDotColor
     * @param dotSize
     */
    private static void drawDot(int[] vn, int bian, int num, int excessiveVariable, int margin, Graphics2D g, Double centerX, Double centerY, Color dotColor, Color centerDotColor, int dotSize){
        double angle;
        int dotWidth = dotSize;
        int dotHeight = dotSize;
        int []minX = new int[bian];
        int []minY = new int[bian];
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1f));
        for(int i = 0;i<bian;i++){
            angle = 360/bian*Math.PI*i/180; 
            minX[i] = (int) Math.round(centerX+((excessiveVariable+(num-1)*margin)/100*vn[i])*Math.sin(angle)); 
            minY[i] = (int) Math.round(centerY-((excessiveVariable+(num-1)*margin)/100*vn[i])*Math.cos(angle));
            g.setColor(dotColor);
            g.fillOval(minX[i]-dotWidth/2, minY[i]-dotHeight/2, dotWidth, dotHeight);
            g.setColor(centerDotColor);
            g.fillOval(minX[i]-(dotWidth/2)/2, minY[i]-(dotHeight/2)/2, dotWidth/2, dotHeight/2);//画内点
        }
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值