windows-nt/Source/XPSP1/NT/shell/osshell/accesory/eudcedit/makepoly.cpp
2020-09-26 16:20:57 +08:00

278 lines
5.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Copyright (c) 1997-1999 Microsoft Corporation.
//
#include "stdafx.h"
#include "vdata.h"
#define UNDERFP 0
#define NMAX 129
int MkPoly( int inlst, int outLst);
static int DDACon(struct vecdata *s,struct vecdata *cp,struct vecdata *e,int lstHdl);
static int fsqrt(int n);
/***********************************************************************
* Make Poly line
*/
/* */ int
/* */ MkPoly(
/* */ int inLst,
/* */ int outLst)
/*
* returns : 0, -1
***********************************************************************/
{
struct VHEAD *vhd;
int pcnt,
sts;
struct VDATA *vp;
if ( (sts = VDGetHead( inLst, &vhd))!=0)
goto RET;
VDNew( outLst);
while ( vhd->next != NIL) {
vp = vhd->headp;
pcnt = vhd->nPoints;
while ( pcnt >0) {
if ( vp->next->vd.atr &1) {
sts = DDACon( &vp->vd, &vp->next->vd,
&vp->next->next->vd, outLst);
if ( sts)
goto RET;
vp = vp->next;
pcnt--;
if ( pcnt>0) {
vp = vp->next;
pcnt--;
}
}
else {
if ( (sts = VDSetData( outLst, &vp->vd))<0)
goto RET;
vp = vp->next;
pcnt--;
}
}
vhd = vhd->next;
if ( (sts = VDClose( outLst))<0)
goto RET;
}
RET:
return( sts);
}
static int lowsqr[NMAX] = {
1, 2, 2, 3, 3,
4, 4, 4, 4, 5,
5, 5, 5, 6, 6,
6, 6, 6, 6, 7,
7, 7, 7, 7, 7,
8, 8, 8, 8, 8,
8, 8, 8, 9, 9,
9, 9, 9, 9, 9,
9, 10, 10, 10, 10,
10, 10, 10, 10, 10,
10, 11, 11, 11, 11,
11, 11, 11, 11, 11,
11, 12, 12, 12, 12,
12, 12, 12, 12, 12,
12, 12, 12, 13, 13,
13, 13, 13, 13, 13,
13, 13, 13, 13, 13,
14, 14, 14, 14, 14,
14, 14, 14, 14, 14,
14, 14, 14, 14, 15,
15, 15, 15, 15, 15,
15, 15, 15, 15, 15,
15, 15, 15, 16, 16,
16, 16, 16, 16, 16,
16, 16, 16, 16, 16,
16, 16, 16, 16,
};
static int sqrtbl[NMAX] = {
1, 4, 9, 16, 25,
36, 49, 64, 81, 100,
121, 144, 169, 196, 225,
256, 289, 324, 361, 400,
441, 484, 529, 576, 625,
676, 729, 784, 841, 900,
961, 1024, 1089, 1156, 1225,
1296, 1369, 1444, 1521, 1600,
1681, 1764, 1849, 1936, 2025,
2116, 2209, 2304, 2401, 2500,
2601, 2704, 2809, 2916, 3025,
3136, 3249, 3364, 3481, 3600,
3721, 3844, 3969, 4096, 4225,
4356, 4489, 4624, 4761, 4900,
5041, 5181, 5329, 5476, 5625,
5776, 5929, 6084, 6241, 6400,
6561, 6724, 6889, 7056, 7225,
7396, 7569, 7744, 7921, 8100,
8281, 8464, 8649, 8836, 9025,
9216, 9409, 9604, 9801, 10000,
10201, 10404, 10609, 10816, 11025,
11236, 11449, 11664, 11881, 12100,
12321, 12544, 12769, 12996, 13225,
13456, 13689, 13924, 14161, 14400,
14641, 14884, 15129, 15376, 15625,
15876, 16129, 16384, 16641
};
/************************************************************
* DDA Poly line generate
*/
/* */ static int
/* */ DDACon(
/* */ struct vecdata *s,
/* */ struct vecdata *cp,
/* */ struct vecdata *e,
/* */ int lstHdl)
/*
* returns : 0, -1
************************************************************/
{
int n2xmax, n2ymax, n2max;
int i, n;
long f1x, /* for f1<66>@ */
fx, /* for F(i) */
px, /* for G(i) */
g1x, g2x;
long f1y, /* for f1<66>@ */
fy, /* for F(i) */
py, /* for G(i) */
g1y, g2y;
int sts, num;
long relx, rely; /* <20><><EFBFBD>΍<EFBFBD><CE8D>W */
int n2, n2hlf;
struct vecdata pntdata;
/* Set Start Point */
if ( (sts= VDSetData( lstHdl, s))<0)
goto RET;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> N<><4E><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD> */
n2xmax = (e->x - cp->x) - ( cp->x - s->x);
if ( n2xmax < 0) n2xmax = -n2xmax;
else if ( n2xmax == 0 && cp->x==s->x)
goto TERM_SET;
n2ymax = (e->y - cp->y) - ( cp->y - s->y);
if ( n2ymax < 0) n2ymax = -n2ymax;
else if ( n2ymax == 0 && cp->y==s->y)
goto TERM_SET;
if ( n2xmax > n2ymax) n2max = (n2xmax*2) >> UNDERFP;
else n2max = (n2ymax*2) >> UNDERFP;
n = fsqrt( n2max);
/* <20><><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>̍<EFBFBD><CC8D>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD> */
if ( n > 1) {
n2 = n*n;
n2hlf = (n*n)/2; /* Expect Optimize */
px = (long)s->x*n2;
py = (long)s->y*n2;
g2x = (e->x - cp->x) - (cp->x - s->x);
g2y = (e->y - cp->y) - (cp->y - s->y);
g1x = (long)n*(cp->x - s->x) *2;
g1y = (long)n*(cp->y - s->y) *2;
f1x = g2x*2;
f1y = g2y*2;
fx = g1x + g2x;
fy = g1y + g2y;
px += fx;
py += fy;
/* <20>ŏ<EFBFBD><C58F>̓_<CC93><5F><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD> : <20>n<EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD>̑<EFBFBD><CC91>΍<EFBFBD><CE8D>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD><5A><EFBFBD><EFBFBD> */
relx = fx;
rely = fy;
if (relx >= 0) relx += n2hlf;
else relx -= n2hlf;
if (rely >= 0) rely += n2hlf;
else rely -= n2hlf;
pntdata.x = (int)(relx / n2 + s->x);
pntdata.y = (int)(rely / n2 + s->y);
pntdata.atr = 0;
if ( (sts= VDSetData( lstHdl, &pntdata ))<0)
goto RET;
if (n > 2) {
num = n - 1;
for ( i = 2; i < num; i++) {
fx += f1x;
fy += f1y;
px += fx;
py += fy;
/* <20>ŏ<EFBFBD><C58F>ƍŌ<C68D><C58C>̓_<CC93>ȊO<C88A>̓_<CC93><5F><EFBFBD><EFBFBD><EFBFBD>΍<EFBFBD><CE8D>W<EFBFBD>Ōv<C58C>Z<EFBFBD><5A><EFBFBD><EFBFBD> */
pntdata.x = (int)((px + n2hlf) /n2);
pntdata.y = (int)((py + n2hlf) /n2);
if ( (sts= VDSetData(lstHdl, &pntdata ))<0)
goto RET;
}
fx += f1x;
fy += f1y;
px += fx;
py += fy;
relx = px - (long)e->x*n2;
rely = py - (long)e->y*n2;
if (relx >= 0) relx += n2hlf;
else relx -= n2hlf;
if (rely >= 0) rely += n2hlf;
else rely -= n2hlf;
/* <20>Ō<EFBFBD><C58C>̓_<CC93><5F><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD> : <20>I<EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD>̑<EFBFBD><CC91>΍<EFBFBD><CE8D>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD><5A><EFBFBD><EFBFBD> */
pntdata.x = (int)(relx / n2 + e->x);
pntdata.y = (int)(rely / n2 + e->y);
if ( (sts= VDSetData(lstHdl, &pntdata))<0)
goto RET;
}
}
TERM_SET:
/* <20>Ȑ<EFBFBD><C890>̏I<CC8F>_<EFBFBD>͐ݒ肵<DD92>Ȃ<EFBFBD> */
RET:
return( sts);
}
/************************************************************
* Fast SQRT (N<>̕<EFBFBD><CC95><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD>)
*/
/* */ static int
/* */ fsqrt( int n)
/*
* returns :
************************************************************/
{
int i;
if ( n < NMAX*2) {
i = lowsqr[ n/2];
}
else {
for ( i=0; i<NMAX; i++ )
if ( sqrtbl[i] > n) break;
i++;
}
return( i );
}
/* EOF */