Java 图形与负坐标

Java 图形与负坐标,java,swing,graphics,coordinates,Java,Swing,Graphics,Coordinates,我想显示具有负坐标(X和Y)的点。目前,X为负的点似乎显示正确(即:它们位于X为正的点的左侧) 但是,具有负Y的点显示在我的图形的顶部:例如,Y=-5的点将显示在Y=-3的点的顶部 如何反转显示的图形 我的(简单)代码: 封装通用类; 导入javax.swing.*; 导入java.awt.*; 导入java.util.List; 公共类图扩展JFrame{ 私有列表列出\u检测到的\u点; 私人列表列出所有点; 私人杯重心; 公共图(字符串标题、列表所有点、列表检测点){ 双标度系数=200;

我想显示具有负坐标(X和Y)的点。目前,X为负的点似乎显示正确(即:它们位于X为正的点的左侧)

但是,具有负Y的点显示在我的图形的顶部:例如,Y=-5的点将显示在Y=-3的点的顶部

如何反转显示的
图形

我的(简单)代码:

封装通用类;
导入javax.swing.*;
导入java.awt.*;
导入java.util.List;
公共类图扩展JFrame{
私有列表列出\u检测到的\u点;
私人列表列出所有点;
私人杯重心;
公共图(字符串标题、列表所有点、列表检测点){
双标度系数=200;
双动x=500,动y=500;
this.add(新的JPanel(){
私有图形;
int x,y;
专用空位提取点(可存储的Cupple_数据){
x=(int)(可存储数据.getNumber(0)*缩放系数+移动x);
y=(int)(可存储数据.getNumber(1)*缩放系数+移动y);
图形.fillRect(x,y,10,10);
绘图字符串(可存储的_data.toString(),x-5,y-5);
}
@凌驾
公共空间绘制(图形){
这个。图形=图形;
for(可存储数据可存储数据:列出所有点){
图形.设置颜色(颜色.白色);
此.绘图点((杯形)可存储的_数据);
}
如果(列出检测到的点!=null){
for(可存储数据可存储数据:列出检测到的点){
图形.设置颜色(颜色.红色);
此.绘图点((杯形)可存储的_数据);
}
}
}
});
此.setVisible(true);
}
}

假设您收到了所有需要绘制的点,首先找到每个尺寸上的最小和最大坐标。使用此选项,可以获得比例因子(使用最小值和最大值之间的距离以及图形框的大小)和偏移(以便最小值与图形框的零相对应)


然后使用上面的数据创建一个仿射变换表,以便在绘制时正确转换每个点。

假设您收到所有需要绘制的点,首先找到每个标注上的最小和最大坐标。使用此选项,可以获得比例因子(使用最小值和最大值之间的距离以及图形框的大小)和偏移(以便最小值与图形框的零相对应)


然后使用上面的数据创建一个
仿射变换表
,以便在绘制时正确转换每个点。

您希望在何处使用负坐标打印点?大多数图形系统(如Java2D)的原点(0,0)位于左上角,正x向右,正y向下。这是一个历史事件,因为大多数计算机显示硬件实际上都是这样绘制的。所以,你所经历的,正是你应该经历的。请参见
AffineTransform
Graphics2D.translate(…)
,了解如何更改逻辑原点。
AffineTransform
在这里是您的朋友。
Graphics
注意,在
component
子类中通常不应将
Graphics
对象作为实例变量,而是传递在
paint(Graphics)
回调中得到的实例。对于
JComponent
s,通常覆盖
paintComponent
也比覆盖
paintComponent
更好。下面是一个示例:您想在何处使用负坐标打印点?大多数图形系统(如Java2D)的原点(0,0)位于左上角,正x向右,正y向下。这是一个历史事件,因为大多数计算机显示硬件实际上都是这样绘制的。所以,你所经历的,正是你应该经历的。请参见
AffineTransform
Graphics2D.translate(…)
,了解如何更改逻辑原点。
AffineTransform
在这里是您的朋友。
Graphics
注意,在
component
子类中通常不应将
Graphics
对象作为实例变量,而是传递在
paint(Graphics)
回调中得到的实例。对于
JComponent
s,通常覆盖
paintComponent
也比覆盖
paintComponent
要好。下面是一个示例:我做了,但我的所有点都显示在同一位置。您可以在这里看到5行:与其发布结果的屏幕截图,不如将更改后的(可编译、可运行)代码作为问题的一部分发布。另外,此任务似乎需要两个
AffineTransform
实例。第一种方法是缩放值的范围,以(几乎)填充可用空间(在点的边缘周围留下一些小边框)。第二种方法是移动(平移)坐标,使它们都为正(因此在面板上可见)。我这样做了,但我所有的点都显示在同一个位置上。您可以在这里看到5行:与其发布结果的屏幕截图,不如将更改后的(可编译、可运行)代码作为问题的一部分发布。另外,此任务似乎需要两个
AffineTransform
实例。第一种方法是缩放值的范围,以(几乎)填充可用空间(在点的边缘周围留下一些小边框)。第二种方法将移动(平移)坐标,使它们都为正(因此在面板上可见)。
package general_classes;

import javax.swing.*;
import java.awt.*;
import java.util.List;

public class Graph extends JFrame {

    private List<StorableData> list_detected_points;
    private List<StorableData> list_all_points;
    private Cupple barycenter;

    public Graph(String title, List<StorableData> list_all_points, List<StorableData> list_detected_points) {

        double scaling_coef = 200;
        double move_x = 500, move_y = 500;


        this.add(new JPanel() {
            private Graphics graphics;

            int x, y;
            private void drawPoint(Cupple storable_data) {
                x = (int) (storable_data.getNumber(0) * scaling_coef + move_x);
                y = (int) (storable_data.getNumber(1) * scaling_coef + move_y);
                graphics.fillRect(x, y, 10, 10);
                graphics.drawString(storable_data.toString(), x - 5, y - 5);
            }

            @Override
            public void paint(Graphics graphics) {
                this.graphics = graphics;

                for(StorableData storable_data : list_all_points) {
                    graphics.setColor(Color.WHITE);
                    this.drawPoint((Cupple) storable_data);
                }

                if(list_detected_points != null) {
                    for (StorableData storable_data : list_detected_points) {
                        graphics.setColor(Color.RED);
                        this.drawPoint((Cupple) storable_data);

                    }
                }

            }
        });

        this.setVisible(true);
    }

}