2

我画了一条随机线,在这种情况下,我想用字母 V 沿着这条线追踪。无论画线的角度或方向如何,我都希望 V 的底点旋转并跟随线的方向。但老实说,我不知道如何计算这个角度。下面是一些简单的代码来演示我的问题。您会看到正在绘制的红线,我希望 V 的底部点引导正在绘制的线。

在此先感谢您的任何建议。

float [ ] lineProgress = { 75, 350, 350, 350, 0 };
int lineSpeed = 25;
float angle = 0;

void setup() {
  background (255);
  size(400,400);
  noFill();
  frameRate(5);
}

void draw() 
{
    background (255);
    strokeWeight(1);

    stroke (0,255,0);
    line(lineProgress[0],lineProgress[1],lineProgress[2],lineProgress[3]);

    stroke (255,0,0);

    fill(255, 0,0, 125);

    float angle;
    //How Do I calculate this based on the line being drawn?
    angle =radians(270);

     line(
         lineProgress[0]
         , lineProgress[1]
         , lerp(lineProgress[0], lineProgress[2],lineProgress[4]/lineSpeed)
         , lerp(lineProgress[1], lineProgress[3],lineProgress[4]/lineSpeed)

         );

    rotLetter(
              "V"
               , lerp(lineProgress[0]
               , lineProgress[2]
               , lineProgress[4]/lineSpeed)
               , lerp(lineProgress[1]
               , lineProgress[3],lineProgress[4]/lineSpeed)
               , angle
               ) ;

     rotLetter("V", 200,200,angle) ;               

     lineProgress[4]++;
     if (lineProgress[4]>lineSpeed)
     {
       lineProgress[4]=0;
       lineProgress[0]=random(50,350);
       lineProgress[1]=random(50,350);
       lineProgress[2]=random(50,350);
       lineProgress[3]=random(50,350);
     }

}

void rotLetter(String l, float x, float y, float ang) {
  pushMatrix(); // save state
  textAlign(CENTER); // center letter horiz
  translate(x, y); // move to position
  rotate(ang); // rotate
   // draw char centered on acsender
   // this will work for most Caps, and some lc letters
   // but it will not allways vert center letters
  text(l, 0, textAscent()/2);
  popMatrix(); // return to saved coordinate matrix
}
4

3 回答 3

3

给定一条从(x0, y0)to 到(x1, y1)X offsetdx = x1 - x0和 Y offset的线dy = y1 - y0,角度为:

atan2(dy, dx)

将以弧度测量。

使用atan2(y, x)而不是atan(y / x)确保返回的角度在右象限。 atan只返回来自-π/2to的结果+π/2,而不是完整的 to

于 2012-10-19T08:09:53.127 回答
1
  1. 找到线的斜率y = mx + cm是斜率)。角度 = arctan(m)
  2. 旋转角度(顺时针)=2 * Pi - Angle
于 2012-10-19T08:09:23.950 回答
0

您计算旋转角度的朋友是正弦/余弦关系。您可以使用其中任何一个,但切线不涉及计算斜边的长度:

tan A = a / b

所以你的角度是

A = arctan( a / b )

或用 Java 术语:

double angle = Math.atan( ( lineprogress[ 3 ] - lineprogress[ 1 ] ) / 
                          ( lineprogress[ 2 ] - lineprogress[ 0 ] ) );

或者正如@Alnitak 还写的那样,使用 atan2 获得右象限的结果:

double angle =  Math.atan2( lineprogress[ 2 ] - lineprogress[ 0 ] ,
                            lineprogress[ 3 ] - lineprogress[ 1 ] );

假设 (x1,y1) == ( lineprogress[ 0 ] , lineprogress[ 1 ] ) 并且对于 (x2,y2)

干杯,

于 2012-10-19T08:03:33.937 回答