【问题标题】:Rotating, inverting and translating a PShape object in Processing在 Processing 中旋转、反转和平移 PShape 对象
【发布时间】:2019-06-01 02:32:27
【问题描述】:

我想:

  • 多次平移反转旋转单个四边形(PShape 对象)
  • 然后更改其 2 个顶部顶点之一的高度

所以整个东西就像一个关节臂可以弯曲 向右或向左

为了尽可能清楚,我做了一些图形。





我知道我可以:

  • 使用translate()翻译四边形
  • 翻转(反转)它与scale(1, -1)
  • 使用atan2() 函数旋转

问题

当将这 3 个结合在一起时,我会得到这样的结果:

旋转的角度看起来是正确的,但显然平移有问题(在 X 或 Y 轴上),我无法弄清楚到底是什么。

我怀疑枢轴缺少翻译,或者转换顺序不正确(或两者兼而有之)。

如果有人能帮助我了解我做错了什么以及如何解决这个问题,我将不胜感激。

int W = 40;
int H = 40;
int offset = 10; 

float[] p0 = {-W/2, -H/2};
float[] p1 = {-W/2,  H/2};
float[] p2 = {W/2, H/2};
float[] p3 = {W/2, -H/2 - offset};

PShape object;


void setup(){
    size(600, 600, P2D);
    smooth(8);
    noFill();
}


void draw(){
    background(255);

    pushMatrix();
    translate(width>>1, height>>1);

    float angle = atan2(p3[1] - p0[1], p3[0] - p0[0]);

    for (int i = 0; i < 6; i++){

        int factor = (i % 2 == 0) ? 1 : -1;

        //Height translation
        translate(0, H*factor);

        //Flip all quads except 1st one
        if (i > 0){
          scale(1, -1);
        }

        //Rotate once every 2 quads
        if (i%2 == 1){
          rotate(-angle*2);
        }

        object();
      }

    popMatrix();

}


void object() {
    beginShape(QUADS);

    vertex(p0[0], p0[1]);
    vertex(p1[0], p1[1]);
    vertex(p2[0], p2[1]);
    vertex(p3[0], p3[1]);

    endShape();
}

【问题讨论】:

    标签: rotation geometry processing transform


    【解决方案1】:

    终于找到了解决办法

    修复

    • QUADS 的顶点顺序不正确
    • 缺少枢轴高度的计算(基于 @Rabbid76 的帮助)
    • 基于该高度的平移需要在旋转之前操作(不知道原因)
    • 旋转角度必须乘以 -1(负角度)才能改变弯曲侧

    add_library('controlP5')
    
    W, H = 40, 40
    nQuads = 8
    offset = 0
    
    p0 = PVector(-W/2, -H/2)
    p1 = PVector(-W/2,  H/2)
    p2 = PVector(W/2, H/2)
    p3 = PVector(W/2, -H/2)
    
    
    def setup():
        size(600, 600, P2D)
        noFill()
        smooth(8)
    
        global cp5, slider
        cp5 = ControlP5(this)
        slider = cp5.addSlider('Bend').setPosition(width/2-50, height-150).setSize(100,10).setHandleSize(40).setDecimalPrecision(1).setColorBackground(color(100)).setColorForeground(color(140)).setColorActive(color(240)).setRange(-H, H).setValue(offset).setSliderMode(Slider.FLEXIBLE)
    
    
    def draw():
        background(255)
    
        global off1, off2
        if slider.getValue() >= 0:
            factor = -1
            off1 = slider.getValue()
            off2 = 0
        else:
            factor = 1
            off2 = abs(slider.getValue())
            off1 = 0
    
        pushMatrix()
        translate(width>>1, height>>1)
    
    
        angle = atan2(p3.y - p0.y - abs(slider.getValue()), p3.x - p0.x)
        H2 = -H/2 + W *tan(angle)/2
    
        for i in range(nQuads):
    
            pivotHeight = H2 if i%2 == 1 else H/2
    
            #Height translation
            if i > 0:
                translate(0 , pivotHeight)
    
            #Rotate once every 2 quads
            if i%2 == 1:
                rotate(angle*2*factor) 
    
            #Height translation
            if i > 0:
                translate(0 , pivotHeight)            
    
            #Flip all quads except 1st one
            if i > 0:
                scale(1, -1)        
    
            object()
    
        popMatrix()
    
    
    def object():
    
        beginShape(QUADS)
        vertex(p0.x, p0.y - off1) 
        vertex(p1.x, p1.y) 
        vertex(p2.x, p2.y)
        vertex(p3.x, p3.y - off2)
        endShape()
    

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 2013-05-23
      相关资源
      最近更新 更多