home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / graphics / 9212 < prev    next >
Encoding:
Text File  |  1992-08-27  |  3.0 KB  |  124 lines

  1. Newsgroups: comp.graphics
  2. Path: sparky!uunet!newsgate.watson.ibm.com!yktnews!admin!curt
  3. From: curt@watson.ibm.com (Curt McDowell)
  4. Subject: Re: Area of polygons
  5. Sender: news@watson.ibm.com (NNTP News Poster)
  6. Message-ID: <1992Aug27.180851.5035@watson.ibm.com>
  7. Date: Thu, 27 Aug 1992 18:08:51 GMT
  8. Lines: 109
  9. Disclaimer: This posting represents the poster's views, not necessarily those of IBM
  10. References:  <1464@igd.fhg.de>
  11. Nntp-Posting-Host: gorby.watson.ibm.com
  12. Organization: IBM T.J. Watson Research Center
  13. Keywords: polygon,triangle,constraints
  14.  
  15. In article <1464@igd.fhg.de>, willm@igd.fhg.de (Matt Will) writes:
  16. > I don't know if this is the right place to ask, but I'll give it a try.
  17. > I am currently trying to find constraints for planar (2D) polygons, and in
  18. > particular, I have troubles finding a constraint (=a formula) to calculate
  19. > the area of a polygon.
  20. > I know that it is possible to subdivide a polygon into triangles, but I haven't
  21. > found a general formula to find out which diagonals to use for this. With 
  22. > convex polygons, things are easy, but I got stuck as far as concave polygons
  23. > are concerned.
  24. > Please e-mail me, since I am not reading this list. You can reach me at the
  25. > address listed below.
  26. > Thank you for your help,
  27. > Matt Will <willm@igd.fhg.de>
  28.  
  29. Here's an area formula that so neat I thought I'd post it in addition
  30. to sending it to Matt.  It probably extends to 3D as well, but right now
  31. I don't have time to test that theory.
  32.  
  33. /*
  34.  * polyarea
  35.  *
  36.  *   Computes the area of an arbitrary n-point polygon using the following
  37.  *   amazingly beautiful formula from high school geometry:
  38.  *
  39.  *            | x(0) y(0) |       | x(1) y(1) |             | x(n-1) y(n-1) |
  40.  *   2A = det |           | + det |           | + ... + det |               |
  41.  *            | x(1) y(1) |       | x(2) y(2) |             | x(0)   y(0)   |
  42.  *
  43.  *   The area is positive if the points are in counter-clockwise order,
  44.  *   negative if they are clockwise.
  45.  *
  46.  *   Curt McDowell, IBM 08-27-92
  47.  */
  48.  
  49. double polyarea(x, y, n)
  50.     double           *x, *y;
  51.     int        n;
  52. {
  53.     double        a;
  54.     int        i;
  55.  
  56.     a = x[n - 1] * y[0] - x[0] * y[n - 1];
  57.  
  58.     for (i = 0; i < n - 1; i++)
  59.         a += x[i] * y[i + 1] - x[i + 1] * y[i];
  60.  
  61.     return (a / 2.0);
  62. }
  63.  
  64. /*
  65.  * Test main program for polyarea
  66.  */
  67.  
  68. #include <stdio.h>
  69. #include <math.h>
  70.  
  71. extern    void           *malloc();
  72.  
  73. main(argc, argv)
  74.     int        argc;
  75.     char           *argv[];
  76. {
  77.     int        n, i;
  78.     double           *x, *y;
  79.  
  80.     if (argc != 2) {
  81.         fprintf(stderr,
  82.             "Usage: polyarea npoints\n");
  83.         exit(1);
  84.     }
  85.  
  86.     n    = atoi(argv[1]);
  87.  
  88.     /*
  89.      * Input array of n points
  90.      */
  91.  
  92.     printf("Please enter %d points.\n", n);
  93.  
  94.     x    = malloc(n * sizeof (*x));
  95.     y    = malloc(n * sizeof (*y));
  96.  
  97.     for (i = 0; i < n; i++) {
  98.         char    buf[256];
  99.  
  100.         printf("p%d.x? ", i);
  101.         fflush(stdout);
  102.         if (gets(buf) == 0)
  103.             exit(0);
  104.         x[i]    = atof(buf);
  105.  
  106.         printf("p%d.y? ", i);
  107.         fflush(stdout);
  108.         if (gets(buf) == 0)
  109.             exit(0);
  110.         y[i]    = atof(buf);
  111.     }
  112.  
  113.     printf("The area of the polygon is %f units.\n", polyarea(x, y, n));
  114.  
  115.     exit(0);
  116. }
  117.  
  118. --
  119. Curt McDowell
  120. IBM T. J. Watson Research Center
  121.