1. 程式人生 > >[GIS演算法] 求單調鏈 - C語言實現

[GIS演算法] 求單調鏈 - C語言實現

單調鏈:一個點序列在某個直線上投影如果是有序的,則認為此點序相對與該直線是一個單調鏈

【問題】找到任意點序列相對於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; }