繁体   English   中英

如何将 plot 图形上的 x 和 y 坐标转换为 GUI 上的像素

[英]How can I convert x and y coordinates on plot graph to pixels on a GUI

我正在为显示在网格上的凸包 gui 创建一个程序。 以下代码是图形用户界面。

public class Plot extends JPanel{
    private int width = 1025;
    private int height = 500;
    private int padding = 50;
    private int labelPadding = 50;
    private Color lineColor = new Color(44, 102, 230, 180);
    private Color pointColor = new Color(100, 100, 100, 180);
    private Color gridColor = new Color(200, 200, 200, 200);
    private static final Stroke GRAPH_STROKE = new BasicStroke(2f);
    private int pointWidth = 4;
    private int numberYDivisions = 10;
    private Vector<Point> convexHull;
    private static DecimalFormat df = new DecimalFormat("0.00");
    private Point[] point;

    public Plot(Point[] point, Vector convexHull) {
        this.point=point;
        this.convexHull=convexHull;
    }

    @Override
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;

            double xScale = (maxX(point)+10)*2;
            double yScale = (maxY(point)+10)*2 ;
            List<Point> graphPoints =  new ArrayList<>();

            for(Point temp : convexHull){
                double x1 = temp.x;
                double y1 = temp.y;
                graphPoints.add(new Point(x1,y1));
            }

            double intervalY;
            intervalY = maxY(point)/5;

            g2.setColor(Color.WHITE);
            g2.fillRect(padding + labelPadding, padding, (int)xScale, (int)yScale);


            //Hatch marks for Y
        for(int i = 0;i<numberYDivisions/2;i++){
            if(point.length>0){
                g2.setColor(gridColor);
                g2.drawLine(padding+(100*i), padding, padding+(100*i), 1000);
                g2.setColor(Color.BLACK);
                String yLabel = df.format(maxY(point) - (intervalY * i)) + "";
                g2.drawLine(495, padding + (100 * i), 505, padding + (100 * i));
                g2.drawString(yLabel, 460, padding + (100 * i));

            }
        }
        for(int i = 0;i<=numberYDivisions/2;i++){
            if(point.length>0){
                g2.setColor(gridColor);
                g2.drawLine(500+padding+(100*i), padding, 500+padding+(100*i), 1000);
                g2.setColor(Color.BLACK);
                if(i!=0) {
                    String yLabel = df.format(0 - (intervalY * i)) + "";
                    g2.drawLine(495, 500 + (100 * (i)) - padding, 505, 500 + (100 * (i)) - padding);
                    g2.drawString(yLabel, 460, 500 + (100 * (i)) - padding);
                }
            }
        }

        Double intervalX;
        intervalX = maxX(point)/5;
        //Hatch marks and grid lines for x;
        for(int i = 0;i<numberYDivisions/2;i++){
            if(point.length>0){
                g2.setColor(gridColor);
                g2.drawLine(padding,padding+(100*i),1000,padding+(100*i));
                g2.setColor(Color.BLACK);
                String yLabel = df.format(-maxX(point) + (intervalX * i)) + "";
                g2.drawLine(padding + (100 * i), 495, padding + (100 * i), 505);
                g2.drawString(yLabel, padding + (100 * i), 480);
            }
        }
        for(int i = 0;i<=numberYDivisions/2;i++){
            if(point.length>0){
                g2.setColor(gridColor);
                g2.drawLine(padding,500+padding+(100*i),1000,500+padding+(100*i));
                if(i!=0) {
                    g2.setColor(Color.BLACK);
                    String yLabel = df.format(0 + (intervalX * i)) + "";
                    g2.drawLine(500 + (100 * i) - padding, 495, 500 + (100 * i) - padding, 505);
                    g2.drawString(yLabel, 500 + (100 * i) - padding, 480);
                }
            }
        }
        //x axis
        g2.drawLine(padding, 500, 1025-padding, 500);
        //y axis
        g2.drawLine(500,padding,500,1025-padding);



    }

    private double maxX(Point[] p){
        Double Max = Double.MIN_VALUE;
        for(int i = 0;i<p.length;i++){
            if(Max<p[i].x){
                Max = p[i].x;
            }
        }
        return Max;
    }

    private double minX(Point[] p){
        Double min = Double.MAX_VALUE;
        for(int i = 0;i<p.length;i++){
            if(min>p[i].x){
                min = p[i].x;
            }
        }
        return min;
    }

    private double maxY(Point[] p){
        Double Max = Double.MIN_VALUE;
        for(int i = 0;i<p.length;i++){
            if(Max<p[i].y){
                Max = p[i].y;
            }
        }
        return Max;
    }

    private double minY(Point[] p){
        Double min = Double.MAX_VALUE;
        for(int i = 0;i<p.length;i++){
            if(min>p[i].y){
                min = p[i].y;
            }
        }
        return min;
    }

在上面的代码中,这些点是从 CSV 文件中读取的,并存储了带有 x 和 y 属性的 point[]。 为了正确显示此图,根据 point[] 中的值计算影线标记。 但我不确定如何 plot 每个点,因为创建椭圆需要屏幕上像素的 x 和 y 坐标,我不能只使用每个点的 x 和 y 坐标作为点的 x 和 y 坐标。 有没有办法将 point[] 中的 x 和 y 坐标转换为像素 x 和 y 坐标? 任何帮助表示赞赏。

您需要根据数据的max x and y of your data以及panel.width and height分别放大或缩小它们。

如果您的data x最大 x 是xmax并且您的panel widthpwidth那么您需要将data x坐标乘以pwidth/xmax 使用double类型执行此操作,然后在必要时转换为int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM