Annotation of researchv9/jtools/src/demo/ball.c, revision 1.1

1.1     ! root        1: #include <jerq.h>
        !             2: Point spot, v, a;
        !             3: int Topx, Topy;
        !             4: int Botx, Boty;
        !             5: Bitmap *ball;
        !             6: int    R;
        !             7: long   R2;
        !             8: main(argc, argv)
        !             9: char *argv[];
        !            10: {
        !            11:        request(KBD);
        !            12:        initdisplay(argc, argv);
        !            13:        rectf(&display, Drect, F_XOR);
        !            14:        Topx=10*Drect.corner.x-320;
        !            15:        Topy=10*Drect.corner.y-320;
        !            16:        Botx=10*Drect.origin.x+320;
        !            17:        Boty=10*Drect.origin.y+320;
        !            18:        a.x = 0;
        !            19:        a.y = 1;
        !            20:        spot.x = (Botx+Topx)/2; 
        !            21:        spot.y = Boty;
        !            22:        R=32;
        !            23:        R2=R*(long)R;
        !            24:        ball=balloc(Rect(0, 0, 2*R+1, 2*R+1));
        !            25:        rectf(ball,ball->rect,F_STORE);
        !            26:        sphere();
        !            27:        drawball();
        !            28:        v.x=5;
        !            29:        v.y=0;
        !            30:        while(kbdchar()==-1){
        !            31:                drawball();
        !            32:                v = add(v, a);
        !            33:                spot = add(spot, v);
        !            34:                if(spot.x >= Topx) {
        !            35:                        spot.x = 2*Topx - spot.x;
        !            36:                        v.x = -v.x;
        !            37:                }
        !            38:                else if(spot.x <= Botx) {
        !            39:                        spot.x = 2*Botx - spot.x;
        !            40:                        v.x = -v.x;
        !            41:                }
        !            42:                if(spot.y >= Topy) {
        !            43:                        spot.y = 2*Topy - spot.y;
        !            44:                        v.y = -v.y;
        !            45:                }
        !            46:                else if(spot.y <= Boty) {
        !            47:                        spot.y = 2*Boty - spot.y;
        !            48:                        v.y = -v.y;
        !            49:                }
        !            50:                drawball();
        !            51:                sleep(4);
        !            52:        }
        !            53:        bfree(ball);
        !            54:        exit();
        !            55: }
        !            56: drawball()
        !            57: {      Point p;
        !            58:        p = sub(div(spot, 10), Pt(R, R));
        !            59:        bitblt(ball, ball->rect, &display, p, F_XOR);
        !            60: }
        !            61: int    illum[3]={5, 4, 3};     /* |illum|=7 (pretty close) */
        !            62: int    view[3]={1, 0, 0};
        !            63: #define        DITHSIZE        8
        !            64: #define        DITHMASK        (DITHSIZE-1)
        !            65: int dith[DITHSIZE][DITHSIZE]={
        !            66:        0,      32,     8,      40,     2,      34,     10,     42,
        !            67:        48,     16,     56,     24,     50,     18,     58,     26,
        !            68:        12,     44,     4,      36,     14,     46,     6,      38,
        !            69:        60,     28,     52,     20,     62,     30,     54,     22,
        !            70:        3,      35,     11,     43,     1,      33,     9,      41,
        !            71:        51,     19,     59,     27,     49,     17,     57,     25,
        !            72:        15,     47,     7,      39,     13,     45,     5,      37,
        !            73:        63,     31,     55,     23,     61,     29,     53,     21,
        !            74: };
        !            75: sphere(){
        !            76:        register x, y, z;
        !            77:        register d;
        !            78:        register I;
        !            79:        rectf(ball, ball->rect, F_XOR);
        !            80:        for(y= -R; y<=R; y++)   /* y across, pos to right */
        !            81:                for(z= -R; z<=R; z++){  /* z pos up */
        !            82:                        if(z*z+y*y>R2)
        !            83:                                continue;
        !            84:                        x=sqrtryz(R, y, z);
        !            85:                        /* I=(illum.r)(view.r) */
        !            86:                        I=muldiv(x,     /* view.r */
        !            87:                           (x*5+y*4+z*3), /* illum.r */
        !            88:                            87);        /* a scale factor: ~RLV */
        !            89:                        if(I<=0)        /* unilluminated crescent */
        !            90:                                continue;
        !            91:                        if(I>dith[y&DITHMASK][z&DITHMASK])
        !            92:                                point(ball, Pt(y+R, -z+R), F_XOR);
        !            93:                }
        !            94: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.