278 lines
5.8 KiB
C++
278 lines
5.8 KiB
C++
|
//
|
|||
|
// 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>̕<EFBFBD><EFBFBD><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 */
|