2

我写了一个 gui,用户在 (640x480) 窗口中绘制了一些东西。它使该绘图成为存储在 Vector 数组中的一组点。现在,我如何将这些点集转换为原点(窗口左上角的 0,0)或将其放在指定的位置?我想要的窗口的宽度和高度也是640x480。

解决之后,如何将新的点集缩放到我想要的大小?

更新 1

我解决了规模问题,但没有解决定位问题。这幅画没有去我告诉它的地方。下面是我到目前为止所拥有的代码。

float scaleX = (float)width/boundingPoints.width;
float scaleY = (float)height/boundingPoints.height;
for(int i = 0; i < cg_points.size()-1; i++){
    Point p1 = cg_points.get(i);
    Point p2 = cg_points.get(i+1);
    g.drawLine((int)(p1.x*scaleX) + pos.x, (int)(p1.y*scaleY) + pos.y, (int)(p2.x*scaleX) + pos.x, (int)(p2.y*scaleY) + pos.y);
}

我希望绘图从 pos [x, y] 所在的位置开始。目前的问题是这个。它确实遵循 pos.x 和 pos.y 的做法,但它离我们很远,并且不是从 pos[x,y] 开始的。

这是该问题的屏幕截图 转换问题的图像

正如您从图片中看到的那样,盒子应该是星星所在的位置。如您所见,缩放是正确的,而不是位置。那是因为绘图中的点可能不是从 (0,0) 开始的。

有什么建议么?

谢谢!

4

2 回答 2

2

要翻译图纸,只需

foreach point in array
    point.x += translate.x
    point.y += translate.y

如果您要将绘图居中,请选择一个中心(例如平均所有点),否定该值,然后按该值转换所有点。

要缩放绘图:

foreach point in array
    point.x *= scale
    point.y *= scale
于 2012-10-25T21:32:44.863 回答
0

所以我解决了它......耶!这是下面的代码,以防您遇到与我相同的问题。

    float scaleX = (float)width/boundingPoints.width;
    float scaleY = (float)height/boundingPoints.height;
    int bx = boundingPoints.x;
    int by = boundingPoints.y;
    for(int i = 0; i < cg_points.size()-1; i++){
            Point p1 = cg_points.get(i);
            Point p2 = cg_points.get(i+1);
            int x1 = (int) ((p1.x-bx)*scaleX);
            x1 += pos.x;
            int y1 = (int) ((p1.y-by)*scaleY);
            y1 += pos.y;
            int x2 = (int) ((p2.x-bx)*scaleX);
            x2 += pos.x;
            int y2 = (int) ((p2.y-by)*scaleY);
            y2 += pos.y;

            g.drawLine(x1, y1, x2, y2);
        }
于 2012-10-26T00:29:23.910 回答