使用Java+Processing实现箭头整体随机旋转的技术问题咨询
实现Processing箭头整体旋转的方法
你需要用Processing自带的矩阵堆栈操作实现多个图形的整体变换,不需要单独旋转每个图形,具体实现逻辑如下:
核心原理
- 调用
pushMatrix()保存当前全局坐标系状态,本次后续的变换操作不会影响外部绘制逻辑 - 先使用
translate()将坐标系原点平移到箭头要放置的目标位置 - 调用
rotate()传入要旋转的弧度值,对当前坐标系做整体旋转 - 所有箭头组成图形使用相对当前原点的坐标绘制,即可实现整体旋转效果
- 绘制完成后调用
popMatrix()恢复之前的坐标系状态
修改后的完整代码
void setup() { size(400, 400); } void draw() { float r = random(24, 64); background(255); drawArrow(r); saveFrame("dataArrow/plus####.png"); if (frameCount == 100) { exit(); } } void drawArrow(float r){ float base = r * 2; float k = 0.5 * base; float rectSide = 0.5 * base; // 随机生成箭头放置的中心坐标 float arrowCenterX = random(base/2 + 1, width - base/2 -1); float arrowCenterY = random(base/2 + 1, height - base/2 -1); // 随机生成0-360度的旋转角度(转成弧度制) float rotateAngle = random(TWO_PI); pushMatrix(); // 先平移坐标系到箭头中心位置 translate(arrowCenterX, arrowCenterY); // 整体旋转坐标系 rotate(rotateAngle); fill(0); // 所有图形使用相对原点(箭头中心)的坐标绘制 triangle(-base/2, 0, base/2, 0, 0, -k); rect(-rectSide/2, 0, rectSide, rectSide); popMatrix(); }
注意事项
- 必须配对使用
pushMatrix()和popMatrix(),否则会出现坐标系累计偏移、后续绘制逻辑异常的问题 - 如果需要固定方向的旋转,可以把
random(TWO_PI)替换为radians(固定角度值),例如radians(180)就是箭头朝下 - 平移和旋转的顺序不能调换,必须先平移到目标位置再做旋转,否则箭头会偏移出屏幕可视范围
内容的提问来源于stack exchange,提问作者raxnocafi
相关产品推荐
相关产品推荐

