C++ 检查四个点是否构成平行四边形(Check whether four points make a parallelogram)

给定二维空间中的四个点,我们需要找出它们是否构成平行四边形。  

平行四边形有四条边。两条相对的边平行且长度相等。

例子:

点 = [(0, 0), (4, 0), (1, 3), (5, 3)]

以上点构成平行四边形。

点 = [(0, 0), (2, 0), (4, 0), (2, 2)]

以上点不构成平行四边形,因为前三个点本身是直线。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。  

检查正方形和长方形的问题可以从正方形检查和长方形检查中读到,但在这个问题中,我们需要检查平行四边形。平行四边形的主要性质是平行四边形的对边平行且长度相等,并且平行四边形的对角线互相平分。我们使用第二个性质来解决这个问题。由于有四个点,我们可以通过考虑每一对得到总共 6 个中点。现在对于构成平行四边形的四个点,其中两个中点应该相等,其余中点应该不同。在下面的代码中,我们创建了一个映射,其中存储了与每个中点对应的对。计算出所有中点后,我们遍历了映射并检查每个中点的出现情况,如果恰好有一个中点出现了两次而另一个出现了一次,那么给定的四个点就构成了平行四边形,否则就不构成。 

正方形检查: 

JavaScript 检查给定的四个点是否形成正方形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149929118
C# 检查给定的四个点是否形成正方形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149929017
Python 检查给定的四个点是否形成正方形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149928893
Java 检查给定的四个点是否形成正方形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149928798
C++ 检查给定的四个点是否形成正方形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149928227

长方形检查:

JavaScript 检查四条线段是否形成一个矩形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149930480
C# 检查四条线段是否形成一个矩形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149930352
Python 检查四条线段是否形成一个矩形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149930234
Java 检查四条线段是否形成一个矩形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149930107
C++ 检查四条线段是否形成一个矩形:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/149929885

示例代码:

// C++ code to test whether four points make a 
// parallelogram or not
#include <bits/stdc++.h>
using namespace std;

// structure to represent a point
struct point {
    double x, y;
    point() { }
    point(double x, double y)
        : x(x), y(y) { }

    // defining operator < to compare two points
    bool operator<(const point& other) const
    {
        if (x < other.x) {
            return true;
        } else if (x == other.x) {
            if (y < other.y) {
                return true;
            }
        }
        return false;
    }
};

// Utility method to return mid point of two points
point getMidPoint(point points[], int i, int j)
{
    return point((points[i].x + points[j].x) / 2.0, 
                (points[i].y + points[j].y) / 2.0);
}

// method returns true if point of points array form 
// a parallelogram
bool isParallelogram(point points[])

    map<point, vector<point> > midPointMap;

    // looping over all pairs of point to store their
    // mid points
    int P = 4;
    for (int i = 0; i < P; i++) {
        for (int j = i + 1; j < P; j++) {
            point temp = getMidPoint(points, i, j);

            // storing point pair, corresponding to
            // the mid point
            midPointMap[temp].push_back(point(i, j));
        }
    }

    int two = 0, one = 0;

    // looping over (midpoint, (corresponding pairs)) 
    // map to check the occurrence of each midpoint
    for (auto x : midPointMap) {
        
        // updating midpoint count which occurs twice
        if (x.second.size() == 2) 
            two++;
        
        // updating midpoing count which occurs once
        else if (x.second.size() == 1) 
            one++;
        
        // if midpoint count is more than 2, then 
        // parallelogram is not possible
        else
            return false;     
    }

    // for parallelogram, one mid point should come 
    // twice and other mid points should come once
    if (two == 1 && one == 4) 
        return true;
    
    return false;
}

// Driver code to test above methods
int main()
{
    point points[4];

    points[0] = point(0, 0);
    points[1] = point(4, 0);
    points[2] = point(1, 3);
    points[3] = point(5, 3);

    if (isParallelogram(points)) 
        cout << "Given points form a parallelogram";
    else
        cout << "Given points does not form a "
                "parallelogram";
    return 0;
}

输出:

Given points form a parallelogram

时间复杂度: O(p²logp),其中 p 是点的数量

辅助空间:O(p²),其中 p 是点的数量

方法 2:使用向量:

• 另一种检查四个点是否构成平行四边形的方法是使用向量运算。我们可以计算由点对构成的向量,并检查它们是否满足平行四边形的性质。

• 以下是此方法的算法:

• 以A、B、C、D四个点作为输入。

• 使用公式 (B - A) 和 (D - C) 计算向量 AB 和 CD。

• 使用公式 (C - A) 和 (D - B) 计算向量 AC 和 BD。

• 通过计算 AB 和 CD 的叉积来判断它们是否平行。如果叉积为零,则它们平行。

• 通过计算AC和BD的叉积来判断它们是否平行。如果叉积为零,则它们平行。

• 如果 AB 和 CD 平行,且 AC 和 BD 平行,则这些点形成平行四边形。

以下是此方法的 C++ 代码实现:

#include <bits/stdc++.h>
using namespace std;

// structure to represent a point
struct point {
    double x, y;
    point() {}
    point(double x, double y)
        : x(x)
        , y(y)
    {
    }
};

// method to calculate cross product of two vectors
double crossProduct(point a, point b)
{
    return a.x * b.y - a.y * b.x;
}

// method to check if four points form a parallelogram
bool isParallelogram(point A, point B, point C, point D)
{
    // calculate vectors AB, CD, AC, and BD
    point AB = point(B.x - A.x, B.y - A.y);
    point CD = point(D.x - C.x, D.y - C.y);
    point AC = point(C.x - A.x, C.y - A.y);
    point BD = point(D.x - B.x, D.y - B.y);

    // check if AB and CD are parallel
    if (crossProduct(AB, CD) == 0) {
        // check if AC and BD are parallel
        if (crossProduct(AC, BD) == 0) {
            // points form a parallelogram
            return true;
        }
    }

    // points do not form a parallelogram
    return false;
}

// Driver code to test above method
int main()
{
    point A = point(0, 0);
    point B = point(4, 0);
    point C = point(1, 3);
    point D = point(5, 3);

    if (isParallelogram(A, B, C, D))
        cout << "Given points form a parallelogram";
    else
        cout << "Given points do not form a parallelogram";
    return 0;
}

输出:

Given points form a parallelogram

时间复杂度:O(n^2logn),其中 n 是点的数量

辅助空间:O(n^2),因为地图数据结构用于存储中点,并且可以存储的最坏情况下的中点数量是 n^2。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hefeng_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值