gpt4 book ai didi

c++ - 影响格雷厄姆寻找凸包算法的未知错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:53 26 4
gpt4 key购买 nike

我已经编写了 Graham 算法,但它仍然给我错误的凸包点。我需要帮助。认为我的符号函数中有一个错误,但不知道它是什么。

#include <cstdio>
#include <algorithm>
#include <math.h>
#define pb push_back
#define mp make_pair
#include <vector>

using namespace std;

vector <pair<double, double> > st;
pair<double, double> p[1000];
double x, y;

int f(pair <double,double> a, pair<double, double> b)
{
double x1 = x - a.first, x2 = x - b.first;
double y1 = y - a.second, y2 = y - b.second;
return ((x1*y2-y1*x2) < 0);
}

void setlast(double &x1, double &y1, double &x2, double &y2)
{
x2 = st[st.size()-1].first;
y2 = st[st.size()-1].second;
x1 = st[st.size()-2].first;
y1 = st[st.size()-2].second;
}

符号改进了我使用 double

    double sign(double x1,double y1, double x2,double y2, double y3,double x3)
{
double xx1 = x2 - x1, xx2 = x3 - x1;
double yy1 = y2 - y1, yy2 = y3 - y1;
return (xx1*yy2-yy1*xx2);
}

int main()
{
int n;
x = 0x3f3f3f3f;
y = 0x3f3f3f3f;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%lf %lf", &p[i].first, &p[i].second);
if(p[i].first <= x && p[i].second <= y)
x = p[i].first,
y = p[i].second;
}
sort(p, p + n, f);
p[n].first = x;
p[n].second = y;
st.pb(mp(p[0].first, p[0].second));
st.pb(mp(p[1].first, p[1].second));
double x1, x2, x3, y1, y2, y3;

这里我遍历所有 vector 并尝试确定凸包的点

    for(int i = 2; i < n; i++)
{
x3 = p[i].first;
y3 = p[i].second;
setlast(x1,y1,x2,y2);
while(1)
if(sign(x1,y1,x2,y2,x3,y3) < 0)
{
st.pb(mp(x3, y3));
break;
}
else
st.pop_back(),
setlast(x1, y1, x2, y2);
}

这里打印凸包

for(int i = 0; i < st.size(); i++)
printf("%lf %lf\n", st[i].first, st[i].second);
return 0
}

最佳答案

我的问题,为什么int f(pair<int, int>, pair<int, int>)pair<int, int>而不是 pair<double, double>

此外,为什么不将其命名为像 compare_blah 这样的信息性名称? ?

最后,为什么不返回 bool而不是 int ?当然,这两种方法都有效,但如果您返回 bool,这将更清楚地表明这只是一个比较函数。 .让阅读它的人清楚地了解您的程序应该是您的主要目标。让它做它应该做的事是次要目标。毕竟,它做它应该做的只是暂时的事态。最终有人会希望它做其他事情。

pair<int, int>事情可能是你的问题。您在 int 之间的函数中进行了几次隐式类型转换。和 double并左右丢失信息。我怀疑那不是你的意图。

如果您要为您的 pair 使用 typedef喜欢typedef pair<double, double> point2d_t然后使用 point2d_t在任何地方,您都可以保护自己免受此类错误的影响,并使您的程序在讨价还价中更加清晰。

我对格雷厄姆算法不够熟悉,无法评估您对 abs 的使用f 内部,尽管对此发表评论的人很可能是正确的。

关于c++ - 影响格雷厄姆寻找凸包算法的未知错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13222621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com