27 if (xx>0&&yy>0&&zz>0&&xx<gd.
xs&&yy<gd.
ys&&zz<gd.
zs) {
28 ret = gd.
gp[zz*gd.
xs*gd.
ys + yy*gd.
xs + xx];
53 ix = (int)(xx+0.5) - rb.
xmin;
54 iy = (int)(yy+0.5) - rb.
ymin;
55 iz = (int)(zz+0.5) - rb.
zmin;
57 if (ix>=0&&ix<gd.xs&&iy>=0&&iy<gd.ys&&iz>=0&&iz<gd.
zs){
58 ret = gd.
gp[iz*gd.
xs*gd.
ys + iy*gd.
xs + ix];
79 if (xx>0&&yy>0&&zz>0&&xx<gd.
xs&&yy<gd.
ys&&zz<gd.
zs) {
80 ret = (int)gd.
gp[zz*gd.
xs*gd.
ys + yy*gd.
xs + xx];
98 if (ix>=0&&ix<gd.xs&&iy>=0&&iy<gd.ys&&iz>=0&&iz<gd.
zs){
99 gd.
gp[iz*gd.
xs*gd.
ys + iy*gd.
xs + ix] = cc;
126 ix = (int)(xx+0.5) - rb.
xmin;
127 iy = (int)(yy+0.5) - rb.
ymin;
128 iz = (int)(zz+0.5) - rb.
zmin;
130 if (ix>=0&&ix<gd.xs&&iy>=0&&iy<gd.ys&&iz>=0&&iz<gd.
zs){
131 gd.
gp[iz*gd.
xs*gd.
ys + iy*gd.
xs + ix] = cc;
135 x = (int)(xx) - rb.
xmin;
136 y = (int)(yy) - rb.
ymin;
137 z = (int)(zz) - rb.
zmin;
139 for (i=0; i<=1; i++) {
140 for (j=0; j<=1; j++) {
141 for (k=0; k<=1; k++) {
145 if (ix>=0&&ix<gd.xs&&iy>=0&&iy<gd.ys&&iz>=0&&iz<gd.
zs){
146 gd.
gp[iz*gd.
xs*gd.
ys + iy*gd.
xs + ix] = cc;
168 if (ix>=0&&ix<gd.xs&&iy>=0&&iy<gd.ys&&iz>=0&&iz<gd.
zs){
169 gd.
gp[iz*gd.
xs*gd.
ys + iy*gd.
xs + ix] = cc;
191 int x, y, z, cx, cy, cz;
192 double px, py, pz, xx, yy, zz;
193 double cst, snt, csf=0.0, snf=1.0;
196 if (pcsf!=NULL && psnf!=NULL) {
203 topola(ex, &cst, &snt, &csf, &snf);
205 for(z=0; z<vp.
zs; z++) {
207 for(y=0; y<vp.
ys; y++) {
209 for(x=0; x<vp.
xs; x++) {
215 xx = px*snt*csf - py*snf - pz*cst*csf + ox.
x;
216 yy = px*snt*snf + py*csf - pz*cst*snf + ox.
y;
217 zz = px*cst + pz*snt + ox.
z;
224 if (pcsf!=NULL && psnf!=NULL) {
251 if (c<=mx && c>=mn) {
252 fprintf(stderr,
"PAINT: c = %d. Not be %d< c <%d\n\n",c,mn,mx);
256 cc = vp.
gp[y*vp.
xs+x];
257 if (cc>mx || cc<mn)
return;
260 if (vp.
gp[y*vp.
xs+x-1]>mx || vp.
gp[y*vp.
xs+x-1]<mn)
break;
266 if (vp.
gp[y*vp.
xs+k]>mx || vp.
gp[y*vp.
xs+k]<mn)
break;
267 vp.
gp[y*vp.
xs+k] = c;
272 for (i=x; i<=k; i++){
273 if (y-1>=0 && y-1<vp.
ys){
275 if (vp.
gp[j]<=mx && vp.
gp[j]>=mn) {
276 paint(vp, i, y-1, mn, mx, c, m);
281 if (vp.
gp[j-1]<=mx && vp.
gp[j-1]>=mn) {
282 paint(vp, i-1, y-1, mn, mx, c, m);
286 if (vp.
gp[j+1]<=mx && vp.
gp[j+1]>=mn) {
287 paint(vp, i+1, y-1, mn, mx, c, m);
293 if (y+1>=0 && y+1<vp.
ys){
295 if (vp.
gp[j]<=mx && vp.
gp[j]>=mn) {
296 paint(vp, i, y+1, mn, mx, c, m);
301 if (vp.
gp[j-1]<=mx && vp.
gp[j-1]>=mn) {
302 paint(vp, i-1, y+1, mn, mx, c, m);
306 if (vp.
gp[j+1]<=mx && vp.
gp[j+1]>=mn) {
307 paint(vp, i+1, y+1, mn, mx, c, m);
339 for (i=0; i<vp.
xs*vp.
ys*vp.
zs; i++) {
359 xp.
gp = &(vp.
gp[z*ps]);
362 cc = xp.
gp[y*xp.
xs+x];
363 if (cc>mx || cc<mn)
return;
364 paint(xp, x, y, mn, mx, c, m);
366 DEBUG_MODE fprintf(stderr,
"_paint_3d: zz = %d\n",z);
369 for (i=0; i<ps; i++) {
374 j = (z-1)*ps+y*vp.
xs+x;
375 if (vp.
gp[j]<=mx && vp.
gp[j]>=mn)
_paint_3d(vp, x, y, z-1, mn, mx, c, m);
378 j = (z+1)*ps+y*vp.
xs+x;
379 if (vp.
gp[j]<=mx && vp.
gp[j]>=mn)
_paint_3d(vp, x, y, z+1, mn, mx, c, m);
422 for (index=0; index<xdiff+1; index++) {
425 thresh = thresh + ydiff;
427 thresh = thresh - xdiff;
433 for (index=0; index<ydiff+1; index++) {
436 thresh = thresh + xdiff;
438 thresh = thresh - ydiff;
480 for (index=0; index<xdiff+1; index++) {
483 thresh = thresh + ydiff;
485 thresh = thresh - xdiff;
491 for (index=0; index<ydiff+1; index++) {
494 thresh = thresh + xdiff;
496 thresh = thresh - ydiff;
522void triangle(
WSGraph vp,
int x1,
int y1,
int x2,
int y2,
int x3,
int y3,
int cc,
int mode)
524 line(vp, x1, y1, x2, y2, cc);
525 line(vp, x2, y2, x3, y3, cc);
526 line(vp, x3, y3, x1, y1, cc);
529 int i, j, minx, miny, maxx, maxy;
532 minx =
Min(x2, minx);
533 minx =
Min(x3, minx);
534 miny =
Min(y2, miny);
535 miny =
Min(y3, miny);
536 maxx =
Max(x2, maxx);
537 maxx =
Max(x3, maxx);
538 maxy =
Max(y2, maxy);
539 maxy =
Max(y3, maxy);
541 for (j=miny; j<=maxy; j++) {
542 for (i=minx; i<=maxx; i++) {
543 if (
isinctri(x1, y1, x2, y2, x3, y3, i, j))
Px(vp, i, j) = cc;
559int isinctri(
int x1,
int y1,
int x2,
int y2,
int x3,
int y3,
int xx,
int yy)
563 cx = (x1 + x2 + x3)/3;
564 cy = (y1 + y2 + y3)/3;
589void box(
WSGraph vp,
int x1,
int y1,
int x2,
int y2,
int cc,
int mode)
591 line(vp, x1, y1, x2, y1, cc);
592 line(vp, x2, y1, x2, y2, cc);
593 line(vp, x2, y2, x1, y2, cc);
594 line(vp, x1, y2, x1, y1, cc);
597 paint(vp, (x1+x2)/2, (y1+y2)/2, 0, cc-1, cc, 4);
616 int xx, yy, zz, dx, dy, dz;
617 int ux=1, uy=1, uz=1;
618 int sx=0, sy=0, sz=0;
642 if (dx>=dy && dx>=dz) {
643 for (i=1; i<=dx; i++) {
658 else if (dy>dx && dy>=dz) {
659 for (i=1; i<=dy; i++) {
675 for (i=1; i<=dz; i++) {
703void line3d(
WSGraph gd,
int x1,
int y1,
int z1,
int x2,
int y2,
int z2,
int cc)
706 int xx, yy, zz, dx, dy, dz;
707 int ux=1, uy=1, uz=1;
708 int sx=0, sy=0, sz=0;
732 if (dx>=dy && dx>=dz) {
733 for (i=1; i<=dx; i++) {
748 else if (dy>dx && dy>=dz) {
749 for (i=1; i<=dy; i++) {
765 for (i=1; i<=dz; i++) {
803 px = (
int*)malloc(
sizeof(
int)*(r+1));
804 py = (
int*)malloc(
sizeof(
int)*(r+1));
805 if (px==NULL || py==NULL) {
806 if (px!=NULL) free(px);
807 if (py!=NULL) free(py);
810 memset(px, 0,
sizeof(
int)*(r+1));
811 memset(py, 0,
sizeof(
int)*(r+1));
820 cx = (y+iy)*gd.
xs + (x+ix);
835 for (i=0; i<=nn; i++) {
841 for (i=0; i<=nn; i++) {
847 for (i=0; i<=nn; i++) {
853 for (i=0; i<=nn; i++) {
859 for (i=0; i<=nn; i++) {
865 for (i=0; i<=nn; i++) {
871 for (i=0; i<=nn; i++) {
877 if (mode==
ON)
paint(gd, x, y, 0, cc-1, cc, 4);
902 if (vp.
gp==NULL)
return;
903 circle(vp, rr+1, rr+1, rr, cc, mode);
931 ll = (int)(ox.
n + 0.5);
933 if (vp.
gp==NULL)
return;
935 for (i=0; i<vp.
zs; i++) {
937 px.
gp = &(vp.
gp[cz]);
965 double dt, th, xx, yy, zz, sn, cs;
970 if (vp.
gp==NULL)
return;
971 nn = (int)(2*
PI*(rr+ra)*2);
975 for (i=0; i<nn; i++) {
979 xx = (vp.
xs-1)/2. + rr*cs;
980 yy = (vp.
ys-1)/2. - rr*sn;
1010 int i, j, k, rx, nn, s = 1;
1011 double th, fi, cs, sn, cf, sf, dt;
1012 double xx, yy, zz, zc;
1016 memset(&xp, 0,
sizeof(
WSGraph));
1023 for (k=(
int)(a.
z-r+0.5); k<=(int)(a.
z+r+0.5); k++) {
1024 if (k>=0 && k<vp.
zs) {
1026 rx = (int)(sqrt(r*r-(a.
z-k)*(a.
z-k))+0.5);
1035 nn = (int)(2*
PI*r + 0.5)*2;
1037 for (i=0; i<=nn; i++) {
1044 if (zc<s) zz = s/
RZxy;
1045 if (zc>vp.
zs-s-1) zz = (vp.
zs-s-1)/
RZxy;
1047 for (j=0; j<=2*nn; j++) {
1054 if (xx<s) xx = (double)s;
1055 if (yy<s) yy = (double)s;
1056 if (xx>vp.
xs-s-1) xx = (double)(vp.
xs-s-1);
1057 if (yy>vp.
ys-s-1) yy = (double)(vp.
ys-s-1);
1082 memset(&wp, 0,
sizeof(
WSGraph));
1087 for (j=0; j<vp.
ys; j++) {
1089 for (i=0; i<vp.
xs; i++) {
1090 wp.
gp[cy +i] = vp.
gp[cy + vp.
xs - 1 - i];
1113 if (nv.
n>
EPS && nv.
n!=1.0) {
1119 if (nv.
z<-1.0) nv.
z = -1.0;
1120 if (nv.
z> 1.0) nv.
z = 1.0;
1122 *snt = sqrt(1.0-nv.
z*nv.
z);
1152 int i, j, k, cx, ax;
1157 for (i=0; i<vp.
xs; i++)
1158 for (j=0; j<vp.
ys; j++)
1159 for (k=0; k<vp.
zs; k++) {
1160 cx = vp.
xs*vp.
ys*k + vp.
xs*j + i;
1161 if (vp.
gp[cx]>=cc) {
1193 for (i=0; i<xp.
xs; i++) {
1194 for (j=0; j<xp.
ys; j++) {
1195 for (k=0; k<xp.
zs; k++) {
1196 cx = xp.
xs*xp.
ys*k + xp.
xs*j + i;
1198 if (vp.
gp[ax]>=cc) xp.
gp[cx] = vp.
gp[ax];
1219 for (i=0; i<vp.
xs; i++){
1221 px2 = (vp.
ys-1)*vp.
xs + i;
1225 for (i=1; i<vp.
ys-1; i++){
1227 px2 = vp.
xs*(i+1) - 1;
1248 int i, j, k, l, m, n;
1251 memset(&vx, 0,
sizeof(
WSGraph));
1259 memset(&vx, 0,
sizeof(
WSGraph));
1265 for(j=0; j<vp.
ys; j++) {
1266 for(i=0; i<vp.
xs; i++) {
1268 n = (i + j*vx.
xs)*zm;
1269 if(i==vp.
xs-1) wt = 0;
1270 else wt = (vp.
gp[m+1] - vp.
gp[m])/zm;
1271 if(j==vp.
ys-1) ws = 0;
1272 else ws = (vp.
gp[m+vp.
xs] - vp.
gp[m])/zm;
1274 for(k=0; k<zm; k++) {
1275 for(l=0; l<zm; l++) {
1276 vx.
gp[n+l+k*vx.
xs] = ws*k + wt*l + vp.
gp[m];
1283 for(j=0; j<vp.
ys; j++) {
1284 for(i=0; i<vp.
xs; i++) {
1286 n = (i + j*vx.
xs)*zm;
1287 for(k=0; k<zm; k++) {
1288 for(l=0; l<zm; l++) {
1289 vx.
gp[n+l+k*vx.
xs] = vp.
gp[m];
1313 int i, j, xs, xe, ys, ye, xsize, ysize;
1318 xe =
Min(xe, vp.
xs-1);
1321 ye =
Min(ye, vp.
ys-1);
1322 xsize = xe - xs + 1;
1323 ysize = ye - ys + 1;
1327 memset(&xp, 0,
sizeof(
WSGraph));
1332 for (j=0; j<ysize; j++) {
1333 for (i=0; i<xsize; i++) {
1334 Px(xp, i, j) =
Px(vp, i+xs, j+ys);
1354 int i, ssz, dsz, sz;
1356 if (src.
zs<=0) src.
zs = 1;
1357 if (dst.
zs<=0) dst.
zs = 1;
1358 ssz = src.
xs*src.
ys*src.
zs;
1359 dsz = dst.
xs*dst.
ys*dst.
zs;
1362 for (i=0; i<sz; i++) dst.
gp[i] = src.
gp[i];
1363 for (i=sz; i<dsz; i++) dst.
gp[i] = 0;
WSGraph make_WSGraph(int xs, int ys, int zs)
void init_IRBound(IRBound *rb)
#define Px(v, i, j)
2次元画像データ vの (i, j) のデータを参照する.
void set_around(WSGraph vp, int cc)
WSGraph grab_WSGraph(WSGraph vp, int x1, int y1, int x2, int y2)
void torus(WSGraph gd, vector ox, vector ex, int rr, int ra, int cc)
int get_wdat(WSGraph gd, double xx, double yy, double zz, IRBound rb)
WSGraph cut_object(WSGraph vp, int cc, IRBound *rb, int blank)
void bline(BSGraph vp, int x1, int y1, int x2, int y2, int cc)
WSGraph zoom_WSGraph(WSGraph vp, int zm, int mode)
void bline3d(BSGraph gd, int x1, int y1, int z1, int x2, int y2, int z2, int cc)
void pool(WSGraph gd, vector a, vector b, int rr, int cc)
void paint3d(WSGraph vp, int x, int y, int z, int mn, int mx, int c, int m)
void circle3d(WSGraph gd, vector ox, vector ex, int rr, int cc, int mode)
void set_idat(WSGraph gd, int ix, int iy, int iz, int cc)
void set_bdat(BSGraph gd, int ix, int iy, int iz, int cc)
void triangle(WSGraph vp, int x1, int y1, int x2, int y2, int x3, int y3, int cc, int mode)
void box(WSGraph vp, int x1, int y1, int x2, int y2, int cc, int mode)
void set_wdat(WSGraph gd, double xx, double yy, double zz, int cc, IRBound rb)
int get_idat(WSGraph gd, int xx, int yy, int zz)
void local2world(WSGraph gd, WSGraph vp, vector ox, vector oz, vector ex, double *pcsf, double *psnf)
void line(WSGraph vp, int x1, int y1, int x2, int y2, int cc)
void line3d(WSGraph gd, int x1, int y1, int z1, int x2, int y2, int z2, int cc)
void circle(WSGraph gd, int x, int y, int r, int cc, int mode)
void copy_WSGraph(WSGraph src, WSGraph dst)
int isinctri(int x1, int y1, int x2, int y2, int x3, int y3, int xx, int yy)
int get_bdat(BSGraph gd, int xx, int yy, int zz)
void topola(vector nv, double *cst, double *snt, double *csf, double *snf)
WSGraph x_reverse_wsg(WSGraph vp)
void paint(WSGraph vp, int x, int y, int mn, int mx, int c, int m)
void sphere(WSGraph vp, vector a, int r, int cc, int mode)
void _paint_3d(WSGraph vp, int x, int y, int z, int mn, int mx, int c, int m)
#define isCrossLine(x1, y1, x2, y2, x3, y3, x4, y4)
#define JBXL_GRAPH_IVDARG_ERROR
無効な引数
#define JBXL_GRAPH_MEMORY_ERROR
メモリエラー
vector unit_vector(vector a)
vector set_vector(double x, double y, double z)
#define sub_vector(a, b)
ベクトル a, bを引き算して, 結果を実数ベクトルで返す.
int zs
zサイズ. 4Byte. 2Dの場合は 1.
uByte * gp
グラフィックデータへのポインタ. xs*ys*zs*1Byte.
int zs
zサイズ. 4Byte. 2Dの場合は 1.
sWord * gp
グラフィックデータへのポインタ. xs*ys*zs*2Byte.