2016-09-20 48 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。我没有想到那个特殊的角落案例。 –