2016-03-03 117 views
1

我目前正在制作一个程序,它可以在质量弹簧移动时为其简单运动提供动画。除了绘制像春天之类的东西之外,我的所有工作都有所不同,我的程序目前使用graphics.drawline方法绘制一条直线来表示弹簧。我最好想要像this这样的东西,但是我对图形并不是很有经验,也不知道如何去接近它,我试图自己制定一个算法,但它一直在崩溃。有谁知道任何现有的算法,我可以在这里使用?如果春天的伸展看起来逼真,那也会很棒(如果可能的话)。在java中绘制锯齿形(弹簧)

这里是我当前的代码:

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); 

正如你可以看到有连接的墙(小矩形)的椭圆形(代表弹簧上的质量)的线路。如果我可以在这个类中添加一个新的方法,该方法需要2个坐标和一个宽松的大小(它看起来不会压缩),并返回图形对象(注意我没有使用Graphics2D)正确的地方,那么我认为它会看起来好多了。 This就是它现在的样子。

+1

我会一展身手。你想要它是垂直还是水平?你想能够指定线圈的数量或尺寸(宽度等)? – 2016-03-03 16:49:42

+0

@willywonka_dailyblah非常感谢你!我的模拟可以是任何方向。用户给出的输入是弹簧的自然长度和原始延伸,所以也许自然长度越长,线圈的数量越大。我的代码中的'sCoefficientH'就是这样,无论输入的长度如何,弹簧的末端总是会穿过相同的区域,所以如果长度不同的线圈数量不同,那么这将非常酷。你在想什么样的算法?划线的组合? – Loua

+0

我会尝试做一个_general_弹簧类型,你只需要指定弹簧的端点,并且它会相应地旋转弹簧。我可以让你指定线圈的宽度和数量。顺便说一句,我不明白你的'sCoefficientH' - 你的意思是一种泊松因子? – 2016-03-03 17:02:12

回答

3

试试这个:

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; 
    } 
} 

也许改变Graphics到任何相当于在Java中。

编辑:我在VB.NET有: enter image description here

+0

谢谢!如果你不介意,N代表什么?并且w是宽度? – Loua

+1

@Loua w是弹簧的宽度是。 N是线圈的数量。附图是N = 5,W = 50 – 2016-03-03 18:00:52