Java 数学计算:比较坐标,做出合理的形状

Java 数学计算:比较坐标,做出合理的形状,java,math,Java,Math,我有一道数学题。我正在制作一个游戏,用户是一个12岁的孩子。孩子的目标是计算绘制形状的面积。在easy和medium模式下,形状是给定的,并且是硬编码的,因此它们不是硬核。在硬模式下,随机生成5个坐标,这就是问题所在。我需要做一个12岁儿童可以计算的形状。随着随机坐标的出现,会出现各种各样的难题,比如交点,或者连接其他两个点的直线上的奇点等等。有没有办法计算和避免这些问题 下面是我的代码,它使随机点+在应用程序的点网格上绘制它: private void gameHard () { //

我有一道数学题。我正在制作一个游戏,用户是一个12岁的孩子。孩子的目标是计算绘制形状的面积。在easy和medium模式下,形状是给定的,并且是硬编码的,因此它们不是硬核。在硬模式下,随机生成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++;
}
private void gameHard()
{
//点之间的距离为65像素,生成的数字为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;
比较坐标();
areaImage=新JPanel()
{  
@凌驾
受保护组件(图形g)
{
超级组件(g);
图形2d g2=(图形2d)g;
g2.设置颜色(颜色为白色);
g2.fillRect(0,0780650);
g2.设置颜色(颜色为黑色);
int xnum=65,ynum=65;

对于(ynum=65;ynum我的基本想法是将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
的时间间隔内返回一个随机整数。在上面的代码中,我在每个矩形区域中有10到15个可能的点。

使用数组作为坐标方便

我们可以使用到先前点的随机距离,这样点就不近了。我会在数学上懒惰,只需重复选择新的随机数,直到随机点不再近为止

最后,我作弊并使用
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);

正如你想象的那样,可能有足够的循环。当前四个点覆盖屏幕的最大部分时,循环是无限的。

下面是一个相当简单的方法的概要

  • 选择五个不同的随机点
  • 计算五个点的质心(即平均X坐标和平均Y坐标)
  • 计算质心与五个原始点之间的角度。如果其中一个点恰好是质心,则选择任何数字(如0)作为角度
  • 按计算出的角度排列点。可以任意断开扎带
好的,这些点现在按照你排列的顺序形成一个五边形(包括从最后一点到第一点的线段)。它不一定是凸的,但不会有任何“交叉”。你可以在屏幕上画出来

你可以把面积计算为

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

您计划包括哪些类型的形状?始终是矩形?平行四边形、梯形、菱形?三角形?圆?还是希望此硬模式具有五个坐标的凸面或凹面形状?有关使用Java2D@mbomb007一般情况下,由5个点构成的任何形状;)你是说五边形吗?你读过了吗?如果你在寻找一个简单的解决方案来解决一个困难的问题,你是在寻找一些现成的汤-这不是我们在这里做的,实际上是10乘8,但明白了…如果我找不到一些数学计算的东西,也许可以做这项工作。;)好的。平庸的概括会涉及到这方面左边是5点而不是4点,右边是3点、4点和3点而不是3点、2点和3点。但是,我担心这些区域可能会使线交叉,因此你无法获得正确的五边形。因此你可能需要对边界进行一些调整以确保。你的测试表明该点不正确在到目前为止绘制的多边形内部,听起来像吗?对于凹五边形,最后一个点可能在内部。另一方面,即使该点在外部,也可能得到交叉边,例如(100,100),(200,200),(200,100),(100,200)@OleV.V.我认为多边形的contains方法对于凹面的方法足够聪明。不过,你的怀疑是对的。但是,有一点我没有做:如果发现一个“外部”点,它不能简单地添加到末尾,而是添加到点之间(I,I+1%n),其中距离最小。或诸如此类。-需要一些编程。@OleV.V.正如你给出的答案:我不想给出外卖答案,因为我认为它必须是一些课程材料,因此应该有知识。只有编程需要改进:接近、使用数组、多边形。按距离排序点的想法不可能实现如果你愿意,可以更进一步。只需像问题中那样随机选取5个点。应用其中一种算法来确定它们在多边形中的顺序。只要确保没有交叉边,就不需要精确的算法。的确,对于5个点,NP解是好的。很好。向上投票。如果有三个(或更多)点,则很少有角点点恰好有相同的角度。这可以通过断开与质心的距离来解决。谢谢@OleV.V。我没有想到那个特殊的角情况。
( x1 * y2 + x2 * y3 + x3 * y4 + x4 * y5 + x5 * y1 - y1 * x2 - y2 * x3 - y3 * x4  - y4 * x5 - y5 * x1 ) / 2