home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / MACRO / EDITC.M < prev    next >
Text File  |  1996-08-01  |  7KB  |  312 lines

  1. function private inrange(convver, concave, vers, p0, p1)
  2. {
  3.     var vp, v1, v2;
  4.     if (p0 == 0) {
  5.         v1 = convver[vers-1] - convver[0];
  6.         v2 = convver[1]      - convver[0];
  7.     } else if (p0 == vers-1) {
  8.         v1 = convver[p0-1] - convver[p0];
  9.         v2 = convver[0]    - convver[p0];
  10.     } else {
  11.         v1 = convver[p0-1] - convver[p0];
  12.         v2 = convver[p0+1] - convver[p0];
  13.     }
  14.     vp = convver[p1] - convver[p0];
  15.     if (concave[p0]) {
  16.         if (vz(vp*v1) >= 0 | vz(v2*vp) >= 0) {
  17.             return TRUE;
  18.         }
  19.     } else {
  20.         if (vz(vp*v1) >= 0 & vz(v2*vp) >= 0) {
  21.             return TRUE;
  22.         }
  23.     }
  24.     return FALSE;
  25.  
  26. }
  27.  
  28. function private iscross(convver, vers, p0, p1)
  29. {
  30.     var i;
  31.     var site3, site4, sa, sb;
  32.     var v1, v2, v3, v4;
  33.     var center;
  34. //var v3_;
  35. //DrawLine(PolyGetVertex(p0), PolyGetVertex(p1));
  36.  
  37.     if (p1 == p0 | p1 == p0+1 | p1 == p0-1
  38.      | (p0 == 0 & p1 == vers-1) | (p1 == 0 & p0 == vers-1)) {
  39. //DrawLine(PolyGetVertex(p0), PolyGetVertex(p1));
  40.         return TRUE;
  41.     }
  42.     v1 = convver[p0];
  43.     v2 = convver[p1];
  44.     v4 = convver[vers-1];
  45.     site4 = vz((v4-v1) * (v2 - v1));
  46.     site3 = site4;
  47. //v3_ = PolyGetVertex(vers-1);
  48.     for (i = 0; i < vers; i++) {
  49.         v3 = v4;
  50.         v4 = convver[i];
  51. //DrawLine(v3_, PolyGetVertex(i));
  52.         if (site4 != 0) {
  53.             site3 = site4;
  54.         }
  55.         site4 = vz((v4-v1) * (v2 - v1));
  56.         sa = vz((v1-v3)*(v4-v3));
  57.         sb = vz((v2-v3)*(v4-v3));
  58.         if ((site3 < 0 & site4 > 0) | (site3 > 0 & site4 < 0)) {
  59.             if ((sa < 0 & sb > 0) | (sa > 0 & sb < 0)) {
  60. //print("outrange site3=", site3, "site4=", site4, "sa=", sa, "sb=", sb, "\n");
  61. //WaitEvent();
  62. //DrawLine(v3_, PolyGetVertex(i));
  63. //DrawLine(PolyGetVertex(p0), PolyGetVertex(p1));
  64.                 return TRUE;
  65.             }
  66.         }
  67. //DrawLine(v3_, PolyGetVertex(i));
  68. //v3_ = PolyGetVertex(i);
  69.     }
  70. //print("inrange\n");
  71. //WaitEvent();
  72. //DrawLine(PolyGetVertex(p0), PolyGetVertex(p1));
  73.     return FALSE;
  74. }
  75.  
  76. function ConvexConvertMain()
  77. {
  78.     var convver[MAXVERTEX];
  79.     var concave[MAXVERTEX];
  80.     var v1, v2;
  81.     var vers, i;
  82.     var nvec, vec0, vec1;
  83.     var convmat;
  84.     var convex = TRUE;
  85.     var minpos, minx, miny, x, y;
  86.     var begin, end;
  87.     var cvec;
  88.     vers = PolyVertexs();
  89.     if (vers < 4) {
  90.         return FALSE;
  91.     }
  92.     PolySetVertex(PolyGetVertex(0),vers);
  93.     PolySetVertex(PolyGetVertex(1),vers+1);
  94.     v1 = unit(Position(PolyGetVertex(0)-PolyGetVertex(vers-1)));
  95.     v2 = unit(Position(PolyGetVertex(1)-PolyGetVertex(0)));
  96.     vec0 = v1 * v2;
  97.     nvec = vec0;
  98.     for (i = 1; i < vers; i++) {
  99.         v1 = v2;
  100.         v2 = unit(Position(PolyGetVertex(i+1)-PolyGetVertex(i)));
  101.         vec1 = v1 * v2;
  102.         if (vec0 . vec1 <= 0.0001) {
  103.             nvec = nvec - vec1;
  104.             convex = FALSE;
  105.         } else {
  106.             nvec = nvec + vec1;
  107.         }
  108.     }
  109.     if (convex | (abs(nvec) < 0.0001)) {
  110.         return FALSE;
  111.     }
  112.     convmat = CalRotMatrix(nvec, vector(0,0,1));
  113.  
  114.     minpos = -1;
  115.     minx = 0;
  116.     miny = 0;
  117.     ViewCursor( OFF );
  118.     DrawCurrent(TRUE);
  119.     ViewCursor( ON );
  120.     for (i = 0; i < vers; i++) {
  121.         convver[i] = Position(PolyGetVertex(i) * convmat);
  122.         x = vx(convver[i]);
  123.         y = vy(convver[i]);
  124.         if (minpos < 0 | y < miny | (y == miny & x < minx)) {
  125.             minpos = i;
  126.             minx = x;
  127.             miny = y;
  128.         }
  129.     }
  130.     if (minpos == 0) {
  131.         v1 = unit(convver[0]-convver[vers-1]);
  132.         v2 = unit(convver[1]-convver[0]);
  133.     } else if (minpos == vers-1) {
  134.         v1 = unit(convver[minpos]-convver[minpos-1]);
  135.         v2 = unit(convver[0]-convver[minpos]);
  136.     } else {
  137.         v1 = unit(convver[minpos]-convver[minpos-1]);
  138.         v2 = unit(convver[minpos+1]-convver[minpos]);
  139.     }
  140.     if (vz(v1 * v2) < 0) {
  141. //        convmat = rot(convmat, AXISY, 180);
  142.         convmat = scale(convmat, 1,1,-1);
  143.     }
  144.     PolyShiftVertex(minpos);
  145.     do {
  146.         for (i = 0; i < vers; i++) {
  147.             convver[i] = Position(PolyGetVertex(i) * convmat);
  148.         }
  149.         convver[vers] = convver[0];
  150.         convver[vers+1] = convver[1];
  151.         v2 = unit(convver[0]-convver[vers-1]);
  152.  
  153.         minpos = -1;
  154.         minx = 2;
  155.         for (i = 0; i < vers; i++) {
  156.             v1 = v2;
  157.             v2 = unit(convver[i+1]-convver[i]);
  158. //DrawLine(Vertex(0,0,0), PolyGetVertex(i));
  159. //print("\nconcave=", vz(v1 * v2));
  160. //WaitEvent();
  161. //DrawLine(Vertex(0,0,0), PolyGetVertex(i));
  162.             if (vz(v1 * v2) <= 0.0001) {
  163.                 concave[i] = TRUE;
  164.                 x = v1 . v2;
  165.                 if (x < minx) {
  166.                     minpos = i;
  167.                     minx = x;
  168.                 }
  169.             } else {
  170.                 concave[i] = FALSE;
  171.             }
  172.         }
  173.         if (minpos <= 0) {
  174.             break;
  175.         }
  176.         if (minpos == 0) {
  177.             v1 = unit(convver[0]-convver[vers-1]);
  178.             v2 = unit(convver[0]-convver[1]);
  179.         } else if (minpos == vers-1) {
  180.             v1 = unit(convver[minpos]-convver[minpos-1]);
  181.             v2 = unit(convver[minpos]-convver[0]);
  182.         } else {
  183.             v1 = unit(convver[minpos]-convver[minpos-1]);
  184.             v2 = unit(convver[minpos]-convver[minpos+1]);
  185.         }
  186.         begin = minpos;
  187.         if (abs(v1+v2) < 0.0001) {
  188.             cvec = getvector(vec(UNIT_MATRIX, v1, vector(0,0,1)), 1);
  189.         } else {
  190.             cvec = unit(v1 + v2);
  191.         }
  192.         minpos = -1;
  193.         minx = -1;
  194.         for (i = 0; i < vers; i++) {
  195.             if (inrange(convver, concave, vers, begin, i)
  196.               & inrange(convver, concave, vers, i, begin)) {
  197.                 if (!iscross(convver, vers, begin, i)) {
  198.                     v1 = unit(convver[i]-convver[begin]);
  199.                     x = cvec . v1;
  200. //print("\ncos=", x);
  201. //DrawLine(PolyGetVertex(begin), PolyGetVertex(i));
  202. //WaitEvent();
  203. //DrawLine(PolyGetVertex(begin), PolyGetVertex(i));
  204.                     if (x > minx) {
  205.                         minpos = i;
  206.                         minx = x;
  207.                     }
  208.                 }
  209.             }
  210.         }
  211.         if (minpos < 0) {
  212.             break;
  213.         }
  214.         if (minpos < begin) {
  215.             end = begin;
  216.             begin = minpos;
  217.         } else {
  218.             end = minpos;
  219.         }
  220.         if (end - begin + 1 > (vers-(end-begin)+1)) {
  221.             PolyShiftVertex(end);
  222.             PolyVertexs(vers-(end-begin)+1);
  223.             ViewCursor( OFF );
  224.             DrawCurrent(FALSE);
  225.             PolyAppend(TRUE);
  226.  
  227.             PolyVertexs(vers);
  228.             PolyShiftVertex(vers - (end-begin));
  229.             PolyVertexs(end-begin+1);
  230.             DrawCurrent(TRUE);
  231.             ViewCursor( ON );
  232.             PolySave();
  233.             vers = end - begin + 1;
  234.         } else {
  235.             PolyShiftVertex(begin);
  236.             PolyVertexs(end-begin+1);
  237.             ViewCursor( OFF );
  238.             DrawCurrent(FALSE);
  239.             PolyAppend(TRUE);
  240.  
  241.             PolyVertexs(vers);
  242.             PolyShiftVertex(end-begin);
  243.             PolyVertexs(vers-(end-begin)+1);
  244.             PolySave();
  245.             DrawCurrent(TRUE);
  246.             ViewCursor( ON );
  247.             vers = vers - (end - begin) + 1;
  248.         }
  249.     } while (TRUE);
  250.     ViewCursor( OFF );
  251.     DrawCurrent(FALSE);
  252.     ViewCursor( ON );
  253.     return TRUE;
  254. }
  255.  
  256. function ConvexConvert()
  257. {
  258.     var osel;
  259.     osel = Select();
  260.     SelectAll(FALSE);
  261.     Update(OVERWRITE);
  262.     Select(osel);
  263.     while (PolyLoad()) {
  264.         ConvexConvertMain();
  265.     }
  266. }
  267.  
  268. function TriangleConvert()
  269. {
  270.     var    i, polys, vers;
  271.  
  272.     polys = SelectPolygons();
  273.     PolyLoadInit();
  274.     for (i = 0; i < polys; i++)
  275.     {
  276.         PolyLoad();
  277.         vers = PolyVertexs();
  278.         while( vers > 3 )
  279.         {
  280.             PolyVertexs( 3 );
  281.             PolyAppend( TRUE );
  282.             PolyVertexs( vers );
  283.             PolyDelVertex( 1 );
  284.             vers--;
  285.         }
  286.         PolySave();
  287.     }
  288. }
  289.  
  290. function QuadConvert()
  291. {
  292.     var    i, polys, vers;
  293.  
  294.     polys = SelectPolygons();
  295.     PolyLoadInit();
  296.     for (i = 0; i < polys; i++)
  297.     {
  298.         PolyLoad();
  299.         vers = PolyVertexs();
  300.         while( vers > 4 )
  301.         {
  302.             PolyVertexs( 4 );
  303.             PolyAppend( TRUE );
  304.             PolyVertexs( vers );
  305.             PolyDelVertex( 1 );
  306.             PolyDelVertex( 1 );
  307.             vers -= 2;
  308.         }
  309.         PolySave();
  310.     }
  311. }
  312.