[GIS演算法] 求單調鏈 - C語言實現
阿新 • • 發佈:2018-11-20
單調鏈:一個點序列在某個直線上投影如果是有序的,則認為此點序相對與該直線是一個單調鏈
【問題】找到任意點序列相對於Y軸的所有單調鏈
#include<stdio.h>
typedef struct _POINT{
double x;
double y;
}POINT;
// 求單調鏈
int GetLink(POINT *points, int n) { //兩個兩個判斷
int i;
int cnt=0;
int start;
int up=0; //不增不減
start = 0; //起始點
for (i=1; i<n; i++) {
if ( points[i-1].y < points[i].y) { //後一個y > 前一個y --> up
if (up==-1) { //原來是-1,那就是轉折點
cnt++;
printf("%d->%d down\n", start, i-1);
start=i-1;
}
up = 1;
} else if (points[i-1].y > points[i].y ) {
if (up==1) {
cnt++;
printf("%d->%d up\n", start, i-1);
start= i-1;
}
up = -1;
}
if (i==n-1) { //△ 最後一個點(很容易漏掉)
printf("%d->%d %s\n", start, i, up==1?"up":"down");
cnt++;
}
}
return cnt;
}
int GetLink2(POINT *points, int n) { //三個三個判斷
int cnt=0;
int i,start;
if (n==2) { //只有兩個點
printf("%d->%d %s\n", 0, 1, points[0].y>points[1].y?"down" :"up" );
cnt++;
} else {
start = 0;
for (i=1; i<n-1; i++) {
//左邊右邊方向不一樣,即為轉折
if ( (points[i].y-points[i-1].y)*(points[i+1].y-points[i].y)<0 ) {
printf("%d->%d %s\n", start, i, points[i].y>points[i-1].y?"up":"down");
start = i;
cnt++;
}
}
//△ 最後一個點(很容易漏掉)
printf("%d->%d %s\n", start, n-1, points[n-1].y>points[n-2].y?"up":"down");
cnt++;
}
return cnt;
}
/*
12
120.49357 44.883323
117.9872 42.350326
115.545833 39.79259
113.508521 38.274465
110.551524 37.151942
105.640902 39.126654
106.005868 38.125725
107.545122 34.951701
110.411982 31.777678
113.019257 28.194103
116.535467 26.871059
117.470083 23.943192
*/
int main() {
int n;
POINT points[100];
int i;
scanf("%d", &n);
for (i=0; i<n; i++)
scanf("%lf%lf", &points[i].x, &points[i].y);
i = GetLink(points, n);
printf("共找到%d\n", i);
i = GetLink2(points, n);
printf("共找到%d\n", i);
return 0;
}