Annotation of researchv9/jerq/src/lib/pot/globe.c, revision 1.1

1.1     ! root        1: #include       <CC/jerq.h>
        !             2: #include       "pot.pri"
        !             3: 
        !             4: extern void circle(Bitmap *, Point, short, int);
        !             5: extern void disc(Bitmap *, Point, short, int);
        !             6: 
        !             7: #define                P_H_STRING      0x8000
        !             8: #define                P_H_VALUE       0x4000
        !             9: 
        !            10: Globepot.Globepot(Rectangle rect, short fl, short lat, short lon) : (rect, fl, lat)
        !            11: {
        !            12:        w = lon;
        !            13:        ctop();
        !            14: }
        !            15: 
        !            16: Globepot.Globepot(Rectangle rect, short fl, short lat, short lon, Point sp, char *s) : (rect, fl, lat)
        !            17: {
        !            18:        w = lon;
        !            19:        ctop();
        !            20:        flags |= P_H_STRING;
        !            21:        stroffset = sp;
        !            22:        str = s;
        !            23: }
        !            24: 
        !            25: Globepot.Globepot(Rectangle rect, short fl, short lat, short lon, Point vp) : (rect, fl, lat)
        !            26: {
        !            27:        w = lon;
        !            28:        ctop();
        !            29:        flags |= P_H_VALUE;
        !            30:        valoffset = vp;
        !            31: }
        !            32: 
        !            33: Globepot.Globepot(Rectangle rect, short fl, short lat, short lon, Point vp, Point sp, char *s) : (rect, fl, lat)
        !            34: {
        !            35:        w = lon;
        !            36:        ctop();
        !            37:        flags |= P_H_STRING|P_H_VALUE;
        !            38:        valoffset = vp;
        !            39:        stroffset = sp;
        !            40:        str = s;
        !            41: }
        !            42: 
        !            43: void
        !            44: Globepot.resize(Rectangle rect)
        !            45: {
        !            46:        r = rect;
        !            47:        calc();
        !            48:        ctop();
        !            49:        draw();
        !            50: }
        !            51: 
        !            52: void
        !            53: Globepot.calc()
        !            54: {
        !            55:        radius = min(r.c.x-r.o.x, r.c.y-r.o.y)/2;
        !            56:        offset = max(1, radius/4);
        !            57:        center = div(add(r.o, r.c), 2);
        !            58: }
        !            59: 
        !            60: #define        blob    (*(front? &disc:&circle))(&display, pt, 6, F_XOR)
        !            61: 
        !            62: void
        !            63: Globepot.draw()
        !            64: {
        !            65:        Point a, b;
        !            66:        long black = 0xFFFFFFFF, dashed = 0xF0F0F0F0;
        !            67: 
        !            68:        circle(&display, center, radius, F_OR);
        !            69:        a = add(center, Pt(0, -radius));
        !            70:        b = add(center, Pt(0, radius));
        !            71:        elarc(&display, center, offset, radius, a, b, F_OR, black);
        !            72:        elarc(&display, center, offset, radius, b, a, F_OR, dashed);
        !            73:        a = add(center, Pt(-radius, 0));
        !            74:        b = add(center, Pt(radius, 0));
        !            75:        elarc(&display, center, radius, offset, a, b, F_OR, black);
        !            76:        elarc(&display, center, radius, offset, b, a, F_OR, dashed);
        !            77:        blob;
        !            78:        if(flags&P_H_STRING) string(&defont, str, &display, r.o+stroffset, F_OR);
        !            79:        if(flags&P_H_VALUE) prvals();
        !            80: }
        !            81: 
        !            82: void
        !            83: Globepot.mod(int but)
        !            84: {
        !            85:        Point p, lp;
        !            86:        int d, outside = 0;
        !            87: 
        !            88:        while(button(but))
        !            89:        {
        !            90:                p = mouse.xy-center;
        !            91:                d = max(1, sqrt(p.x*(long)p.x + p.y*(long)p.y));
        !            92:                if(outside)
        !            93:                {
        !            94:                        if(d < radius-20)
        !            95:                                outside = 0;
        !            96:                }
        !            97:                else
        !            98:                {
        !            99:                        if(d > radius+20)
        !           100:                        {
        !           101:                                outside = 1;
        !           102:                                blob;
        !           103:                                front = !front;
        !           104:                                blob;
        !           105:                        }
        !           106:                }
        !           107:                if(d > radius)
        !           108:                {
        !           109:                        p.x = muldiv(p.x, radius, d);
        !           110:                        p.y = muldiv(p.y, radius, d);
        !           111:                }
        !           112:                p = add(p, center);
        !           113:                if(p != pt)
        !           114:                {
        !           115:                        blob;
        !           116:                        pt = p;
        !           117:                        blob;
        !           118:                        if(flags&P_H_VALUE) prvals();
        !           119:                        ptoc();
        !           120:                        if(flags&P_H_VALUE) prvals();
        !           121:                        nap(2);
        !           122:                }
        !           123:        }
        !           124:        outside = 0;
        !           125: }
        !           126: 
        !           127: void
        !           128: Globepot.setval(short lat, short lon)
        !           129: {
        !           130:        blob;
        !           131:        if(flags&P_H_VALUE) prvals();
        !           132:        val = lat;
        !           133:        w = lon;
        !           134:        ctop();
        !           135:        if(flags&P_H_VALUE) prvals();
        !           136:        blob;
        !           137: }
        !           138: 
        !           139: #define                FUDGE           12
        !           140: 
        !           141: void
        !           142: Globepot.ptoc()
        !           143: {
        !           144:        Point p = sub(pt, center);
        !           145:        int q, sx, sy, fudge;
        !           146: 
        !           147:        q = sx = sqrt(radius*(long)radius - p.x*(long)p.x);
        !           148:        sy = sqrt(radius*(long)radius - p.y*(long)p.y);
        !           149:        fudge = muldiv(FUDGE, sy, radius);
        !           150:        if(front == 0) q = -q;
        !           151:        w = (450 - atan2(p.x, q) + fudge)%360;
        !           152:        fudge = muldiv(FUDGE, sx, radius);
        !           153:        val = atan2(sy, p.y);
        !           154:        val = (val > 90)? (360-val):-val;
        !           155:        if(front)
        !           156:                if(val+fudge > 90)
        !           157:                        val = 180-val-fudge;
        !           158:                else
        !           159:                        val += fudge;
        !           160:        else
        !           161:                if(val-fudge < -90)
        !           162:                        val = -180-val+fudge;
        !           163:                else
        !           164:                        val -= fudge;
        !           165: }
        !           166: 
        !           167: void
        !           168: Globepot.ctop()
        !           169: {
        !           170:        Point p;
        !           171:        int a, h, fudge;
        !           172: 
        !           173:        front = (w <= 90+FUDGE) || (w > 270+FUDGE);
        !           174:        calc();
        !           175:        fudge = FUDGE/2;
        !           176:        if(front)
        !           177:                if(val-fudge < -90)
        !           178:                        a = -180-val+fudge;
        !           179:                else
        !           180:                        a = val-fudge;
        !           181:        else
        !           182:                if(val+fudge > 90)
        !           183:                        a = 180-val-fudge;
        !           184:                else
        !           185:                        a = val+fudge;
        !           186:        a = (a < 0)? -a:(360-a);
        !           187:        p.y = muldiv(sin(a), radius, 1024);
        !           188:        h = muldiv(radius, cos(a), 1024);
        !           189:        p.x = muldiv(cos((450-w+fudge)%360), h, 1024);
        !           190: 
        !           191: #define        delta(z, rad)   muldiv(FUDGE, sqrt(rad*(long)rad-z*(long)z), rad)
        !           192: 
        !           193:        p.x -= delta(p.y, radius);
        !           194:        p.y -= delta(p.x, h);
        !           195:        pt = add(center, p);
        !           196: }
        !           197: 
        !           198: void
        !           199: Globepot.prvals()
        !           200: {
        !           201:        char buf[128];
        !           202: 
        !           203:        sprintf(buf, "lat=%d long=%d", val, w);
        !           204:        string(&defont, buf, &display, add(r.o, valoffset), F_XOR);
        !           205: }

unix.superglobalmegacorp.com

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