gpt4 book ai didi

rotation - 在处理中旋转、反转和平移 PShape 对象

转载 作者:行者123 更新时间:2023-12-02 19:58:01 25 4
gpt4 key购买 nike

我愿意:

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

因此整个物体就像一个铰接臂可以弯曲向右或向左

为了尽可能清楚地说明,我制作了一些图形。

enter image description here

<小时/>

enter image description here

<小时/>

enter image description here

<小时/>

enter image description here

<小时/>

enter image description here

我知道我可以:

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

enter image description here

问题

将这 3 个组合在一起时,我得到以下结果:

https://media.giphy.com/media/lkACPOxBLOhtk20gzD/giphy.gif

旋转角度似乎是正确的,但显然平移有问题(无论是在 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();
}

最佳答案

终于找到解决办法了

修复:

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

enter image description here

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()

关于rotation - 在处理中旋转、反转和平移 PShape 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54057243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com