为什么线条(肌肉)与第 3 部分(蓝色)不一致?

Why do the lines (muscles) not line up with part3 (blue)?

https://imgur.com/a/hDRx3SI 线条(肌肉)按照我的意愿从中心开始。 (此视频开始时进入草图一两秒。)为什么肌肉不与第 3 部分(蓝色圆圈)的中心对齐? 这只是一个三角函数问题吗?鉴于限制,我试图迫使他们进入不可能的位置?

Part part1;
Part part2;
Part part3;
Muscle muscle1;
Muscle muscle2;
Muscle muscle3;

void setup() {
  size (800, 800);
  frameRate(1);
  part1 = new Part(width/2, height/2, 50, color(255, 0, 0));
  part2 = new Part(width/2 + 100, height/2, 50, color(0, 255, 0));
  part3 = new Part(width/2 + 50, height/2 - 75, 50, color(0, 0, 255));
  muscle1 = new Muscle(part1.x, part1.y, part2.x, part2.y, dist(part1.x, part1.y, part2.x,part2.y), color(0, 255, 0));
  muscle2 = new Muscle(part1.x, part1.y, part3.x, part3.y, dist(part1.x, part1.y, part3.x, part3.y), color(0, 255, 0));
  muscle3 = new Muscle(part2.x, part2.y, part3.x, part3.y, dist(part2.x, part2.y, part3.x, part3.y), color(0, 255, 0));
}

void draw() {
  background(255);
  part1.drawpart();
  part2.drawpart();
  part3.drawpart();
  muscle1.drawmuscle(part1, part2);
  muscle2.drawmuscle(part1, part3);
  muscle3.drawmuscle(part2, part3);
  part2.movepart();
}

class Muscle{
  float leftx;
  float lefty;
  float rightx;
  float righty;
  float size = 100;
  int musclecolor;
  
  Muscle(float leftpositionx, float leftpositiony, float rightpositionx, float rightpositiony, float musclesize, int musclemusclecolor) {
    leftx = leftpositionx;
    lefty = leftpositiony;
    rightx = rightpositionx;
    righty = rightpositiony;
    size = musclesize;
    musclecolor = musclemusclecolor;
  }
  
  void drawmuscle(Part obj1, Part obj2) {
    strokeWeight(5);
    float dx = obj2.x - obj1.x;
    float dy = obj2.y - obj1.y;
    float angle = atan2(dy, dx);
    obj2.x = obj1.x + cos(angle) * size;
    obj2.y = obj1.y + sin(angle) * size;
    line(obj1.x, obj1.y, obj2.x, obj2.y);
  }
}
class Part{
  float x;
  float y;
  float size;
  int partcolor;
  
  Part(float positionx, float positiony, float partsize, int partpartcolor) {
    x = positionx;
    y = positiony;
    size = partsize;
    partcolor = partpartcolor;
  }
  
  void drawpart() {
    fill(partcolor);
    strokeWeight(1);
    ellipseMode(CENTER);
    ellipse(x, y, size, size);
  }
    void movepart() {
   y += 10; 
  }
}

这里有两个相互影响的不同问题,这就是为什么很难解决的原因。不过,您会很高兴地注意到,您的数学是无懈可击的。

第一个问题是 drawmuscle() 方法。您在绘制坐标时修改坐标,这不一定是个问题。 问题是您要对 3 个不同的部分级联执行此操作,这三个部分相互依赖以进行计算。变量最终都没有问题 - 所以在数学上它有效 - 但作为你在计算其他部分之前绘制了一些部分,它们最终会得到意想不到的坐标,既不是旧坐标也不是新坐标。

为了解决这个问题,我修改了 drawmuscle() 方法,让它只绘制肌肉,我添加了一个新方法来更新 muscles/parts 坐标。它仍然是您的所有代码,只是被转移到不同的容器中。然后我修改了draw()方法来反映这个变化:必须先计算坐标,然后才能绘制零件。

现在,蓝圈还是错位了。这也是因为 draw() 方法中的顺序问题:由于圆圈是在 坐标更新之前 绘制的,因此它们可能会被误画。同样,在每一帧结束时,您的计算都是正确的,但是在应用和绘制到达那里的操作的方式中,它们会出现错误。

根据经验,我会说您需要记住这个项目中的以下规则:先计算,最后绘制

下面是我对您的方法所做的更改:

void draw() {
  background(255);
  
  // calculating new positions
  muscle1.moveMuscle(part1, part2);
  muscle2.moveMuscle(part1, part3);
  muscle3.moveMuscle(part2, part3);
  
  // drawing
  part1.drawpart();
  part2.drawpart();
  part3.drawpart();  
  muscle1.drawmuscle(part1, part2);
  muscle2.drawmuscle(part1, part3);
  muscle3.drawmuscle(part2, part3);
  muscle1.growmuscle(part1, part2);
}
void drawmuscle(Part obj1, Part obj2) {
  // no calculations here
  strokeWeight(5);
  line(obj1.x, obj1.y, obj2.x, obj2.y);  
}
  
void moveMuscle(Part obj1, Part obj2) {
  // every calculations here
  float dx = obj2.x - obj1.x;
  float dy = obj2.y - obj1.y;
  float angle = atan2(dy, dx);
  obj2.x = obj1.x + cos(angle) * size;
  obj2.y = obj1.y + sin(angle) * size;
  rightx = obj2.x;
  righty = obj2.y;
}

希望对您有所帮助。玩得开心!