java如何使用坐标很少的仿射变换?
我有一组二维点。它们的X和Y大于-2且小于2。这一点可以是:(-0.00012 ; 1.2334 )
我想用矩形在图形上显示这些点(矩形表示一个点,并将其坐标设置为其点的坐标-此外,它的大小为10*10)
类似于(…;Y)的矩形应显示在上方任何类似于(…;Y-1)的矩形(正Y方向向上)。因此,我必须将图形的原点设置在其他地方,而不是左上角
我正在尝试使用Graphics2D
的AffineTransform
来实现这一点
- 我得到所有X坐标的最小值
- 我得到所有Y坐标的最小值
- 我得到所有X坐标的最大值
- 我得到所有Y坐标的最大值
- 我得到距离
xmax-xmin
和ymax-ymin
- 然后,我写了下面的代码李>
屏幕截图
几天前,我使用自己的方法进行缩放,得到了以下图表:
(正如我所解释的,Y是倒转的,这不是一件好事)
就目前而言,也就是说,根据我在下面给出的代码,我只有一个点占据了图中所有的位置!一点也不好
我想要:
(没有直线,也没有图形的轴。这里重要的是根据点的坐标正确显示点)
代码
要获取最小和最大坐标值,请执行以下操作:
x_min = Double.parseDouble((String) list_all_points.get(0).get(0));
x_max = Double.parseDouble((String) list_all_points.get(0).get(0));
y_min = Double.parseDouble((String) list_all_points.get(0).get(1));
y_max = Double.parseDouble((String) list_all_points.get(0).get(1));
for(StorableData s : list_all_points) {
if(Double.parseDouble((String) s.get(0)) < x_min) {
x_min = Double.parseDouble((String) s.get(0));
}
if(Double.parseDouble((String) s.get(0)) > x_max) {
x_max = Double.parseDouble((String) s.get(0));
}
if(Double.parseDouble((String) s.get(1)) < y_min) {
y_min = Double.parseDouble((String) s.get(1));
}
if(Double.parseDouble((String) s.get(1)) > y_max) {
y_max = Double.parseDouble((String) s.get(1));
}
}
要指出一点:
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);
x = storable_data.getNumber(0).intValue();
y = storable_data.getNumber(1).intValue();
graphics.fillRect(x, y, 10, 10);
graphics.drawString(storable_data.toString(), x - 5, y - 5);
}
要绘制图表,请执行以下操作:
@Override
public void paint(Graphics graphics) {
this.graphics = graphics;
Graphics2D graphics_2d = ((Graphics2D) this.graphics);
AffineTransform affine_transform = graphics_2d.getTransform();
affine_transform.scale(getWidth()/(x_max - x_min), getHeight()/(y_max - y_min));
affine_transform.translate(x_min, y_min);
graphics_2d.transform(affine_transform);
for(StorableData storable_data : list_all_points) {
graphics_2d.setColor(Color.WHITE);
this.drawPoint((Cupple) storable_data);
}
# 1 楼答案
我建议您将每个数据点映射到屏幕上的一个点,从而避免以下坐标系陷阱。拿出你的点列表,从中创建一个要绘制的点列表。考虑到:
y
轴的方向是相反的李>完成后,使用新的点列表绘制图形,并使用初始点列表进行计算。下面是一个例子:
还有一个:![enter image description here](https://i.stack.imgur.com/qTtgT.png)
您可能希望使点在栅格交点上对齐,而不是在其下方和右侧对齐。我相信你会解决这个问题的
此外,我对点进行了排序,以便
drawPolygon
以正确的顺序绘制线条。如果你的观点是任意排列的,那就想办法找到轮廓。如果你想在所有点之间画线,就像你的例子中那样,用drawLine
迭代它们的所有组合