更新:我想我明白了。 scaleMultiplier也适用于我尝试执行的转换。我怀疑是这种情况,但无法确切知道它是如何受到影响的。
任何熟悉Java衍生产品的人都知道吗?我正在尝试做一些简单的事情,缩放形状并将其放置在草图的中心。简而言之,这是我的代码:
pushMatrix();
float scaleX, scaleY, scaleMultiplier, resetX, resetY, transX, transY;
scaleX = 500 / (float)clickState.bounds.getWidth();
scaleY = 500 / (float)clickState.bounds.getHeight();
scaleMultiplier = min(scaleX,scaleY);
resetX = -(float)clickState.bounds.getX();
resetY = -(float)clickState.bounds.getY();
transX = resetX + ((800 - ((float)clickState.bounds.getWidth() * scaleMultiplier))/2);
transY = resetY + ((550 - ((float)clickState.bounds.getHeight() * scaleMultiplier))/2);
scale(scaleMultiplier);
shape(clickState.pshape, transX, transY);
popMatrix();
我想做的是在美国地图上缩放一个州。 clickState是用户单击的状态。 clickState.bounds是围绕状态形状的Rectangle。 getX()和getY()返回所述框的左上角的x和y坐标。我想缩放状态,使其不大于500x500像素。之后,我要对其进行翻译,使其位于草图的中间,即800x550。
这是我遇到麻烦的地方:当我这样做时
shape(clickState.pshape, resetX, resetY);
它在草图的左上角绘制状态。那正是它应该做的。然后从那里我想添加将形状居中所需的像素数量,这就是transX和transY的作用。但是,当我使用transX和transY时,根据状态所在的位置,形状几乎完全从画布上绘制出来(即使仅从0,0向右移动了50个像素)。这对我来说毫无意义。我已经尝试了transform()的各种组合,甚至完全跳过了scale()并在shape()中使用了宽度和高度。就像处理正在试图故意使我沮丧。任何帮助表示赞赏。
最佳答案
我不熟悉Processing
,但是矩阵运算不是可交换的,顺序很重要。通常,操作以明显的后指定先应用的顺序应用,如此example中所示。