2016-09-20 15 views
-1

我有一個數學問題。我在做一個遊戲,用戶是一個12歲的孩子。孩子的目標是計算繪製形狀的面積。在簡單和中等模式下,形狀被給出並且被硬編碼,因此它們不是硬核。在硬模式中,5個座標是隨機生成的,這裏就是問題出現的地方。我需要製作一個可以由12歲孩子計算的區域。隨機座標會出現各種困難的情況,例如交叉點,或連接其他兩點的線上的奇點等等。有什麼方法可以計算和避免這些問題嗎?數學計算:比較座標以使合理的形狀

這裏是我的代碼,這使得隨機點+吸引它在應用點網格:

private void gameHard() 
{ 
    //distance between points is 65 pixels, the numbers that are generated are 1-8 
    x1=(genRandomInt())*65; 
    x2=(genRandomInt())*65; 
    x3=(genRandomInt())*65; 
    x4=(genRandomInt())*65; 
    x5=(genRandomInt())*65; 
    y1=(genRandomInt())*65; 
    y2=(genRandomInt())*65; 
    y3=(genRandomInt())*65; 
    y4=(genRandomInt())*65; 
    y5=(genRandomInt())*65; 

    compareRCoordinates(); 

    areaImage = new JPanel() 
     { 
     @Override 
     protected void paintComponent(Graphics g) 
     { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setColor(Color.WHITE); 
      g2.fillRect(0,0,780,650); 
      g2.setColor(Color.BLACK); 
      int xnum = 65, ynum = 65; 
      for(ynum=65;ynum<650;ynum=ynum+65) 
      { 
       int x=0, y=0; 
       for(xnum = 65;xnum<780;xnum=xnum+65) 
       { 
       x = xnum-9; 
       y = ynum-9;  
       g2.fillOval(x,y,18,18); 

      } 
      xnum=xnum+65; 
      } 
      g2.setColor(Color.RED); 
      g2.setStroke(new BasicStroke(6)); 
      g2.drawLine(x1,y1,x2,y2); 
      g2.drawLine(x2,y2,x3,y3); 
      g2.drawLine(x3,y3,x4,y4); 
      g2.drawLine(x4,y4,x5,y5); 
      g2.drawLine(x5,y5,x1,y1); 
     } 
    }; 

    areaImage.setBounds(20,20,780,650); 
    areaImage.setBorder(BorderFactory.createLineBorder(Color.black)); 
    this.add(areaImage); 
    roundsPlayed++; 
} 
+0

你打算包含哪些類型的形狀?它總是長方形嗎?平行四邊形,梯形,菱形?三角形?界?還是你想要這個硬模式有五個座標的凸或凹形狀? – mbomb007

+0

查看http://stackoverflow.com/questions/19238608/randomly-generating-a-shape使用Java2D的簡單隨機形狀的例子 – copeg

+0

@ mbomb007一般任何形狀的5分;) –

回答

0

我的基本想法是我把你的64(8×8)可能點到5不相交的矩形區域並從每個區域挑選一個隨機點。挑選區域以便按順序連接點不會導致任何連接線穿過。這很簡單 - 也許太簡單了?

x1 = genRandomInt(1, 3) * 65; 
    y1 = genRandomInt(1, 4) * 65; 
    x2 = genRandomInt(1, 3) * 65; 
    y2 = genRandomInt(5, 8) * 65; 
    x3 = genRandomInt(4, 8) * 65; 
    y3 = genRandomInt(6, 8) * 65; 
    x4 = genRandomInt(4, 8) * 65; 
    y4 = genRandomInt(4, 5) * 65; 
    x5 = genRandomInt(6, 8) * 65; 
    y5 = genRandomInt(1, 3) * 65; 

genRandomInt(int from, int to),使其從from通過to包括返回的時間間隔隨機int值。在上面的代碼中,每個矩形區域中有10到15個可能的點。

+0

其實它的10乘8,但明白了......可以做的工作,如果我沒有找到一些數學計算。 ;) –

+0

好的。平庸泛化將在左側取得5點高的區域而不是4點,而3,4和3點的高點取代右側的3,2和3點。但是,恐怕這些區域的選擇會使線條交叉成爲可能,因此您不能獲得合適的五角形。所以你可能不得不邊界邊界來確保。 –

0

使用數組作爲座標促進。

人們可以使用先前的點的隨機距離,所以點不近。我會數學懶惰,只是重複選擇新的隨機數,直到隨機點不再靠近。

最後,我欺騙並使用java.awt.Polygon來檢查新的候選點是否不在多邊形內部。

可以繪製多邊形,甚至填充。

字段:

int[] xs = new int[5]; // xs[0] till xs[4] 
int[] ys = new int[5]; 
Polygon pentagon; 

採摘隨機點:

final int NEAR = 20; 
for (int i = 0; i < 5; ++i) { 
    // Pull random numbers for this i'th point till okay. 
    for (;;) { 
     xs[i] = random ... 
     ys[i] = random ... 

     // Check that the point is not inside the polygon till now: 
     if (i >= 3) { 
      Polygon polygon = new Polygon(xs, ys, i); 
      if (polygon.contains(xs[i], ys[i]) { 
       continue; // Inside 
      } 
     } 

     // Check that the point are apart: 
     boolean near = false; 
     for (int j = 0; j < i && !near; ++j) { 
      near = Math.abs(xs[i] - xs[j]) < NEAR 
       && Math.abs(ys[i] - ys[j]) < NEAR; 
     } 
     if (near) { 
      continue; // Too near 
     } 

     break; // Found point i 
    } 
} 
pentagon = new Polygon(xs, ys, 5); 

圖:

 g2.setColor(Color.RED); 
     g2.setStroke(new BasicStroke(6)); 
     g2.draw(pentagon); 

     g2.setColor(Color.TEAL); 
     g2.fill(pentagon); 
     ... draw grid 

正如你可能會像可能有足夠的循環。前四個點覆蓋屏幕的最大部分時無盡無盡。

+0

您的測試,該點是不是直到現在繪製的多邊形裏面,是這樣的聲音?對於凹五邊形,最後一點可能在裏面。另一方面,即使點位於外部,例如(100,100),(200,200),(200,100),(100,200),也可能會出現交叉邊緣。 –

+0

@ OleV.V。我認爲多邊形的包含方法對於凹面方法來說足夠聰明。不過,你是對的。但是我沒有這樣做:**如果找到一個「外部」點,它不能簡單地加在末尾,而是在距離最小的點(i,i + 1%n)之間。**或者這樣。 - _some編程required._ –

+0

@ OleV.V。因爲你給出了一個答案:我不想提供外帶答案,因爲我認爲它必定是一些課程材料,因此knowlegde應該在那裏。只有編程應該被改進:方法,使用數組,多邊形。 –

2

下面是一個相當簡單的方法的輪廓。

  • 選擇五個不同的隨機點。
  • 計算五個點的質心(即平均X座標和平均Y座標)。
  • 計算從質心到五個原始點中的每一個的角度。如果其中一個點恰好是質心,那麼選擇任何數字(例如0)作爲角度。
  • 按照計算出的角度排列點。關係可以任意打破。

好的,現在按照您排列的順序(包括從最後一個點到第一個的線段)製作一個五邊形。它不一定是凸面的,但它不會有任何「交叉」。你可以在屏幕上畫這個。

你可以計算面積爲

(x1 * y2 + x2 * y3 + x3 * y4 + x4 * y5 + x5 * y1 - y1 * x2 - y2 * x3 - y3 * x4 - y4 * x5 - y5 * x1)/2 
+0

不錯。 Upvoted。如果三個(或更多)點碰巧具有相同的角度,則會出現罕見的角落情況。這可以通過例如通過與質心的距離打破關係來解決。 –

+0

謝謝@ OleV.V。我沒有想到那個特殊的角落案例。 –