在平面上检查四个点是否能够定义一个正方形?

3
如何检查平面上的4个点是否能定义一个正方形?有一个函数,它接受一个点和正方形面积值作为输入参数,并返回四个边平行于x轴和y轴的正方形(定义相应类型)。以下是我开始的内容:
#include <stdio.h>
#include<math.h>
struct point{
float x;
float y;
}
typedef struct point POINT;
struct square{
struct point p1;
struct point p2;
struct point p3;
struct point p4;
}
typedef struct square SQUARE;

int main()
{
int point;
printf("point coordinate");
printf("\n\n");

printf("enter data\n");

8
这是作业吗? - Oded
1
当前的代码无法编译。 - Andrei Ciobanu
2
这个正方形必须与x轴和y轴对齐吗? - phimuemue
3个回答

4

计算每对点之间的6个平方距离。例如:

(x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)

将它们排序。
其中最小的四个应该(大约)相等,而较大的两个应该是(大约)两倍。

你需要一个“正方形有多正”的度量吗?


我应该输入一个点和一个区域(可以让我计算出边长)。然后我需要生成四个正方形。每个正方形都要有一个角落在我输入的点上,并且它们的边必须平行于x或y轴。@Łukasz Lew:这是我在波兰工业技术大学电子和信息技术系的第一年,对我来说情况很艰难...因为我不会说波兰语,所以不能得到额外的解释 :( - osabri
我真的很喜欢你的方法。稍微变化一下,你可以计算六个向量的点积。其中四个应该(大约)为零,另外两个应该(大约)相等于1/ sqrt(2)。 - Sparky
两个向量的点积可以计算为...(x2 - x1) * (x3 - x1) + (y2 - y1) * (y3 - y1) + (z2 - z1) * (z3 * z1)其中使用了点P1、P2和P3,其中向量1 = (P2 - P1),向量2 = (P3 - P1)。 - Sparky

1
  1. 选择p1,并将其作为原点,即通过-p1将每个点进行平移。
  2. 让p2成为最接近p1的下一个点。(根据Paul R的观察结果进行修正。)
  3. 取p1和p2之间的角度theta,将所有点旋转-theta。此时,p1和p2形成水平线(假设角度0朝向东方)。
  4. 测试p3和p4是否具有相同的y坐标(在容差范围内)。
  5. 测试p3和p4是否与p1和p2具有相同的x坐标,以任意顺序(在容差范围内)。

0

这取决于您是否可以对点的排序进行任何假设。如果不能,则将有两个操作:

  1. 首先按X、Y排序点

  2. 测试相等的宽度/高度(请注意,由于您正在使用浮点数作为坐标,因此在比较相等性时可能需要定义一个小公差值)

如果已知点已经按特定顺序排列,则可以省略步骤1。

(请注意,此答案假定您正在测试与X/Y轴相同方向的正方形 - 如果正方形可以旋转到某个任意角度,则会变得更加复杂。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接