gpt4 book ai didi

java - 如何将绘图上的 x 和 y 坐标转换为 GUI 上的像素

转载 作者:行者123 更新时间:2023-12-02 08:46:48 24 4
gpt4 key购买 nike

我正在为显示在网格上的凸包 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[] 中的值计算的。但我不确定如何绘制每个点,因为创建椭圆需要屏幕上像素的 x 和 y 坐标,我不能只使用每个点的 x 和 y 坐标作为点的 x 和 y 坐标。有没有办法将 point[] 中的 x 和 y 坐标转换为像素 x 和 y 坐标?如有任何帮助,我们将不胜感激。

最佳答案

您需要分别根据数据的最大 x 和 y 以及面板的宽度和高度来放大或缩小它们。

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

关于java - 如何将绘图上的 x 和 y 坐标转换为 GUI 上的像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61022470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com