Annotation of researchv9/jerq/src/lib/pot/globe.c, revision 1.1.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.