考虑一个矩形 ABCD,已知 AD 边和 BC 边的中点坐标(分别为 p 和 q),同时给出了这两条边的长度 L(AD = BC = L)。现在的任务是,根据这些给定的参数,计算出四个顶点 A、B、C 和 D 的坐标。
示例:
输入:p = (1, 0)
q = (1, 2)
L = 2
输出:(0, 0), (0, 2), (2, 2), (2, 0)
解释:
计算出的点构成了一个矩形,
且符合输入的约束条件。
输入:p = (1, 1)
q = (-1, -1)
L = 2*sqrt(2)
输出:(0, 2), (-2, 0), (0, -2), (2, 0)
根据问题描述,我们可以将情况分为三种:
- 矩形是水平的,即 AD 和 BC 平行于 X 轴。
- 矩形是垂直的,即 AD 和 BC 平行于 Y 轴。
- 矩形是倾斜的,即与坐标轴成一定的角度。
前两种情况非常直观,利用基础几何知识就能轻松解决。而对于第三种情况,我们需要应用一些数学概念来确定顶点的位置。
为了更清晰地理解,让我们参考上面的示意图。已知 p 和 q 的坐标,因此我们可以求出 AD 和 BC 的斜率(因为连接 p 和 q 的线段 pq 垂直于 AD)。一旦我们知道了 AD 的斜率,就可以得出经过 AD 的直线方程。接下来,我们可以利用距离公式计算出沿 X 轴和 Y 轴的位移量。
如果 AD 的斜率为 m,那么
m = (p.x- q.x)/(q.y - p.y)
沿 X 轴的位移 dx 为:
L/(2*sqrt(1+m*m))
同理,沿 Y 轴的位移 dy 为:
m*L/(2*sqrt(1+m*m))
现在,我们只需要将计算出的位移量与相应点的坐标进行加法或减法运算,就能简单地求出四个顶点的坐标。
下面是具体的代码实现。
C++
CODEBLOCK_fa1cc79c
Java
“
// Java program to find corner points of
// a rectangle using given length and middle
// points.
class GFG
{
// Structure to represent a co-ordinate point
static class Point
{
float x, y;
Point()
{
x = y = 0;
}
Point(float a, float b)
{
x = a;
y = b;
}
};
// This function receives two points and length
// of the side of rectangle and prints the 4
// corner points of the rectangle
static void printCorners(Point p, Point q, float l)
{
Point a = new Point(), b = new Point(),
c = new Point(), d = new Point();
// horizontal rectangle
if (p.x == q.x)
{
a.x = (float) (p.x – (l / 2.0));
a.y = p.y;
d.x = (float) (p.x + (l / 2.0));
d.y = p.y;
b.x = (float) (q.x – (l / 2.0));
b.y = q.y;
c.x = (float) (q.x + (l / 2.0));
c.y = q.y;
}
// vertical rectangle
else if (p.y == q.y)
{
a.y = (float) (p.y – (l / 2.0));
a.x = p.x;
d.y = (float) (p.y + (l / 2.0));
d.x