Graham의 알고리즘을 프로그래밍했지만 여전히 convex hull에 대한 잘못된 점을 제공합니다. 도움이 필요해. 내 사인 기능에 버그가 있다고 생각하지만 그것이 무엇인지 모르겠다.Graham의 convex hull을 찾는 알고리즘에 영향을주는 알 수없는 버그
#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;
}
기호 내가 모든 벡터를 반복하고 볼록 선체
for(int i = 0; i < st.size(); i++)
printf("%lf %lf\n", st[i].first, st[i].second);
return 0
}
에게 인쇄 볼록 선체 여기
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);
}
의 포인트를 결정하려고
여기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;
두 배로 사용 개선
'int f (pair ...)'에서 잘못된 정렬 순서를 생성하는'abs'를 사용하면 안됩니다. –
내 질문에,'int f (쌍, 쌍 )는'pair '대신에'pair '을 취하는가? 또한, 왜 그것은'compare_blah'와 같은 정보라는 이름이 아닙니까? 마지막으로'int '대신'bool'을 반환하지 않는 이유는 무엇입니까? 'pair '이 문제가 될 수 있습니다. 이 함수에서'int'와'double' 사이에 몇 가지 암시 적 타입 변환을하고 있으며 정보를 왼쪽과 오른쪽으로 잃어 버리고 있습니다. 나는 그것이 당신이 의도 한 바가 의심 스럽습니다. –
Omnifarious
Ohh .. Yeess .. 내 서명 함수를 검사 할 때 오류가 발견되었지만 f()에서 업데이트하는 것을 잊어 버린 것 같습니다. 나는 그것을 지금 시도 할 것이다. 감사! – Tahir