根据4个角落获得正方形的中心

时间:2014-12-16 12:16:07

标签: java math trigonometry

我的代码有问题,应该给我一个正方形的中心。正方形在double [] []数组中保存为角点。

static double[] getMid(double[][] points){
    double[] mid = new double[2];
    double a = Math.sqrt( (points[0][0] - points[1][0]) * (points[0][0] - points[1][0]) 
                        + (points[0][1] - points[1][1]) * (points[0][1] - points[1][1]) );
    a/=2;
    double c = a / Math.sin(Math.toRadians(45));

    mid[0] = Math.sin(Math.toRadians(45)) * c + points[1][0];
    mid[1] = Math.cos(Math.toRadians(45)) * c + points[1][1];

    StdDraw.point(mid[0], mid[1]);

    return mid;
}

我最初的想法是计算中心和角落的距离,然后用距离和角度计算中心点。 当正方形处于正常位置时,这可以正常工作,但是一旦它旋转,中心就会偏离。

The dots represent the calculated centers.

点代表计算的中心。

3 个答案:

答案 0 :(得分:6)

我认为代码太复杂了。如果你知道这个数字是一个正方形,你需要做的就是计算任意两个对角之间的中点。

mid[0] = (points[0][0] + points[2][0]) / 2;
mid[1] = (points[0][1] + points[2][1]) / 2;

答案 1 :(得分:2)

因为它是一个正方形,你可以通过取角的x坐标的平均值找到中心,然后取角的y坐标的平均值。这将为您提供正方形中心的x和y坐标。我相信这也适用于矩形。

答案 2 :(得分:1)

我与@NPE合作,您应该只使用这个简单的代码段,但至于您的代码本身我认为您没有考虑到您有4分而不是2:

double a = Math.sqrt( (points[0][0] - points[1][0]) * (points[0][0] - points[1][0]) 
                    + (points[0][1] - points[1][1]) * (points[0][1] - points[1][1]) );

这里的其他两点在哪里?

编辑:

稍微评论你在这里做了什么。 首先,您要计算1个大小的长度:

double a = Math.sqrt((points [0] [0] - points [1] [0])*(points [0] [0] - points [1] [0])                     +(points [0] [1] - points [1] [1])*(points [0] [1] - points [1] [1]));

然后你取这个大小的一半(a/=2;)并用这个作为大尺寸的三角形(斜边)你计算角度大小的相反长度:

double c = a / Math.sin(Math.toRadians(45));

然后使用此长度分别计算您创建的这个小三角形的相反和接近大小,该三角形具有斜边后面的长度大小。

所以,不要错过一些评论,为什么这不会起作用:

  1. c应首先与sqrt(2)相乘,以表示广场中对角线的正确长度。
  2. 应减去x坐标,而不是添加到points[1][0]
  3. 此概念仅适用于45度,否则需要更复杂的计算。