Неизвестная ошибка, влияющая на алгоритм Грэма для нахождения выпуклой оболочки

Я запрограммировал алгоритм Грэма, но он все еще дает мне неправильные точки для выпуклой оболочки. Мне нужна помощь. Думаю, у меня есть ошибка в моей функции знака, но не знаю, что это.

#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 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;

здесь я перебираю все векторы и пытаюсь определить точки выпуклой оболочки

    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
}

2

Решение

Мой вопрос, почему int f(pair<int, int>, pair<int, int>) принимать pair<int, int> вместо pair<double, double>?

Кроме того, почему это не названо что-то информативное, как compare_blah?

И наконец, почему он не возвращается bool вместо int? Либо работает, конечно, но будет более понятно, что это предназначено просто как функция сравнения, если вы вернете bool, И разъяснение вашей программы людям, которые ее читают, должно стать вашей основной целью. Заставить его сделать то, что он должен, является вторичной целью. В конце концов, он делает то, что должен, только временное положение вещей. В конце концов кто-то захочет сделать что-то еще.

pair<int, int> вещь может быть вашей проблемой прямо здесь. Вы делаете несколько неявных преобразований типов в этой функции между int а также double и потерять информацию влево и вправо. Я сомневаюсь, что это то, что вы хотели.

Если бы вы использовали typedef для вашего pair лайк typedef pair<double, double> point2d_t а затем использовать point2d_t везде вы можете защитить себя от подобных ошибок и сделать свою программу более понятной в сделке.

Я не достаточно знаком с алгоритмом Грэма, чтобы оценить ваше использование abs Внутри fХотя вполне возможно, что человек, который это прокомментировал, прав.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]