Annotation of researchv10no/cmd/ideal/inter.c, revision 1.1

1.1     ! root        1: #include "ideal.h"
        !             2: #include "y.tab.h"
        !             3: 
        !             4: boolean llinter (x1,y1, x2,y2, z1,w1, z2,w2, alpha, beta, collinear)
        !             5:        /* if this function returns TRUE,
        !             6:        /* then alpha[(x1,y1),(x2,y2)] = beta[(z1,w1),(z2,w2)] */
        !             7: float x1,y1, x2,y2, z1,w1, z2,w2;
        !             8: float *alpha;
        !             9: float *beta;
        !            10: boolean *collinear;
        !            11: {
        !            12:        float A1, B1, C1, A2, B2, C2, D, x, y;
        !            13:        dprintf "(%f,%f) -- (%f,%f)\n", x1,y1, x2,y2);
        !            14:        dprintf "(%f,%f) -- (%f,%f)\n", z1,w1, z2,w2);
        !            15:        A1 = y1 - y2;
        !            16:        B1 = x2 - x1;
        !            17:        C1 = -B1*y1 - A1*x1;
        !            18:        A2 = w1 - w2;
        !            19:        B2 = z2 - z1;
        !            20:        C2 = -B2*w1 - A2*z1;
        !            21:        D = A1*B2 - A2*B1;
        !            22:        if (fabs(D) < EPSILON) {
        !            23:                *collinear = arecollinear(x1,y1,x2,y2,z1,w1);
        !            24:                dprintf "%s\n", (*collinear)?"coincident":"disjoint");
        !            25:                return (FALSE);
        !            26:        }
        !            27:        *collinear = FALSE;
        !            28:        x = (B1*C2 - B2*C1)/D;
        !            29:        y = (A2*C1 - A1*C2)/D;
        !            30:        if (fabs(x2 - x1) > EPSILON) {
        !            31:                *alpha = (x - x1)/(x2 - x1);
        !            32:        } else if (fabs(y2 - y1) > EPSILON) {
        !            33:                *alpha = (y - y1)/(y2 - y1);
        !            34:        } else fprintf (stderr, "ideal: llinter: can't happen\n");
        !            35:        if (fabs(z2 - z1) > EPSILON) {
        !            36:                *beta = (x - z1)/(z2 - z1);
        !            37:        } else if (fabs(w2 - w1) > EPSILON) {
        !            38:                *beta = (y - w1)/(w2 - w1);
        !            39:        } else fprintf (stderr, "ideal: llinter: can't happen\n");
        !            40:        dprintf "intersection alpha = %f; beta = %f\n", *alpha, *beta);
        !            41:        return (TRUE);
        !            42: } /* llinter */
        !            43: 
        !            44: boolean lcinter (x1,y1, x2,y2, x0,y0, r, alpha1,theta1, alpha2,theta2)
        !            45:        /* if this function returns TRUE,
        !            46:        /* then alpha1[(x1,y1),(x2,y2)] = (x0,y0) + r*cis(theta1)
        !            47:        /* and alpha2[(x1,y1),(x2,y2)] = (x0,y0) + r*cis(theta2) */
        !            48: float x1,y1, x2,y2, x0,y0, r;
        !            49: float *alpha1;
        !            50: float *theta1;
        !            51: float *alpha2;
        !            52: float *theta2;
        !            53: {
        !            54:        float dx1, dx2, dy1, dy2;
        !            55:        float A, B, C, D;
        !            56: 
        !            57:        dprintf "intersection parameters:\n");
        !            58:        dprintf "%f, %f -- %f, %f\n", x1, y1, x2, y2);
        !            59:        dprintf "%f, %f (%f)\n", x0, y0, r);
        !            60:        r = fabs(r);
        !            61:        dx1 = x1 - x0;
        !            62:        dx2 = x2 - x1;
        !            63:        dy1 = y1 - y0;
        !            64:        dy2 = y2 - y1;
        !            65:        A = dx2*dx2 + dy2*dy2;
        !            66:        dprintf "A=%f\n", A);
        !            67:        if (A < EPSILON) {
        !            68:                if (fabs (hypot (dx1, dy1) - r) < EPSILON) {
        !            69:                        *alpha1 = *alpha2 = 0.0;
        !            70:                        *theta1 = atan2 (dy1, dx1);
        !            71:                        *theta2 = *theta1 = rprin (*theta1);
        !            72:                        dprintf "alpha1 = alpha2 = %f theta1 = theta2 = %f\n",
        !            73:                                *alpha1, *theta1);
        !            74:                        return (TRUE);
        !            75:                }
        !            76:                else
        !            77:                        return (FALSE);
        !            78:        }
        !            79:        B = 2*(dx1*dx2 + dy1*dy2);
        !            80:        C = dx1*dx1 + dy1*dy1 - r*r;
        !            81:        D = B*B - 4*A*C;
        !            82:        dprintf "B=%f C=%f D=%f\n", B, C, D);
        !            83:        if (D < -EPSILON)
        !            84:                return (FALSE);
        !            85:        if (fabs(D) < EPSILON)
        !            86:                D = 0.0;
        !            87:        D = sqrt(D);
        !            88:        *alpha1 = (-B + D)/(2.0*A);
        !            89:        *theta1 = rprin (atan2 (dy1 + *alpha1*dy2, dx1 + *alpha1*dx2));
        !            90:        *alpha2 = (-B - D)/(2.0*A);
        !            91:        *theta2 = rprin (atan2 (dy1 + *alpha2*dy2, dx1 + *alpha2*dx2));
        !            92:        dprintf "intersection alpha1 = %f, theta1 = %f\n", *alpha1, *theta1);
        !            93:        dprintf "intersection alpha2 = %f, theta2 = %f\n", *alpha2, *theta2);
        !            94:        return (TRUE);
        !            95: }
        !            96: 
        !            97: boolean ccinter (x0,y0,r0, x1,y1,r1, theta1,phi1, theta2,phi2)
        !            98:        /* if this function returns TRUE,
        !            99:        /* then (x0,y0) + r0*cis(theta1) = (x1,y1) + r1*cis(phi1)
        !           100:        /* and (x0,y0) + r0*cis(theta2) = (x1,y1) + r1*cis(phi2) */
        !           101: float x0,y0,r0;
        !           102: float x1,y1,r1;
        !           103: float *theta1;
        !           104: float *phi1;
        !           105: float *theta2;
        !           106: float *phi2;
        !           107: {
        !           108:        float xcoeff, ycoeff, const;
        !           109:        float u1, v1, u2, v2;
        !           110:        boolean lncrc;
        !           111: 
        !           112:        dprintf "intersection parameters\n");
        !           113:        dprintf "%f %f (%f)\n", x0, y0, r0);
        !           114:        dprintf "%f %f (%f)\n", x1, y1, r1);
        !           115: 
        !           116:        r0 = fabs(r0);
        !           117:        r1 = fabs(r1);
        !           118:        xcoeff = 2*(x1 - x0);
        !           119:        ycoeff = 2*(y1 - y0);
        !           120:        const = r0*r0 - x0*x0 - y0*y0 - r1*r1 + x1*x1 + y1*y1;
        !           121:        if (fabs(xcoeff) < EPSILON && fabs(ycoeff) < EPSILON)
        !           122:                return (FALSE);
        !           123:        if (fabs(xcoeff) < EPSILON) {
        !           124:                u1 = 0.0;
        !           125:                u2 = 1.0;
        !           126:                v1 = v2 = const/ycoeff;
        !           127:        } else if (fabs(ycoeff) < EPSILON) {
        !           128:                v1 = 0.0;
        !           129:                v2 = 1.0;
        !           130:                u1 = u2 = const/xcoeff;
        !           131:        } else if (fabs(const) < EPSILON) {
        !           132:                u1 = 0.0;
        !           133:                v1 = 0.0;
        !           134:                u2 = 1.0;
        !           135:                v2 = (const - 1.0/xcoeff)/ycoeff;
        !           136:        } else {
        !           137:                u1 = 0.0;
        !           138:                v1 = const/ycoeff;
        !           139:                u2 = const/xcoeff;
        !           140:                v2 = 0.0;
        !           141:        }
        !           142:        lncrc = lcinter (u1,v1, u2,v2, x1,y1,r1, theta1,phi1, theta2,phi2);
        !           143:        if (lncrc) {
        !           144:                *phi1 = rprin (*phi1);
        !           145:                *phi2 = rprin (*phi2);
        !           146:                *theta1 = atan2 (y1 + r1*sin(*phi1) - y0, x1 + r1*cos(*phi1) - x0);
        !           147:                *theta2 = atan2 (y1 + r1*sin(*phi2) - y0, x1 + r1*cos(*phi2) - x0);
        !           148:                *theta1 = rprin (*theta1);
        !           149:                *theta2 = rprin (*theta2);
        !           150:                dprintf "intersection theta1 = %f phi1 = %f\n", *theta1, *phi1);
        !           151:                dprintf "intersection theta2 = %f phi2 = %f\n", *theta2, *phi2);
        !           152:                return (TRUE);
        !           153:        } else
        !           154:                return (FALSE);
        !           155: }

unix.superglobalmegacorp.com

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