0

我最近才开始涉足处理和动画……这太新了!还有……我的三角很烂。

我有这个代码:

    float ballPosX = 10;
    float ballPosY = 10;

    float boxPosX = 400;
    float boxPosY = 500;

    void setup() {
      size(800,600);
      background(0);
    }

    void draw() {
      fill(0, 20);
      rect(0, 0, width, height);

      fill(0, 240, 0);
      rect(boxPosX, boxPosY, 50, 50);

      fill(240, 0, 0);
      smooth();
      ellipse(ballPosX, ballPosY, 15, 15);

    //  stroke(0,0,240);
    //  line(ballPosX, ballPosY, boxPosX, boxPosY);
    //  line(ballPosX, ballPosY, 10, boxPosY);
    //  line(10, boxPosY, boxPosX, boxPosY);
      noStroke();

      //work out a2 + b2 = c2 - Pythagoras
      float a = boxPosX - ballPosX;
      float b = boxPosY - ballPosY;
      float c = sqrt(sq(a) + sq(b));
      println("a: " + a + " b: " + b + " c: " + c);

      //now get the angles
      float C = radians(90.0);
      float B = asin(a/c);
      float A = radians(180) - C - B;
      println("A: " + degrees(A));
      println("B: " + degrees(B));
      println("C: " + degrees(C));

      //lets say b is 10, work out a
      //we have the angles...
      b = 10;
      float sinA = sin(A);
      float sinB = sin(B);
      a = sinA/(sinB/b);
      fill(240, 0, 0);
      smooth();
      ellipse(b, a, 15, 15);

      for(int i = 0; i < 160; i++) {
       b += 5;
       sinA = sin(A);
       sinB = sin(B);
       a = sinA/(sinB/b);
       println("new a:" + a);

       fill(240, 0, 0);
       smooth();
       ellipse(b, a, 15, 15);
     }
   }

基本上我在点 x1,y1 有一个椭圆,在点 x2,y2 有一个矩形。使用直角三角形沿 c 线绘制椭圆。上面的代码工作......或多或少。

这个想法是让许多椭圆从 x=0 开始彼此相邻,并使用相同的方法让它们都收敛在矩形上。

希望这是有道理的!非常感谢任何帮助!

4

1 回答 1

0

线性插值怎么样(已经在 Processing as lerp()中实现了:

float startX,startY,endX,endY;

void setup(){
  size(400,400,P2D);
  smooth();
  noStroke();
  rectMode(CENTER);

  startX = random(10,50);
  startY = random(10,50);
  endX   = height - random(10,50);
  endY   = width  - random(10,50);
}
void draw(){
  background(0);
  //compute our values
  float t = map(mouseX,0,width,0,1);//a value between 0.0 and 1.0 - where on the line we want to be
  float x = lerp(startX,endX,t);//lerp with take care of linear interpolation for us
  float y = lerp(startY,endY,t);
  //draw
  for(float d = 0 ; d <= 1; d+= .05) 
    ellipse(lerp(startX,endX,d),lerp(startY,endY,d),5,5);                                           
  rect(x,y,10,10);
}
void mousePressed(){   setup(); }

var startX,startY,endX,endY;

function setup(){
  createCanvas(400,400);
  smooth();
  noStroke();
  rectMode(CENTER);

  startX = random(10,50);
  startY = random(10,50);
  endX   = height - random(10,50);
  endY   = width  - random(10,50);
}
function draw(){
  background(0);
  //compute our values
  var t = constrain(map(mouseX,0,width,0,1),0,1);//a value between 0.0 and 1.0 - where on the line we want to be
  var x = lerp(startX,endX,t);//lerp with take care of linear interpolation for us
  var y = lerp(startY,endY,t);
  //draw
  for(var d = 0 ; d <= 1; d+= .05) 
    ellipse(lerp(startX,endX,d),lerp(startY,endY,d),5,5);                                           
  rect(x,y,10,10);
}
function mousePressed(){   setup(); }
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.4.4/p5.min.js"></script>

于 2012-06-21T14:33:51.667 回答