已知平面直角坐标系中矩形的三个点坐标,求第四个点的坐标(较为简洁的代码实现)

步骤:

  • 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:如果不是求矩形,求任意四边形的第四点,不用判断直角边直接用公式就行

    原文作者:阐上
    原文地址: https://blog.csdn.net/weixin_51797626/article/details/122598321
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞