我写了一个用户在(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]开始。
以下是问题的屏幕截图
正如你从图片中看到的那样,这个盒子就是这个星星所应该的位置。你可以看到缩放是正确的,而不是pos。这是因为图中的点可能 NOT 从(0,0)开始。
有什么建议吗?
谢谢!
答案 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);
}