【问题标题】:Checking if 4 points make a square [closed]检查4个点是否构成正方形[关闭]
【发布时间】:2017-12-22 21:53:41
【问题描述】:

根据这篇文章here 的解决方案。似乎使用点 (1,0)、(-1,0)、(0,1) 和 (0,-1) 时,当它应该返回这些点确实形成一个正方形时,解决方案会失败。

也许我的实现有问题。这是我的代码:

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

    class Solution {
public:
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {

            double x1 = p1[0], x2 = p2[0], x3 = p3[0], x4 = p4[0];
            double y1 = p1[1], y2 = p2[1] , y3 = p3[1], y4 = p4[1];

            double cx = (x1+x2+x3+x4)/4;
            double cy = (y1+y2+y3+y4)/4;

            double a1 = (cx - x1), a2 = (cy - y1);
            double b1 = (cx - x2), b2 = (cy - y2);
            double c1 = (cx - x3), c2 = (cy - y3);
            double d1 = (cx - x4), d2 = (cy - y4);

            double dd1 = a1*a1 + a2*a2;
            double dd2 = b1*b1 + b2*b2;
            double dd3 = c1*c1 + c2*c2;
            double dd4 = d1*d1 + d2*d2;
            double epsilon = 0.00001;

            return abs(dd1 - dd2) < epsilon && abs(dd1 - dd3) < epsilon && abs(dd1 - dd4) < epsilon;
    }
};



int main() {

    vector<int> p1, p2, p3, p4;
    p1.push_back(1);
    p1.push_back(0);
    p2.push_back(-1);
    p2.push_back(0);
    p3.push_back(0);
    p3.push_back(1);
    p4.push_back(0);
    p4.push_back(-1);

    Solution m;
    bool x;
    x = m.validSquare(p1,p2,p3,p4);
    if(x == 1) {
        cout << "Points form a square" << endl;
    }
    else {
        cout << "Points do not form a square" << endl;
    }

    return 0;
}

链接中的解决方案肯定是正确的,但由于某些原因,这四点我没有得到准确的回报。如果有人有任何建议,请告诉我。

更新:

遵循用户的建议。我改变了几行。使用点 (0,0)、(5,0)、(5,4) 和 (0,4) 不应返回这些点可以构成正方形。不幸的是,我更新的代码仍然返回这些点是一个正方形,所以我不确定问题是什么。

这是我的代码:

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

class Solution {
public:
    bool isFloatEqual(double a, double b) {
        double epsilon = 0.001;
        return abs(a - b) < epsilon;
    }
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {

            double x1 = p1[0], x2 = p2[0], x3 = p3[0], x4 = p4[0];
            double y1 = p1[1], y2 = p2[1] , y3 = p3[1], y4 = p4[1];

            double cx = (x1+x2+x3+x4)/4;
            double cy = (y1+y2+y3+y4)/4;

            double a1 = (cx - x1), a2 = (cy - y1);
            double b1 = (cx - x2), b2 = (cy - y2);
            double c1 = (cx - x3), c2 = (cy - y3);
            double d1 = (cx - x4), d2 = (cy - y4);

            double dd1 = a1*a1 + a2*a2;
            double dd2 = b1*b1 + b2*b2;
            double dd3 = c1*c1 + c2*c2;
            double dd4 = d1*d1 + d2*d2;

            return isFloatEqual(dd1,dd2) && isFloatEqual(dd1, dd3) &&isFloatEqual(dd1, dd4);

    }
};



int main() {

    vector<int> p1, p2, p3, p4;
    p1.push_back(0);
    p1.push_back(0);
    p2.push_back(5);
    p2.push_back(0);
    p3.push_back(5);
    p3.push_back(4);
    p4.push_back(0);
    p4.push_back(4);

    Solution m;
    bool x;
    x = m.validSquare(p1,p2,p3,p4);
    if(x == 1) {
        cout << "Points form a square" << endl;
    }
    else {
        cout << "Points do not form a square" << endl;
    }

    return 0;
}

【问题讨论】:

  • dd1 == dd2 与浮点有关。如果你在比较浮点数是否相等,你几乎总是做错事。
  • @Justin 是对的,任何基于浮点数的东西都会给你带来麻烦,而且无论如何都不会给你一个确切的答案。您的解决方案在操作方面也过于矫枉过正;如果(0,0)(2,0) 是正方形的一部分,那么其他两个点必须是(1,1) &amp; (1,-1)(0,2) &amp; (2,2)(0,-2) &amp; (2, -2)
  • @Justin 你建议我做什么?
  • @Wolfy 在 SO 或其他资源中搜索“浮点相等”
  • 对浮点 a 和 b 使用 abs(a - b)

标签: c++ algorithm


【解决方案1】:

你有y3 = p3[2]——应该是y3 = p3[1]吗?这在 c# 中很容易找到,顺便说一句;)

【讨论】:

  • 使用p3.at(2) 而不是[] 更容易找到。
  • 我的糟糕收获
  • 或者用点类代替长度为2的向量
  • 你能看到我更新的代码吗,似乎仍然无法正常工作
  • @Wolfy 您更新后的代码似乎代表一个矩形,而不是一个正方形。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2012-08-22
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多