zoukankan      html  css  js  c++  java
  • 矢量数据压缩:道格拉斯普克算

    CSDN上能够找到很多道格拉斯普克算法的代码:其中一个

    参考代码
      1 #include<stdio.h>
      2 #include<math.h>
      3 #include<malloc.h>
      4 #include<string.h>
      5 #define NULL 0
      6 #define LEN sizeof(struct point)
      7 
      8 struct point
      9 {
     10     char ptname[8];
     11     float x;    
     12     float y;
     13     struct point *next;
     14 };
     15 
     16 struct point* creat(void)
     17 {
     18     struct point *head;
     19     struct point *p1,*p2;
     20     int n=0;
     21     p1=p2=(struct point*)malloc(LEN);
     22     scanf("%s",p1->ptname);
     23     head=NULL;
     24     while(strcmp(p1->ptname,"finish")!=0)
     25     {
     26         printf("请输入该点X Y坐标\n");
     27         scanf("%f%f",&p1->x,&p1->y);
     28         n=n+1;
     29         if(n==1) 
     30             head=p1;
     31         else
     32             p2->next=p1;
     33         p2=p1;
     34         p1=(struct point*)malloc(LEN);
     35         printf("请输入下一点点名\n");
     36         scanf("%s",p1->ptname);
     37     }
     38     p2->next=NULL;
     39     return(head);
     40 }
     41 
     42 struct point *getlast(struct point *p)
     43 {
     44     while(p->next!=NULL)
     45         p=p->next;
     46     return p;
     47 }
     48 
     49 float len(float x1,float y1,float x2,float y2,float x3,float y3)
     50 {
     51     float a,b,c,s,h;
     52     a=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
     53     b=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
     54     c=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
     55     s=0.5*(a+b+c);
     56     h=(sqrt(s*(s-a)*(s-b)*(s-c)))*2/c;
     57     return h;
     58 }
     59 
     60 void doglas(struct point *head,struct point *last,float sigma)
     61 {
     62     struct point *hl;/*hl contains the remotest point C*/
     63     struct point *p=head->next;
     64     float h,max=0;
     65     while(p->next!=last)
     66     {
     67         h=len(head->x,head->y,p->x,p->y,last->x,last->y);
     68         if(h>max)
     69         {
     70             max=h;
     71             hl=p;
     72         }
     73         p=p->next;
     74     }
     75     if(max<=sigma)    /*It is not a feature point*/
     76     {
     77         head->next=last;
     78     }
     79     else              /*It is a feature point*/
     80     {
     81         doglas(head,hl,sigma);
     82         doglas(hl,last,sigma);
     83     }
     84 }
     85 
     86 void linkout(struct point *head)
     87 {
     88      struct point *p=head;
     89      printf("点名     X            Y\n");
     90      while(p)
     91      {
     92          printf("%s  %f  %f\n",p->ptname,p->x,p->y);
     93          p=p->next;
     94      }
     95 }
     96 void main()
     97 {
     98     printf("****************道格拉斯普克法******************\n");
     99     printf("################################################\n\n\n");
    100     float sigma;
    101     printf("请输入阈值\n");
    102     scanf("%f",&sigma);
    103     printf("请输入第一点点名,以'finish'结束输入\n");
    104     struct point *head;
    105     head=creat();
    106     printf("\n\n您输入的点为:\n\n");
    107     linkout(head);
    108     doglas(head,getlast(head),sigma);
    109     printf("\n\n经道格拉斯普克法处理后的点为:\n");
    110     while(head!=NULL)
    111     {
    112         printf("%s  ",head->ptname);
    113         head=head->next;
    114     }
    115     printf("\n");
    116 }

    来源:http://download.csdn.net/download/hejuncsnd/2906435

    文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
  • 相关阅读:
    以证书的方式登录ssh
    JSPatch在MAC下的使用
    sqlite3使用备忘
    iOS模拟器录屏转gif神器
    UINavigationController + UIScrollView组合,视图尺寸的设置探秘(三)
    UINavigationController + UIScrollView组合,视图尺寸的设置探秘(二)
    UINavigationController + UIScrollView组合,视图尺寸的设置探秘(一)
    内容可循环重用的ScrollView
    关于Logger
    Git入门操作
  • 原文地址:https://www.cnblogs.com/yhlx125/p/2664123.html
Copyright © 2011-2022 走看看