Processing 如何创建具有渐变颜色的线条?

Processing 如何创建具有渐变颜色的线条?,processing,Processing,我想在一个球体和另一个球体之间画一条线。线的颜色应从第一个球体的颜色更改为下一个球体的颜色。我该怎么做呢?你必须计算你要画的线的数学函数。只需将其中一个点的向量减去另一个点向量,即可轻松完成此操作。这将是方向向量,它将乘以变量,然后添加一个点。之后,您必须使用处理提供的功能(更改像素的颜色)和功能(进行渐变) 最终代码如下所示: PVector point1; PVector point2; color color1; color color2; void drawGradientLine(P

我想在一个球体和另一个球体之间画一条线。线的颜色应从第一个球体的颜色更改为下一个球体的颜色。我该怎么做呢?

你必须计算你要画的线的数学函数。只需将其中一个点的向量减去另一个点向量,即可轻松完成此操作。这将是方向向量,它将乘以变量,然后添加一个点。之后,您必须使用处理提供的功能(更改像素的颜色)和功能(进行渐变)

最终代码如下所示:

PVector point1;
PVector point2;
color color1;
color color2;
void drawGradientLine(PVector点1、PVector点2、color1、color2){
PVector direcVector=PVector.sub(点2,点1);

对于(float f=0;f<1;f+=0.0001){//0.0001或您喜欢的值0xImperiak的解决方案是正确的(+1)。 如果速度/效率成为问题,则可以直接访问

e、 g

由于您提到了球体,因此可以利用
P3D
渲染器更改顶点颜色以实现渐变效果:

color firstColor  = 0xffb957ce;
color secondColor = 0xff5994ce;

void setup(){
  size(600, 600, P3D);
  sphereDetail(9);
}

void draw(){
  background(#3a4e93);
  translate(width * 0.5, height * 0.5, 0);
  noFill();
  float sphere1Y = sin(frameCount * 0.01) * 30;
  float sphere2Y = sin((frameCount * 0.01) + PI) * 30;
  // draw 1st sphere
  drawSphere(-150, sphere1Y, 0, 90, firstColor);
  // draw 2nd sphere
  drawSphere( 150, sphere2Y, 0, 90, secondColor);
  //draw gradient line
  drawGradientLine(-150, sphere1Y, 0,
                    150, sphere2Y, 0,
                    firstColor, secondColor);
}

void drawGradientLine(float x1, float y1, float z1,
                      float x2, float y2, float z2,
                      color colorFrom, color colorTo){
  noStroke();
  // draw gradient line
  beginShape();
    // change vertex colours between vertices to achieve gradient look
    fill(colorFrom);
    vertex(x1, y1, z1);
    // slight offset to fake thickness
    vertex(x1, y1-3, z1);    
    fill(colorTo);
    vertex(x2, y2, z2);
    // slight offset to fake thickness
    vertex(x2, y2+3, z2);    
  endShape(CLOSE);                        
}

void drawSphere(float x, float y, float z, float radius, color strokeColor){
  stroke(strokeColor);
  pushMatrix();
    translate(x, y, z);
    sphere(radius);
  popMatrix();
}

请注意,使用4个点绘制一个薄矩形:球体之间的两个点以及每个点的轻微垂直偏移

这是一个更大的解决方法。通常你需要计算线之间的角度来正确旋转坐标,但由于这是一个笔划,这就足够了

此外,还可以使用@micycle的库和
mask()
所需的行

loadPixels();
// for...
pixels[(int)newRelPoint.x + (int)newRelPoint.y * height] = colorAtPoint;
color firstColor  = 0xffb957ce;
color secondColor = 0xff5994ce;

void setup(){
  size(600, 600, P3D);
  sphereDetail(9);
}

void draw(){
  background(#3a4e93);
  translate(width * 0.5, height * 0.5, 0);
  noFill();
  float sphere1Y = sin(frameCount * 0.01) * 30;
  float sphere2Y = sin((frameCount * 0.01) + PI) * 30;
  // draw 1st sphere
  drawSphere(-150, sphere1Y, 0, 90, firstColor);
  // draw 2nd sphere
  drawSphere( 150, sphere2Y, 0, 90, secondColor);
  //draw gradient line
  drawGradientLine(-150, sphere1Y, 0,
                    150, sphere2Y, 0,
                    firstColor, secondColor);
}

void drawGradientLine(float x1, float y1, float z1,
                      float x2, float y2, float z2,
                      color colorFrom, color colorTo){
  noStroke();
  // draw gradient line
  beginShape();
    // change vertex colours between vertices to achieve gradient look
    fill(colorFrom);
    vertex(x1, y1, z1);
    // slight offset to fake thickness
    vertex(x1, y1-3, z1);    
    fill(colorTo);
    vertex(x2, y2, z2);
    // slight offset to fake thickness
    vertex(x2, y2+3, z2);    
  endShape(CLOSE);                        
}

void drawSphere(float x, float y, float z, float radius, color strokeColor){
  stroke(strokeColor);
  pushMatrix();
    translate(x, y, z);
    sphere(radius);
  popMatrix();
}