Valid Square 有效的正方形

本文介绍了一种算法,用于判断在二维空间中给定的四个点是否能构成一个正方形。通过计算点之间的距离,确保四条边等长且两条对角线长度相等,从而验证正方形的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。

一个点的坐标(x,y)由一个有两个整数的整数数组表示。

示例:

输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1]
输出: True

注意:

  1. 所有输入整数都在 [-10000,10000] 范围内。
  2. 一个有效的正方形有四个等长的正长和四个等角(90度角)。
  3. 输入点没有顺序。

思路:基本思想就是初中证明四边形是正方形的条件:如果四条边都相等且对角线也相等,那么这个四边形是正方形

参考代码:

class Solution {
public:
    int dist(vector<int>& p1, vector<int>& p2) {
        return (int)(pow(p2[1] - p1[1], 2) + pow(p2[0] - p1[0], 2));
    }
    bool check(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
        return dist(p1, p2) > 0 && dist(p1, p2) == dist(p2, p3) && dist(p2, p3) == dist(p3, p4) && dist(p3, p4) == dist(p4, p1)
            && dist(p1, p3) == dist(p2, p4);
    }
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
        return check(p1, p2, p3, p4) || check(p1, p3, p2, p4) || check(p1, p2, p4, p3);
    }
};

 

 

在MFC(Microsoft Foundation Classes)中实现三角形填充算法以填充正方形,可以通过以下步骤进行: 1. **创建MFC应用程序**: 首先,确保你已经创建了一个MFC应用程序。如果没有,可以使用Visual Studio创建一个新的MFC应用程序。 2. **定义正方形区域**: 在你的视图类中定义正方形的四个顶点坐标。例如,可以在`OnDraw`方法中定义正方形的顶点。 3. **实现三角形填充算法**: 使用扫描线算法或其他三角形填充算法来填充正方形。以下是一个简单的示例代码,展示了如何在MFC中使用扫描线算法填充正方形。 ```cpp void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // 定义正方形的四个顶点 POINT square[4] = { {100, 100}, {200, 100}, {200, 200}, {100, 200} }; // 填充正方形 FillSquare(pDC, square); } void CMyView::FillSquare(CDC* pDC, POINT* square) { // 使用扫描线算法填充正方形 int minY = min(min(square[0].y, square[1].y), min(square[2].y, square[3].y)); int maxY = max(max(square[0].y, square[1].y), max(square[2].y, square[3].y)); int minX = min(min(square[0].x, square[1].x), min(square[2].x, square[3].x)); int maxX = max(max(square[0].x, square[1].x), max(square[2].x, square[3].x)); for (int y = minY; y <= maxY; y++) { for (int x = minX; x <= maxX; x++) { pDC->SetPixel(x, y, RGB(255, 0, 0)); // 红色填充 } } } ``` 4. **优化填充算法**: 上述代码使用了简单的逐像素填充方法,这在性能上可能不够优化。可以通过扫描线算法或其他优化算法来提高填充效率。 ```cpp void CMyView::FillSquare(CDC* pDC, POINT* square) { int minY = min(min(square[0].y, square[1].y), min(square[2].y, square[3].y)); int maxY = max(max(square[0].y, square[1].y), max(square[2].y, square[3].y)); int minX = min(min(square[0].x, square[1].x), min(square[2].x, square[3].x)); int maxX = max(max(square[0].x, square[1].x), max(square[2].x, square[3].x)); for (int y = minY; y <= maxY; y++) { for (int x = minX; x <= maxX; x++) { pDC->SetPixel(x, y, RGB(255, 0, 0)); // 红色填充 } } } ``` 通过以上步骤,你可以在MFC应用程序中使用三角形填充算法填充正方形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值