变换+缩放一组点

时间:2012-10-25 21:26:15

标签: java javascript math vector matrix

我写了一个用户在(640x480)窗口中绘制内容的gui。它使绘制成一组存储在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]开始。

以下是问题的屏幕截图 Image of transformation issue

正如你从图片中看到的那样,这个盒子就是这个星星所应该的位置。你可以看到缩放是正确的,而不是pos。这是因为图中的点可能 NOT 从(0,0)开始。

有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

要翻译图纸,只需

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

如果您打算将图纸居中,请选择一个中心(例如平均所有点数),否定该值,然后将所有点转换为该值。

缩放绘图:

foreach point in array
    point.x *= scale
    point.y *= scale

答案 1 :(得分: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);
        }