Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查4个点是否为正方形_C++_Algorithm - Fatal编程技术网

C++ 检查4个点是否为正方形

C++ 检查4个点是否为正方形,c++,algorithm,C++,Algorithm,下面是本文的解决方案。似乎使用点(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

下面是本文的解决方案。似乎使用点(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;
}
#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;
}
#包括
#包括
#包括
使用名称空间std;
类解决方案{
公众:
布尔有效平方(向量与p1、向量与p2、向量与p3、向量与p4){
双x1=p1[0],x2=p2[0],x3=p3[0],x4=p4[0];
双y1=p1[1],y2=p2[1],y3=p3[1],y4=p4[1];
双cx=(x1+x2+x3+x4)/4;
双Y=(y1+y2+y3+y4)/4;
双a1=(cx-x1),a2=(cy-y1);
双b1=(cx-x2),b2=(cy-y2);
双c1=(cx-x3),c2=(cy-y3);
双d1=(cx-x4),d2=(cy-y4);
双dd1=a1*a1+a2*a2;
双dd2=b1*b1+b2*b2;
双dd3=c1*c1+c2*c2;
双dd4=d1*d1+d2*d2;
双ε=0.00001;
返回abs(dd1-dd2)你有
y3=p3[2]
——这应该是
y3=p3[1]
?这在c#中很容易找到,顺便说一句)

p3.at(2)
而不是
[]
。我用point类而不是长度为2的vector编写的bad-nice catchor,你能看到我更新的代码吗?它似乎仍然不起作用correctly@Wolfy更新后的代码似乎代表一个矩形,而不是正方形。
dd1==dd2
与浮点有关。如果要比较浮点值是否相等,几乎总是在做一些事情错误。@Justin是对的,任何基于浮点数的东西都会给你带来麻烦,而且无论如何都不会给你一个准确的答案。你的解决方案在运算方面也太过复杂了;如果
(0,0)
(2,0)
是正方形的一部分,那么其他两点必须是
(1,1)&(1,-1)
(0,2)&(2,2)
(0,-2)和(2,-2)
@Justin你建议我怎么办?@Wolfy使用abs(a-b)<1E-6对浮点a和b搜索SO或其他“浮点相等”资源似乎仍然不起作用。