[BACK]Return to if.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / plot

Annotation of OpenXM_contrib2/asir2000/plot/if.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/plot/if.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "parse.h"
        !             4: #include "ox.h"
        !             5: #include "ifplot.h"
        !             6:
        !             7: extern jmp_buf ox_env;
        !             8:
        !             9: int plot(NODE arg)
        !            10: {
        !            11:        int id;
        !            12:        NODE n;
        !            13:        struct canvas *can;
        !            14:        P formula;
        !            15:        LIST xrange,yrange,zrange,wsize;
        !            16:        STRING wname;
        !            17:
        !            18:        formula = (P)ARG0(arg);
        !            19:        xrange = (LIST)ARG1(arg);
        !            20:        yrange = (LIST)ARG2(arg);
        !            21:        zrange = (LIST)ARG3(arg);
        !            22:        wsize = (LIST)ARG4(arg);
        !            23:        wname = (STRING)ARG5(arg);
        !            24:
        !            25:        can = canvas[id = search_canvas()];
        !            26:        n = BDY(xrange); can->vx = VR((P)BDY(n)); n = NEXT(n);
        !            27:        can->qxmin = (Q)BDY(n); n = NEXT(n); can->qxmax = (Q)BDY(n);
        !            28:        can->xmin = ToReal(can->qxmin); can->xmax = ToReal(can->qxmax);
        !            29:        if ( yrange ) {
        !            30:                n = BDY(yrange); can->vy = VR((P)BDY(n)); n = NEXT(n);
        !            31:                can->qymin = (Q)BDY(n); n = NEXT(n); can->qymax = (Q)BDY(n);
        !            32:                can->ymin = ToReal(can->qymin); can->ymax = ToReal(can->qymax);
        !            33:                if ( zrange ) {
        !            34:                        n = NEXT(BDY(zrange));
        !            35:                        can->zmin = ToReal(BDY(n)); n = NEXT(n); can->zmax = ToReal(BDY(n));
        !            36:                        if ( n = NEXT(n) )
        !            37:                                can->nzstep = QTOS((Q)BDY(n));
        !            38:                        else
        !            39:                                can->nzstep = MAXGC;
        !            40:                        can->mode = MODE_CONPLOT;
        !            41:                } else
        !            42:                        can->mode = MODE_IFPLOT;
        !            43:        } else
        !            44:                can->mode = MODE_PLOT;
        !            45:        if ( !wsize ) {
        !            46:                can->width = DEFAULTWIDTH; can->height = DEFAULTHEIGHT;
        !            47:        } else {
        !            48:                can->width = QTOS((Q)BDY(BDY(wsize)));
        !            49:                can->height = QTOS((Q)BDY(NEXT(BDY(wsize))));
        !            50:        }
        !            51:        if ( wname )
        !            52:                can->wname = BDY(wname);
        !            53:        else
        !            54:                can->wname = "";
        !            55:        can->formula = formula;
        !            56:        create_canvas(can);
        !            57:        if ( can->mode == MODE_PLOT ) {
        !            58:                plotcalc(can);
        !            59:                plot_print(display,can);
        !            60:        } else
        !            61:                ifplotmain(can);
        !            62:        copy_to_canvas(can);
        !            63:        return id;
        !            64: }
        !            65:
        !            66: int plotover(NODE arg)
        !            67: {
        !            68:        int index;
        !            69:        P formula;
        !            70:        struct canvas *can;
        !            71:        struct canvas fakecan;
        !            72:        VL vl,vl0;
        !            73:
        !            74:        index = QTOS((Q)ARG0(arg));
        !            75:        formula = (P)ARG1(arg);
        !            76:        can = canvas[index];
        !            77:        if ( !can->window )
        !            78:                return -1;
        !            79:        get_vars_recursive(formula,&vl);
        !            80:        for ( vl0 = vl; vl0; vl0 = NEXT(vl0) )
        !            81:                if ( vl0->v->attr == V_IND )
        !            82:                        if ( vl->v != can->vx && vl->v != can->vy )
        !            83:                                return -1;
        !            84:        current_can = can;
        !            85:        fakecan = *can; fakecan.formula = formula;
        !            86:        if ( can->mode == MODE_PLOT ) {
        !            87:                plotcalc(&fakecan);
        !            88:                plot_print(display,&fakecan);
        !            89:        } else
        !            90:                ifplotmain(&fakecan);
        !            91:        copy_to_canvas(&fakecan);
        !            92:        return index;
        !            93: }
        !            94:
        !            95: int drawcircle(NODE arg)
        !            96: {
        !            97:        int id;
        !            98:        int index;
        !            99:        pointer ptr;
        !           100:        Q ret;
        !           101:        LIST xyr;
        !           102:        Obj x,y,r;
        !           103:        int wx,wy,wr;
        !           104:        struct canvas *can;
        !           105:        struct canvas fakecan;
        !           106:
        !           107:        index = QTOS((Q)ARG0(arg));
        !           108:        xyr = (LIST)ARG1(arg);
        !           109:        x = (Obj)ARG0(BDY(xyr)); y = (Obj)ARG1(BDY(xyr)); r = (Obj)ARG2(BDY(xyr));
        !           110:        can = canvas[index];
        !           111:        if ( !can->window )
        !           112:                return -1;
        !           113:        else {
        !           114:                current_can = can;
        !           115:                wx = (ToReal(x)-can->xmin)*can->width/(can->xmax-can->xmin);
        !           116:                wy = (can->ymax-ToReal(y))*can->height/(can->ymax-can->ymin);
        !           117:                wr = ToReal(r);
        !           118:                XFillArc(display,can->pix,colorGC,wx-wr/2,wy-wr/2,wr,wr,0,360*64);
        !           119:                copy_to_canvas(can);
        !           120:                return index;
        !           121:        }
        !           122: }
        !           123:
        !           124: #define RealtoDbl(r) ((r)?BDY(r):0.0)
        !           125:
        !           126: int arrayplot(NODE arg)
        !           127: {
        !           128:        int id,ix,w,h;
        !           129:        VECT array;
        !           130:        LIST xrange,wsize;
        !           131:        char *wname;
        !           132:        NODE n;
        !           133:        Q ret;
        !           134:        double ymax,ymin,dy,xstep;
        !           135:        Real *tab;
        !           136:        struct canvas *can;
        !           137:        POINT *pa;
        !           138:
        !           139:        array = (VECT)ARG0(arg);
        !           140:        xrange = (LIST)ARG1(arg);
        !           141:        can = canvas[id = search_canvas()];
        !           142:        n = BDY(xrange); can->vx = VR((P)BDY(n)); n = NEXT(n);
        !           143:        can->qxmin = (Q)BDY(n); n = NEXT(n); can->qxmax = (Q)BDY(n);
        !           144:        can->xmin = ToReal(can->qxmin); can->xmax = ToReal(can->qxmax);
        !           145:        if ( !wsize ) {
        !           146:                can->width = DEFAULTWIDTH; can->height = DEFAULTHEIGHT;
        !           147:        } else {
        !           148:                can->width = QTOS((Q)BDY(BDY(wsize)));
        !           149:                can->height = QTOS((Q)BDY(NEXT(BDY(wsize))));
        !           150:        }
        !           151:        can->wname = wname; can->formula = 0; can->mode = MODE_PLOT;
        !           152:        create_canvas(can);
        !           153:        w = array->len;
        !           154:        h = can->height;
        !           155:        tab = (Real *)BDY(array);
        !           156:        if ( can->ymax == can->ymin ) {
        !           157:                for ( ymax = ymin = RealtoDbl(tab[0]), ix = 1; ix < w; ix++ ) {
        !           158:                        if ( RealtoDbl(tab[ix]) > ymax )
        !           159:                                ymax = RealtoDbl(tab[ix]);
        !           160:                        if ( RealtoDbl(tab[ix]) < ymin )
        !           161:                                ymin = RealtoDbl(tab[ix]);
        !           162:                }
        !           163:                can->ymax = ymax; can->ymin = ymin;
        !           164:        } else {
        !           165:                ymax = can->ymax; ymin = can->ymin;
        !           166:        }
        !           167:        dy = ymax-ymin;
        !           168:        can->pa = (struct pa *)MALLOC(sizeof(struct pa));
        !           169:        can->pa[0].length = w;
        !           170:        can->pa[0].pos = pa = (POINT *)MALLOC(w*sizeof(POINT));
        !           171:        xstep = (double)can->width/(double)(w-1);
        !           172:        for ( ix = 0; ix < w; ix++ ) {
        !           173: #ifndef MAXSHORT
        !           174: #define MAXSHORT ((short)0x7fff)
        !           175: #endif
        !           176:                double t;
        !           177:
        !           178:                pa[ix].x = (int)(ix*xstep);
        !           179:                t = (h - 1)*(ymax - RealtoDbl(tab[ix]))/dy;
        !           180:                if ( t > MAXSHORT )
        !           181:                        pa[ix].y = MAXSHORT;
        !           182:                else if ( t < -MAXSHORT )
        !           183:                        pa[ix].y = -MAXSHORT;
        !           184:                else
        !           185:                        pa[ix].y = t;
        !           186:        }
        !           187:        plot_print(display,can);
        !           188:        copy_to_canvas(can);
        !           189:        return id;
        !           190: }
        !           191:
        !           192: ifplot_resize(can,spos,epos)
        !           193: struct canvas *can;
        !           194: POINT spos,epos;
        !           195: {
        !           196:        struct canvas *ncan;
        !           197:        struct canvas fakecan;
        !           198:        Q dx,dy,dx2,dy2,xmin,xmax,ymin,ymax,xmid,ymid;
        !           199:        Q sx,sy,ex,ey,cw,ch,ten,two;
        !           200:        Q s,t;
        !           201:        int new;
        !           202:        int w,h,m;
        !           203:        Q ret;
        !           204:
        !           205:        if ( XC(spos) < XC(epos) && YC(spos) < YC(epos) ) {
        !           206:                if ( can->precise && !can->wide ) {
        !           207:                        fakecan = *can; ncan = &fakecan;
        !           208:                } else {
        !           209:                        new = search_canvas(); ncan = canvas[new];
        !           210:                }
        !           211:                ncan->mode = can->mode;
        !           212:                ncan->zmin = can->zmin; ncan->zmax = can->zmax;
        !           213:                ncan->nzstep = can->nzstep;
        !           214:                ncan->wname = can->wname;
        !           215:                ncan->vx = can->vx; ncan->vy = can->vy;
        !           216:                ncan->formula = can->formula;
        !           217:                w = XC(epos)-XC(spos);
        !           218:                h = YC(epos)-YC(spos);
        !           219:                m = MAX(can->width,can->height);
        !           220:                if ( can->precise ) {
        !           221:                        ncan->width = w; ncan->height = h;
        !           222:                } else if ( w > h ) {
        !           223:                        ncan->width = m; ncan->height = m * h/w;
        !           224:                } else {
        !           225:                        ncan->width = m * w/h; ncan->height = m;
        !           226:                }
        !           227:                if ( can->wide ) {
        !           228:                        STOQ(10,ten); STOQ(2,two);
        !           229:                        subq(can->qxmax,can->qxmin,&t); mulq(t,ten,&dx);
        !           230:                        subq(can->qymax,can->qymin,&t); mulq(t,ten,&dy);
        !           231:                        addq(can->qxmax,can->qxmin,&t); divq(t,two,&xmid);
        !           232:                        addq(can->qymax,can->qymin,&t); divq(t,two,&ymid);
        !           233:                        divq(dx,two,&dx2); divq(dy,two,&dy2);
        !           234:                        subq(xmid,dx2,&xmin); addq(xmid,dx2,&xmax);
        !           235:                        subq(ymid,dy2,&ymin); addq(ymid,dy2,&ymax);
        !           236:                } else {
        !           237:                        subq(can->qxmax,can->qxmin,&dx); subq(can->qymax,can->qymin,&dy);
        !           238:                        xmin = can->qxmin; xmax = can->qxmax;
        !           239:                        ymin = can->qymin; ymax = can->qymax;
        !           240:                }
        !           241:                STOQ(XC(spos),sx); STOQ(YC(spos),sy); STOQ(XC(epos),ex); STOQ(YC(epos),ey);
        !           242:                STOQ(can->width,cw); STOQ(can->height,ch);
        !           243:                mulq(sx,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmin);
        !           244:                mulq(ex,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmax);
        !           245:                mulq(ey,dy,&t); divq(t,ch,&s); subq(ymax,s,&ncan->qymin);
        !           246:                mulq(sy,dy,&t); divq(t,ch,&s); subq(ymax,s,&ncan->qymax);
        !           247:                ncan->xmin = ToReal(ncan->qxmin); ncan->xmax = ToReal(ncan->qxmax);
        !           248:                ncan->ymin = ToReal(ncan->qymin); ncan->ymax = ToReal(ncan->qymax);
        !           249:                if ( can->precise && !can->wide ) {
        !           250:                        current_can = can;
        !           251:                        alloc_pixmap(ncan);
        !           252:                        qifplotmain(ncan);
        !           253:                        copy_subimage(ncan,can,spos);
        !           254:                        copy_to_canvas(can);
        !           255:                } else {
        !           256:                        create_canvas(ncan);
        !           257:                        if ( can->precise )
        !           258:                                qifplotmain(ncan);
        !           259:                        else
        !           260:                                ifplotmain(ncan);
        !           261:                        copy_to_canvas(ncan);
        !           262:                }
        !           263:        }
        !           264: }
        !           265:
        !           266: plot_resize(can,spos,epos)
        !           267: struct canvas *can;
        !           268: POINT spos,epos;
        !           269: {
        !           270:        struct canvas *ncan;
        !           271:        Q dx,dx2,xmin,xmax,xmid;
        !           272:        double dy,dy2,ymin,ymax,ymid;
        !           273:        Q sx,ex,cw,ten,two;
        !           274:        double sy,ey;
        !           275:        Q s,t;
        !           276:        int new;
        !           277:        int w,h,m;
        !           278:
        !           279:        if ( XC(spos) < XC(epos) && YC(spos) < YC(epos) ) {
        !           280:                new = search_canvas(); ncan = canvas[new];
        !           281:                ncan->mode = can->mode;
        !           282:                ncan->zmin = can->zmin; ncan->zmax = can->zmax;
        !           283:                ncan->nzstep = can->nzstep;
        !           284:                ncan->wname = can->wname;
        !           285:                ncan->vx = can->vx; ncan->vy = can->vy;
        !           286:                ncan->formula = can->formula;
        !           287:                w = XC(epos)-XC(spos);
        !           288:                h = YC(epos)-YC(spos);
        !           289:                m = MAX(can->width,can->height);
        !           290:                if ( w > h ) {
        !           291:                        ncan->width = m; ncan->height = m * h/w;
        !           292:                } else {
        !           293:                        ncan->width = m * w/h; ncan->height = m;
        !           294:                }
        !           295:                if ( can->wide ) {
        !           296:                        STOQ(10,ten); STOQ(2,two);
        !           297:                        subq(can->qxmax,can->qxmin,&t); mulq(t,ten,&dx);
        !           298:                        addq(can->qxmax,can->qxmin,&t); divq(t,two,&xmid);
        !           299:                        divq(dx,two,&dx2); subq(xmid,dx2,&xmin); addq(xmid,dx2,&xmax);
        !           300:
        !           301:                        dy = (can->ymax-can->ymin)*10;
        !           302:                        ymid = (can->ymax+can->ymin)/2;
        !           303:                        ymin = ymid-dy/2; ymax = ymid+dy/2;
        !           304:                } else {
        !           305:                        subq(can->qxmax,can->qxmin,&dx);
        !           306:                        xmin = can->qxmin; xmax = can->qxmax;
        !           307:
        !           308:                        dy = can->ymax-can->ymin;
        !           309:                        ymin = can->ymin; ymax = can->ymax;
        !           310:                }
        !           311:                STOQ(XC(spos),sx); STOQ(XC(epos),ex); STOQ(can->width,cw);
        !           312:                mulq(sx,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmin);
        !           313:                mulq(ex,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmax);
        !           314:                ncan->xmin = ToReal(ncan->qxmin); ncan->xmax = ToReal(ncan->qxmax);
        !           315:
        !           316:                ncan->ymin = ymax-YC(epos)*dy/can->height;
        !           317:                ncan->ymax = ymax-YC(spos)*dy/can->height;
        !           318:
        !           319:                create_canvas(ncan);
        !           320:                plotcalc(ncan);
        !           321:                plot_print(display,ncan);
        !           322:                copy_to_canvas(ncan);
        !           323:        }
        !           324: }
        !           325:
        !           326: ifplotmain(can)
        !           327: struct canvas *can;
        !           328: {
        !           329:        int width,height;
        !           330:        double **tabe,*tabeb;
        !           331:        int i;
        !           332:
        !           333:        width = can->width; height = can->height;
        !           334:        tabe = (double **)ALLOCA(width*sizeof(double *));
        !           335:        for ( i = 0; i < width; i++ )
        !           336:                tabe[i] = (double *)ALLOCA(height*sizeof(double));
        !           337:        define_cursor(can->window,runningcur);
        !           338:        set_busy(can); set_selection();
        !           339:        calc(tabe,can); if_print(display,tabe,can);
        !           340:        reset_selection(); reset_busy(can);
        !           341:        define_cursor(can->window,normalcur);
        !           342: }
        !           343:
        !           344: qifplotmain(can)
        !           345: struct canvas *can;
        !           346: {
        !           347:        int width,height;
        !           348:        char **tabe,*tabeb;
        !           349:        int i;
        !           350:
        !           351:        width = can->width; height = can->height;
        !           352:        tabe = (char **)ALLOCA(width*sizeof(char *)+width*height*sizeof(char));
        !           353:        bzero(tabe,width*sizeof(char *)+width*height*sizeof(char));
        !           354:        for ( i = 0, tabeb = (char *)(tabe+width); i < width; i++ )
        !           355:                tabe[i] = tabeb + height*i;
        !           356:        define_cursor(can->window,runningcur);
        !           357:        set_busy(can); set_selection();
        !           358:        qcalc(tabe,can); qif_print(display,tabe,can);
        !           359:        reset_selection(); reset_busy(can);
        !           360:        define_cursor(can->window,normalcur);
        !           361: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>