步骤:
- 1. 枚举已有三个点两两配对的情况
struct node
{
double x, y;
};
node z[3];
for (int j = 0; j < 3; j++)
cin >> z[j].x >> z[j].y;
for (int j = 0; j < 3; j++)
for (int g = j + 1; g < 3; g++)//不重复枚举
- 2. 因为要求是矩形,所以要找出在直角上的那个点,可以利用 两直角边 向量相乘 为 0 判断
bool check(node a, node b, node c) {
//每次假设 c 点为我们要找的直角点
if ((a.x - c.x) * (b.x - c.x) + (a.y - c.y) * (b.y - c.y) == 0)return true;
//判断 ac向量 * bc向量 是否为0
return false;
}
for (int j = 0; j < 3; j++)
for (int g = j + 1; g < 3; g++)
if (check(z[j], z[g], z[3 - j - g]))//三个点的编号为0、1、2,第三者编号等于 总和3 减去 前两个编号的和
- 3. 如果我们得到了直角点的坐标,我们就可以用一个公式:
//设 1点 为直角点,4点 为我们要求的第四个点,有:
x4=x2+x3−x1,
y4=y2+y3−y1
整体代码:
struct node
{
double x, y;
};
bool check(node a, node b, node c) {
if ((a.x - c.x) * (b.x - c.x) + (a.y - c.y) * (b.y - c.y) == 0)return true;
return false;
}
int main() {
node z[3];
for (int j = 0; j < 3; j++)
cin >> z[j].x >> z[j].y;
for (int j = 0; j < 3; j++)
for (int g = j + 1; g < 3; g++)
if (check(z[j], z[g], z[3 - j - g])) {
z[3] = { z[j].x + z[g].x - z[3 - j - g].x,z[j].y + z[g].y - z[3 - j - g].y };
//想写成函数也行
goto nmsl;
}
nmsl:
return 0;
}
eg:如果不是求矩形,求任意四边形的第四点,不用判断直角边直接用公式就行