将坐标系(0,800)中的点转换为坐标系(50,-50)中的点 jFrame<->opengl

4

我在以下坐标系统中有一个点:

Java AWT:

0,0|------------------------|
   |                        |
   |  (middle p. 400,300)   |
   |                        |
   |------------------------|800,600

我希望将其转换为以下系统:

OpenGL

  50,50|------------------------|
       |                        |
       |     (middle p. 0,0)    |
       |                        |
       |------------------------|-50,-50

有没有想法我该怎么做?
2个回答

6

通常情况下,您需要将一个(矩形)坐标系 A 转换为坐标系 B

首先将源坐标系 A 映射到标准化范围 [0, 1]

double nx = x / (x1 - x0);
double ny = y / (y1 - y0);

假设 (x0, y0) 是左上角,(x1, y1) 是右下角。然后将其映射到新的坐标系:

double px = X0 + nx * (X1 - X0);
double py = Y0 + ny * (Y1 - Y0);

新坐标系的左上角是 (X0, Y0),右下角是 (X1, Y1)

对于任何两个矩形坐标系,此方法都适用。


谢谢,我已经尝试了你的公式,非常好用!可惜我还不能给分... - RandomGuy
这应该适用于3D矩形吧?我没有看到它不能通过计算相同的nz和pz来处理第三个维度的任何理由。我有什么遗漏的吗? - Wizard
@Wizard:假设这些维度是笛卡尔坐标,那当然可以。这在n维空间中同样适用。 - Mike Bailey

2
public Point awtToOpenGL(Point p) {
  Point newP = new Point();
  newP.setX(50 - (p.getX() / 8));
  newP.setY(50 - (p.getY() / 6));
  return newP;
}

[编辑] 起源错误,重试。

由于OpenGL系统宽度为100,而AWT宽度为800,因此我们需要将x值除以8。按照相同的逻辑,y需要被6整除。由于x和y都从50开始并向下运动,因此我们只需要从50中减去该值即可。


你好,非常感谢你的帮助,但似乎它并没有完全正常工作,在我应该得到(50,50)的地方,我得到了(50,-50)。更准确地说,在OpenGL的左上角顶点处。 - RandomGuy
是的,我起始坐标弄错了。不过这个应该可以工作。 - Keppil
谢谢,这很有用!你能更好地解释一下它是如何工作的吗?数字8和6来自哪里?是从800x600来的吗?再次感谢。 - RandomGuy
1
不用谢!我添加了一些解释,希望这样更清楚了。 - Keppil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接