Drawing a zigzag (Spring) in java

2019-07-25 10:03发布

问题:

I am currently making a program which animates the simple harmonic motion of a mass-spring when it is displaced. I have everything working apart from the fact that instead of drawing something like a spring, my program currently uses the graphics.drawline method to draw a straight line to represent the spring. I ideally want something like this however I am not very experienced with graphics and don't really know how to approach it, I tried to make an algorithm myself but it kept falling apart. Does anyone know of any existing algorithms which I could utilise here? If the stretching of the spring looked realistic then that would be great too (if possible).

Here is my current code:

    g.fillRect(width/10 - 2, height/2 - 10, 4, 20);
    g.fillRect(9*width/10 - 2, height/2 - 10, 4, 20);

    g.drawLine(width/10, height/2, (int) (width/2 - (sCoefficientH * s)), height/2);
    g.fillOval((int) (width/2 - (sCoefficientH * s)) -5, height/2 - 5, 10, 10);

As you can see there is a line connecting the wall (small rectangle) to the oval (which represents the mass on the spring). If I could add in a new method in this class which takes 2 co-ordinates and a relaxed size (where it wouldn't look compressed) and returns the graphics object (note that I'm not using Graphics2D) with the spring drawn in the correct place then I think it would look a lot nicer. This is what it looks like currently.

回答1:

Try this:

void drawSpring(double x1, double y1, double x2, double y2, double w, int N, Graphics g)
{
   // vector increment
   double inv = 0.25 / (double)N;
   double dx = (x2 - x1) * inv,
          dy = (y2 - y1) * inv;

   // perpendicular direction
   double inv2 = w / sqrt(dx * dx + dy * dy);
   double px =  dy * inv2, 
          py = -dx * inv2;

   // loop
   double x = x1, y = y1;
   for (int i = 0; i < N; i++)
   {
      g.drawLine(x                , y                , 
                 x +       dx + px, y +       dy + py);
      g.drawLine(x +       dx + px, y +       dy + py,
                 x + 3.0 * dx - px, y + 3.0 * dy - py);
      g.drawLine(x + 3.0 * dx - px, y + 3.0 * dy - py,
                 x + 4.0 * dx     , y + 4.0 * dy     );
      x += 4.0 * dx;
      y += 4.0 * dy;
   }
}

Maybe change Graphics to whatever the equivalent is in Java.

EDIT: what I got in VB.NET: