2016-03-03 120 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