处理中的很多混淆是坐标系。在处理中,原点 (0,0) 位于屏幕的左上角,屏幕上仅显示正坐标。对此非常常见的解决方法是调用:
translate(width/2, height/2);
在您的void draw()
方法开始时。这样 0,0 现在位于草图的中心,任何后续调用的方法rotate(radians(65))
都将从草图的中心执行操作。
这也很好,因为使用P3D
或OPENGL
渲染器的草图通常会调用 translate 以将坐标系更改为更易于使用的东西。例如,位于 0,0 或 0,0,0 的对象位于中心,这使得相机更容易围绕对象旋转或让对象围绕其中心旋转。
另一种绘制对象的流行方法是如上所述设置原点,而不是给出每个对象的坐标,即rect(-100, -50, 50, 50)
在平移之前使用 popMatrix() 和 pushMatrix,然后在 0,0 处绘制每个对象,如下所示:
translate(width/2, height/2);
pushMatrix();
translate(-100, -50);
rect(0,0,50,50);
popMatrix();
如果您认为最终可能会迁移到 3d 渲染器,这是在 2d 渲染器中使用的好方法,因为您可以轻松替换rect()
或box()
创建sphere()
自己的方法或对象,假设原点位于 0,0 处绘制几何图形。
如果您将 x 和 y 坐标替换为变量或在 for 循环中遍历数组,则可以非常轻松地在 2d 或 3d 中绘制数百或数千个形状,而只需最少的工作量和最少的代码重写。
更新:根据他们的评论添加了对原始海报的说明。
我稍微改变了这个问题,向您展示我将如何解决这个问题。我正在使用推送和弹出矩阵展示我上面描述的翻译/旋转方法。我只是在猜测这些值,但如果您想要精确的像素,您可以在 Photoshop 或预览等图像编辑程序中进行测量。
translate(180, 150);
rect(0, 0, 180, 80);
translate(185, 170);
rotate(radians(65));
rect(0, 0, 180, 80);
translate(180, 250);
ellipse(0, 0, 8, 8);
pushMatrix()
将它们与和放在一起popMatrix()
。
void setup(){
size(400,400);
}
void draw(){
// rect1
noFill();
pushMatrix();
translate(180, 150);
rect(0, 0, 180, 80);
popMatrix();
// rect2
pushMatrix();
translate(185, 170);
rotate(radians(65));
rect(0, 0, 180, 80);
popMatrix();
// ellipse
fill(0);
pushMatrix();
translate(180, 250);
ellipse(0, 0, 8, 8);
popMatrix();
}