PROCEDURE DeCasteljau3(READONLY c: ControlValues; READONLY a: LR3.T): LONGREAL = BEGIN <* ASSERT NUMBER(c) = 10 *> WITH a0 = a[0], a1 = a[1], a2 = a[2], c300 = c[0], c210 = c[1], c201 = c[2], c120 = c[3], c111 = c[4], c102 = c[5], c030 = c[6], c021 = c[7], c012 = c[8], c003 = c[9], c200 = a0 * c300 + a1 * c210 + a2 * c201, c110 = a0 * c210 + a1 * c120 + a2 * c111, c101 = a0 * c201 + a1 * c111 + a2 * c102, c020 = a0 * c120 + a1 * c030 + a2 * c021, c011 = a0 * c111 + a1 * c021 + a2 * c012, c002 = a0 * c102 + a1 * c012 + a2 * c003, c100 = a0 * c200 + a1 * c110 + a2 * c101, c010 = a0 * c110 + a1 * c020 + a2 * c011, c001 = a0 * c101 + a1 * c011 + a2 * c002, c000 = a0 * c100 + a1 * c010 + a2 * c001 DO RETURN c000 END END DeCasteljau3; PROCEDURE DeCasteljau4(READONLY c: ControlValues; READONLY a: LR3.T): LONGREAL = BEGIN <* ASSERT NUMBER(c) = 15 *> WITH a0 = a[0], a1 = a[1], a2 = a[2], c400 = c[00], c310 = c[01], c301 = c[02], c220 = c[03], c211 = c[04], c202 = c[05], c130 = c[06], c121 = c[07], c112 = c[08], c103 = c[09], c040 = c[10], c031 = c[11], c022 = c[12], c013 = c[13], c004 = c[14], c300 = a0 * c400 + a1 * c310 + a2 * c301, c210 = a0 * c310 + a1 * c220 + a2 * c211, c201 = a0 * c301 + a1 * c211 + a2 * c202, c120 = a0 * c220 + a1 * c130 + a2 * c121, c111 = a0 * c211 + a1 * c121 + a2 * c112, c102 = a0 * c202 + a1 * c112 + a2 * c103, c030 = a0 * c130 + a1 * c040 + a2 * c031, c021 = a0 * c121 + a1 * c031 + a2 * c022, c012 = a0 * c112 + a1 * c022 + a2 * c013, c003 = a0 * c103 + a1 * c013 + a2 * c004, c200 = a0 * c300 + a1 * c210 + a2 * c201, c110 = a0 * c210 + a1 * c120 + a2 * c111, c101 = a0 * c201 + a1 * c111 + a2 * c102, c020 = a0 * c120 + a1 * c030 + a2 * c021, c011 = a0 * c111 + a1 * c021 + a2 * c012, c002 = a0 * c102 + a1 * c012 + a2 * c003, c100 = a0 * c200 + a1 * c110 + a2 * c101, c010 = a0 * c110 + a1 * c020 + a2 * c011, c001 = a0 * c101 + a1 * c011 + a2 * c002, c000 = a0 * c100 + a1 * c010 + a2 * c001 DO RETURN c000 END END DeCasteljau4; PROCEDURE DeCasteljau5(READONLY c: ControlValues; READONLY a: LR3.T): LONGREAL = BEGIN <* ASSERT NUMBER(c) = 21 *> WITH a0 = a[0], a1 = a[1], a2 = a[2], c500 = c[00], c410 = c[01], c401 = c[02], c320 = c[03], c311 = c[04], c302 = c[05], c230 = c[06], c221 = c[07], c212 = c[08], c203 = c[09], c140 = c[10], c131 = c[11], c122 = c[12], c113 = c[13], c104 = c[14], c050 = c[15], c041 = c[16], c032 = c[17], c023 = c[18], c014 = c[19], c005 = c[20], c400 = a0 * c500 + a1 * c410 + a2 * c401, c310 = a0 * c410 + a1 * c320 + a2 * c311, c301 = a0 * c401 + a1 * c311 + a2 * c302, c220 = a0 * c320 + a1 * c230 + a2 * c221, c211 = a0 * c311 + a1 * c221 + a2 * c212, c202 = a0 * c302 + a1 * c212 + a2 * c203, c112 = a0 * c212 + a1 * c122 + a2 * c113, c121 = a0 * c221 + a1 * c131 + a2 * c122, c103 = a0 * c203 + a1 * c113 + a2 * c104, c130 = a0 * c230 + a1 * c140 + a2 * c131, c022 = a0 * c122 + a1 * c032 + a2 * c023, c013 = a0 * c113 + a1 * c023 + a2 * c014, c031 = a0 * c131 + a1 * c041 + a2 * c032, c040 = a0 * c140 + a1 * c050 + a2 * c041, c004 = a0 * c104 + a1 * c014 + a2 * c005, c300 = a0 * c400 + a1 * c310 + a2 * c301, c210 = a0 * c310 + a1 * c220 + a2 * c211, c201 = a0 * c301 + a1 * c211 + a2 * c202, c120 = a0 * c220 + a1 * c130 + a2 * c121, c111 = a0 * c211 + a1 * c121 + a2 * c112, c102 = a0 * c202 + a1 * c112 + a2 * c103, c030 = a0 * c130 + a1 * c040 + a2 * c031, c021 = a0 * c121 + a1 * c031 + a2 * c022, c012 = a0 * c112 + a1 * c022 + a2 * c013, c003 = a0 * c103 + a1 * c013 + a2 * c004, c200 = a0 * c300 + a1 * c210 + a2 * c201, c110 = a0 * c210 + a1 * c120 + a2 * c111, c101 = a0 * c201 + a1 * c111 + a2 * c102, c020 = a0 * c120 + a1 * c030 + a2 * c021, c011 = a0 * c111 + a1 * c021 + a2 * c012, c002 = a0 * c102 + a1 * c012 + a2 * c003, c100 = a0 * c200 + a1 * c110 + a2 * c101, c010 = a0 * c110 + a1 * c020 + a2 * c011, c001 = a0 * c101 + a1 * c011 + a2 * c002, c000 = a0 * c100 + a1 * c010 + a2 * c001 DO RETURN c000 END END DeCasteljau5; PROCEDURE DeCasteljau6(READONLY c: ControlValues; READONLY a: LR3.T): LONGREAL = BEGIN <* ASSERT NUMBER(c) = 28 *> WITH a0 = a[0], a1 = a[1], a2 = a[2], c600 = c[00], c510 = c[01], c501 = c[02], c420 = c[03], c411 = c[04], c402 = c[05], c330 = c[06], c321 = c[07], c312 = c[08], c303 = c[09], c240 = c[10], c231 = c[11], c222 = c[12], c213 = c[13], c204 = c[14], c150 = c[15], c141 = c[16], c132 = c[17], c123 = c[18], c114 = c[19], c105 = c[20], c060 = c[21], c051 = c[22], c042 = c[23], c033 = c[24], c024 = c[25], c015 = c[26], c006 = c[27], c500 = a0 * c600 + a1 * c510 + a2 * c501, c401 = a0 * c501 + a1 * c411 + a2 * c402, c410 = a0 * c510 + a1 * c420 + a2 * c411, c302 = a0 * c402 + a1 * c312 + a2 * c303, c311 = a0 * c411 + a1 * c321 + a2 * c312, c320 = a0 * c420 + a1 * c330 + a2 * c321, c203 = a0 * c303 + a1 * c213 + a2 * c204, c230 = a0 * c330 + a1 * c240 + a2 * c231, c212 = a0 * c312 + a1 * c222 + a2 * c213, c221 = a0 * c321 + a1 * c231 + a2 * c222, c104 = a0 * c204 + a1 * c114 + a2 * c105, c140 = a0 * c240 + a1 * c150 + a2 * c141, c113 = a0 * c213 + a1 * c123 + a2 * c114, c131 = a0 * c231 + a1 * c141 + a2 * c132, c122 = a0 * c222 + a1 * c132 + a2 * c123, c005 = a0 * c105 + a1 * c015 + a2 * c006, c050 = a0 * c150 + a1 * c060 + a2 * c051, c014 = a0 * c114 + a1 * c024 + a2 * c015, c041 = a0 * c141 + a1 * c051 + a2 * c042, c023 = a0 * c123 + a1 * c033 + a2 * c024, c032 = a0 * c132 + a1 * c042 + a2 * c033, c400 = a0 * c500 + a1 * c410 + a2 * c401, c310 = a0 * c410 + a1 * c320 + a2 * c311, c301 = a0 * c401 + a1 * c311 + a2 * c302, c220 = a0 * c320 + a1 * c230 + a2 * c221, c211 = a0 * c311 + a1 * c221 + a2 * c212, c202 = a0 * c302 + a1 * c212 + a2 * c203, c112 = a0 * c212 + a1 * c122 + a2 * c113, c121 = a0 * c221 + a1 * c131 + a2 * c122, c103 = a0 * c203 + a1 * c113 + a2 * c104, c130 = a0 * c230 + a1 * c140 + a2 * c131, c022 = a0 * c122 + a1 * c032 + a2 * c023, c013 = a0 * c113 + a1 * c023 + a2 * c014, c031 = a0 * c131 + a1 * c041 + a2 * c032, c040 = a0 * c140 + a1 * c050 + a2 * c041, c004 = a0 * c104 + a1 * c014 + a2 * c005, c300 = a0 * c400 + a1 * c310 + a2 * c301, c210 = a0 * c310 + a1 * c220 + a2 * c211, c201 = a0 * c301 + a1 * c211 + a2 * c202, c120 = a0 * c220 + a1 * c130 + a2 * c121, c111 = a0 * c211 + a1 * c121 + a2 * c112, c102 = a0 * c202 + a1 * c112 + a2 * c103, c030 = a0 * c130 + a1 * c040 + a2 * c031, c021 = a0 * c121 + a1 * c031 + a2 * c022, c012 = a0 * c112 + a1 * c022 + a2 * c013, c003 = a0 * c103 + a1 * c013 + a2 * c004, c200 = a0 * c300 + a1 * c210 + a2 * c201, c110 = a0 * c210 + a1 * c120 + a2 * c111, c101 = a0 * c201 + a1 * c111 + a2 * c102, c020 = a0 * c120 + a1 * c030 + a2 * c021, c011 = a0 * c111 + a1 * c021 + a2 * c012, c002 = a0 * c102 + a1 * c012 + a2 * c003, c100 = a0 * c200 + a1 * c110 + a2 * c101, c010 = a0 * c110 + a1 * c020 + a2 * c011, c001 = a0 * c101 + a1 * c011 + a2 * c002, c000 = a0 * c100 + a1 * c010 + a2 * c001 DO RETURN c000 END END DeCasteljau6; PROCEDURE DeCasteljauGrad3(READONLY c: ControlValues; READONLY a: LR3.T): LR3.T = BEGIN <* ASSERT NUMBER(c) = 10 *> WITH a0 = a[0], a1 = a[1], a2 = a[2], c300 = c[0], c210 = c[1], c201 = c[2], c120 = c[3], c111 = c[4], c102 = c[5], c030 = c[6], c021 = c[7], c012 = c[8], c003 = c[9], (* dXYZdK is the derivative of cXYZ with repspect to a[K]. *) (* Layer 2 *) c200 = a0 * c300 + a1 * c210 + a2 * c201, d200d0 = c300, d200d1 = c210, d200d2 = c201, c110 = a0 * c210 + a1 * c120 + a2 * c111, d110d0 = c210, d110d1 = c120, d110d2 = c111, c101 = a0 * c201 + a1 * c111 + a2 * c102, d101d0 = c201, d101d1 = c111, d101d2 = c102, c020 = a0 * c120 + a1 * c030 + a2 * c021, d020d0 = c120, d020d1 = c030, d020d2 = c021, c011 = a0 * c111 + a1 * c021 + a2 * c012, d011d0 = c111, d011d1 = c021, d011d2 = c012, c002 = a0 * c102 + a1 * c012 + a2 * c003, d002d0 = c102, d002d1 = c012, d002d2 = c003, (* Layer 1 *) c100 = a0 * c200 + a1 * c110 + a2 * c101, d100d0 = c200 + a0*d200d0 + a1*d110d0 + a2*d101d0, d100d1 = c110 + a0*d200d1 + a1*d110d1 + a2*d101d1, d100d2 = c101 + a0*d200d2 + a1*d110d2 + a2*d101d2, c010 = a0 * c110 + a1 * c020 + a2 * c011, d010d0 = c110 + a0*d110d0 + a1*d020d0 + a2*d011d0, d010d1 = c020 + a0*d110d1 + a1*d020d1 + a2*d011d1, d010d2 = c011 + a0*d110d2 + a1*d020d2 + a2*d011d2, c001 = a0 * c101 + a1 * c011 + a2 * c002, d001d0 = c101 + a0*d101d0 + a1*d011d0 + a2*d002d0, d001d1 = c011 + a0*d101d1 + a1*d011d1 + a2*d002d1, d001d2 = c002 + a0*d101d2 + a1*d011d2 + a2*d002d2, (* Layer 0 *) (* c000 = a0 * c100 + a1 * c010 + a2 * c001,*) d000d0 = c100 + a0*d100d0 + a1*d010d0 + a2*d001d0, d000d1 = c010 + a0*d100d1 + a1*d010d1 + a2*d001d1, d000d2 = c001 + a0*d100d2 + a1*d010d2 + a2*d001d2 DO RETURN LR3.T{d000d0, d000d1, d000d2} END END DeCasteljauGrad3; PROCEDURE DeCasteljauGrad4(READONLY c: ControlValues; READONLY a: LR3.T): LR3.T = BEGIN <* ASSERT NUMBER(c) = 15 *> WITH a0 = a[0], a1 = a[1], a2 = a[2], c400 = c[00], c310 = c[01], c301 = c[02], c220 = c[03], c211 = c[04], c202 = c[05], c130 = c[06], c121 = c[07], c112 = c[08], c103 = c[09], c040 = c[10], c031 = c[11], c022 = c[12], c013 = c[13], c004 = c[14], (* dXYZdK is the derivative of cXYZ with repspect to a[K]. *) (* Layer 3 *) c300 = a0 * c400 + a1 * c310 + a2 * c301, d300d0 = c400, d300d1 = c310, d300d2 = c301, c210 = a0 * c310 + a1 * c220 + a2 * c211, d210d0 = c310, d210d1 = c220, d210d2 = c211, c201 = a0 * c301 + a1 * c211 + a2 * c202, d201d0 = c301, d201d1 = c211, d201d2 = c202, c120 = a0 * c220 + a1 * c130 + a2 * c121, d120d0 = c220, d120d1 = c130, d120d2 = c121, c111 = a0 * c211 + a1 * c121 + a2 * c112, d111d0 = c211, d111d1 = c121, d111d2 = c112, c102 = a0 * c202 + a1 * c112 + a2 * c103, d102d0 = c202, d102d1 = c112, d102d2 = c103, c030 = a0 * c130 + a1 * c040 + a2 * c031, d030d0 = c130, d030d1 = c040, d030d2 = c031, c021 = a0 * c121 + a1 * c031 + a2 * c022, d021d0 = c121, d021d1 = c031, d021d2 = c022, c012 = a0 * c112 + a1 * c022 + a2 * c013, d012d0 = c112, d012d1 = c022, d012d2 = c013, c003 = a0 * c103 + a1 * c013 + a2 * c004, d003d0 = c103, d003d1 = c013, d003d2 = c004, (* Layer 2 *) c200 = a0 * c300 + a1 * c210 + a2 * c201, d200d0 = c300 + a0*d300d0 + a1*d210d0 + a2*d201d0, d200d1 = c210 + a0*d300d1 + a1*d210d1 + a2*d201d1, d200d2 = c201 + a0*d300d2 + a1*d210d2 + a2*d201d2, c110 = a0 * c210 + a1 * c120 + a2 * c111, d110d0 = c210 + a0*d210d0 + a1*d120d0 + a2*d111d0, d110d1 = c120 + a0*d210d1 + a1*d120d1 + a2*d111d1, d110d2 = c111 + a0*d210d2 + a1*d120d2 + a2*d111d2, c101 = a0 * c201 + a1 * c111 + a2 * c102, d101d0 = c201 + a0*d201d0 + a1*d111d0 + a2*d102d0, d101d1 = c111 + a0*d201d1 + a1*d111d1 + a2*d102d1, d101d2 = c102 + a0*d201d2 + a1*d111d2 + a2*d102d2, c020 = a0 * c120 + a1 * c030 + a2 * c021, d020d0 = c120 + a0*d120d0 + a1*d030d0 + a2*d021d0, d020d1 = c030 + a0*d120d1 + a1*d030d1 + a2*d021d1, d020d2 = c021 + a0*d120d2 + a1*d030d2 + a2*d021d2, c011 = a0 * c111 + a1 * c021 + a2 * c012, d011d0 = c111 + a0*d111d0 + a1*d021d0 + a2*d012d0, d011d1 = c021 + a0*d111d1 + a1*d021d1 + a2*d012d1, d011d2 = c012 + a0*d111d2 + a1*d021d2 + a2*d012d2, c002 = a0 * c102 + a1 * c012 + a2 * c003, d002d0 = c102 + a0*d102d0 + a1*d012d0 + a2*d003d0, d002d1 = c012 + a0*d102d1 + a1*d012d1 + a2*d003d1, d002d2 = c003 + a0*d102d2 + a1*d012d2 + a2*d003d2, (* Layer 1 *) c100 = a0 * c200 + a1 * c110 + a2 * c101, d100d0 = c200 + a0*d200d0 + a1*d110d0 + a2*d101d0, d100d1 = c110 + a0*d200d1 + a1*d110d1 + a2*d101d1, d100d2 = c101 + a0*d200d2 + a1*d110d2 + a2*d101d2, c010 = a0 * c110 + a1 * c020 + a2 * c011, d010d0 = c110 + a0*d110d0 + a1*d020d0 + a2*d011d0, d010d1 = c020 + a0*d110d1 + a1*d020d1 + a2*d011d1, d010d2 = c011 + a0*d110d2 + a1*d020d2 + a2*d011d2, c001 = a0 * c101 + a1 * c011 + a2 * c002, d001d0 = c101 + a0*d101d0 + a1*d011d0 + a2*d002d0, d001d1 = c011 + a0*d101d1 + a1*d011d1 + a2*d002d1, d001d2 = c002 + a0*d101d2 + a1*d011d2 + a2*d002d2, (* Layer 0 *) (* c000 = a0 * c100 + a1 * c010 + a2 * c001,*) d000d0 = c100 + a0*d100d0 + a1*d010d0 + a2*d001d0, d000d1 = c010 + a0*d100d1 + a1*d010d1 + a2*d001d1, d000d2 = c001 + a0*d100d2 + a1*d010d2 + a2*d001d2 DO RETURN LR3.T{d000d0, d000d1, d000d2} END END DeCasteljauGrad4; PROCEDURE DeCasteljauGrad5(READONLY c: ControlValues; READONLY a: LR3.T): LR3.T = BEGIN <* ASSERT NUMBER(c) = 21 *> WITH a0 = a[0], a1 = a[1], a2 = a[2], c500 = c[00], c410 = c[01], c401 = c[02], c320 = c[03], c311 = c[04], c302 = c[05], c230 = c[06], c221 = c[07], c212 = c[08], c203 = c[09], c140 = c[10], c131 = c[11], c122 = c[12], c113 = c[13], c104 = c[14], c050 = c[15], c041 = c[16], c032 = c[17], c023 = c[18], c014 = c[19], c005 = c[20], (* dXYZdK is the derivative of cXYZ with repspect to a[K]. *) (* Layer 4 *) c400 = a0 * c500 + a1 * c410 + a2 * c401, d400d0 = c500, d400d1 = c410, d400d2 = c401, c310 = a0 * c410 + a1 * c320 + a2 * c311, d310d0 = c410, d310d1 = c320, d310d2 = c311, c301 = a0 * c401 + a1 * c311 + a2 * c302, d301d0 = c401, d301d1 = c311, d301d2 = c302, c220 = a0 * c320 + a1 * c230 + a2 * c221, d220d0 = c320, d220d1 = c230, d220d2 = c221, c211 = a0 * c311 + a1 * c221 + a2 * c212, d211d0 = c311, d211d1 = c221, d211d2 = c212, c202 = a0 * c302 + a1 * c212 + a2 * c203, d202d0 = c302, d202d1 = c212, d202d2 = c203, c112 = a0 * c212 + a1 * c122 + a2 * c113, d112d0 = c212, d112d1 = c122, d112d2 = c113, c121 = a0 * c221 + a1 * c131 + a2 * c122, d121d0 = c221, d121d1 = c131, d121d2 = c122, c103 = a0 * c203 + a1 * c113 + a2 * c104, d103d0 = c203, d103d1 = c113, d103d2 = c104, c130 = a0 * c230 + a1 * c140 + a2 * c131, d130d0 = c230, d130d1 = c140, d130d2 = c131, c022 = a0 * c122 + a1 * c032 + a2 * c023, d022d0 = c122, d022d1 = c032, d022d2 = c023, c013 = a0 * c113 + a1 * c023 + a2 * c014, d013d0 = c113, d013d1 = c023, d013d2 = c014, c031 = a0 * c131 + a1 * c041 + a2 * c032, d031d0 = c131, d031d1 = c041, d031d2 = c032, c040 = a0 * c140 + a1 * c050 + a2 * c041, d040d0 = c140, d040d1 = c050, d040d2 = c041, c004 = a0 * c104 + a1 * c014 + a2 * c005, d004d0 = c104, d004d1 = c014, d004d2 = c005, (* Layer 3 *) c300 = a0 * c400 + a1 * c310 + a2 * c301, d300d0 = c400 + a0*d400d0 + a1*d310d0 + a2*d301d0, d300d1 = c310 + a0*d400d1 + a1*d310d1 + a2*d301d1, d300d2 = c301 + a0*d400d2 + a1*d310d2 + a2*d301d2, c210 = a0 * c310 + a1 * c220 + a2 * c211, d210d0 = c310 + a0*d310d0 + a1*d220d0 + a2*d211d0, d210d1 = c220 + a0*d310d1 + a1*d220d1 + a2*d211d1, d210d2 = c211 + a0*d310d2 + a1*d220d2 + a2*d211d2, c201 = a0 * c301 + a1 * c211 + a2 * c202, d201d0 = c301 + a0*d301d0 + a1*d211d0 + a2*d202d0, d201d1 = c211 + a0*d301d1 + a1*d211d1 + a2*d202d1, d201d2 = c202 + a0*d301d2 + a1*d211d2 + a2*d202d2, c120 = a0 * c220 + a1 * c130 + a2 * c121, d120d0 = c220 + a0*d220d0 + a1*d130d0 + a2*d121d0, d120d1 = c130 + a0*d220d1 + a1*d130d1 + a2*d121d1, d120d2 = c121 + a0*d220d2 + a1*d130d2 + a2*d121d2, c111 = a0 * c211 + a1 * c121 + a2 * c112, d111d0 = c211 + a0*d211d0 + a1*d121d0 + a2*d112d0, d111d1 = c121 + a0*d211d1 + a1*d121d1 + a2*d112d1, d111d2 = c112 + a0*d211d2 + a1*d121d2 + a2*d112d2, c102 = a0 * c202 + a1 * c112 + a2 * c103, d102d0 = c202 + a0*d202d0 + a1*d112d0 + a2*d103d0, d102d1 = c112 + a0*d202d1 + a1*d112d1 + a2*d103d1, d102d2 = c103 + a0*d202d2 + a1*d112d2 + a2*d103d2, c030 = a0 * c130 + a1 * c040 + a2 * c031, d030d0 = c130 + a0*d130d0 + a1*d040d0 + a2*d031d0, d030d1 = c040 + a0*d130d1 + a1*d040d1 + a2*d031d1, d030d2 = c031 + a0*d130d2 + a1*d040d2 + a2*d031d2, c021 = a0 * c121 + a1 * c031 + a2 * c022, d021d0 = c121 + a0*d121d0 + a1*d031d0 + a2*d022d0, d021d1 = c031 + a0*d121d1 + a1*d031d1 + a2*d022d1, d021d2 = c022 + a0*d121d2 + a1*d031d2 + a2*d022d2, c012 = a0 * c112 + a1 * c022 + a2 * c013, d012d0 = c112 + a0*d112d0 + a1*d022d0 + a2*d013d0, d012d1 = c022 + a0*d112d1 + a1*d022d1 + a2*d013d1, d012d2 = c013 + a0*d112d2 + a1*d022d2 + a2*d013d2, c003 = a0 * c103 + a1 * c013 + a2 * c004, d003d0 = c103 + a0*d103d0 + a1*d013d0 + a2*d004d0, d003d1 = c013 + a0*d103d1 + a1*d013d1 + a2*d004d1, d003d2 = c004 + a0*d103d2 + a1*d013d2 + a2*d004d2, (* Layer 2 *) c200 = a0 * c300 + a1 * c210 + a2 * c201, d200d0 = c300 + a0*d300d0 + a1*d210d0 + a2*d201d0, d200d1 = c210 + a0*d300d1 + a1*d210d1 + a2*d201d1, d200d2 = c201 + a0*d300d2 + a1*d210d2 + a2*d201d2, c110 = a0 * c210 + a1 * c120 + a2 * c111, d110d0 = c210 + a0*d210d0 + a1*d120d0 + a2*d111d0, d110d1 = c120 + a0*d210d1 + a1*d120d1 + a2*d111d1, d110d2 = c111 + a0*d210d2 + a1*d120d2 + a2*d111d2, c101 = a0 * c201 + a1 * c111 + a2 * c102, d101d0 = c201 + a0*d201d0 + a1*d111d0 + a2*d102d0, d101d1 = c111 + a0*d201d1 + a1*d111d1 + a2*d102d1, d101d2 = c102 + a0*d201d2 + a1*d111d2 + a2*d102d2, c020 = a0 * c120 + a1 * c030 + a2 * c021, d020d0 = c120 + a0*d120d0 + a1*d030d0 + a2*d021d0, d020d1 = c030 + a0*d120d1 + a1*d030d1 + a2*d021d1, d020d2 = c021 + a0*d120d2 + a1*d030d2 + a2*d021d2, c011 = a0 * c111 + a1 * c021 + a2 * c012, d011d0 = c111 + a0*d111d0 + a1*d021d0 + a2*d012d0, d011d1 = c021 + a0*d111d1 + a1*d021d1 + a2*d012d1, d011d2 = c012 + a0*d111d2 + a1*d021d2 + a2*d012d2, c002 = a0 * c102 + a1 * c012 + a2 * c003, d002d0 = c102 + a0*d102d0 + a1*d012d0 + a2*d003d0, d002d1 = c012 + a0*d102d1 + a1*d012d1 + a2*d003d1, d002d2 = c003 + a0*d102d2 + a1*d012d2 + a2*d003d2, (* Layer 1 *) c100 = a0 * c200 + a1 * c110 + a2 * c101, d100d0 = c200 + a0*d200d0 + a1*d110d0 + a2*d101d0, d100d1 = c110 + a0*d200d1 + a1*d110d1 + a2*d101d1, d100d2 = c101 + a0*d200d2 + a1*d110d2 + a2*d101d2, c010 = a0 * c110 + a1 * c020 + a2 * c011, d010d0 = c110 + a0*d110d0 + a1*d020d0 + a2*d011d0, d010d1 = c020 + a0*d110d1 + a1*d020d1 + a2*d011d1, d010d2 = c011 + a0*d110d2 + a1*d020d2 + a2*d011d2, c001 = a0 * c101 + a1 * c011 + a2 * c002, d001d0 = c101 + a0*d101d0 + a1*d011d0 + a2*d002d0, d001d1 = c011 + a0*d101d1 + a1*d011d1 + a2*d002d1, d001d2 = c002 + a0*d101d2 + a1*d011d2 + a2*d002d2, (* Layer 0 *) (* c000 = a0 * c100 + a1 * c010 + a2 * c001,*) d000d0 = c100 + a0*d100d0 + a1*d010d0 + a2*d001d0, d000d1 = c010 + a0*d100d1 + a1*d010d1 + a2*d001d1, d000d2 = c001 + a0*d100d2 + a1*d010d2 + a2*d001d2 DO RETURN LR3.T{d000d0, d000d1, d000d2} END END DeCasteljauGrad5; PROCEDURE DeCasteljauGrad6(READONLY c: ControlValues; READONLY a: LR3.T): LR3.T = BEGIN <* ASSERT NUMBER(c) = 28 *> WITH a0 = a[0], a1 = a[1], a2 = a[2], c600 = c[00], c510 = c[01], c501 = c[02], c420 = c[03], c411 = c[04], c402 = c[05], c330 = c[06], c321 = c[07], c312 = c[08], c303 = c[09], c240 = c[10], c231 = c[11], c222 = c[12], c213 = c[13], c204 = c[14], c150 = c[15], c141 = c[16], c132 = c[17], c123 = c[18], c114 = c[19], c105 = c[20], c060 = c[21], c051 = c[22], c042 = c[23], c033 = c[24], c024 = c[25], c015 = c[26], c006 = c[27], (* dXYZdK is the derivative of cXYZ with repspect to a[K]. *) (* Layer 5 *) c500 = a0 * c600 + a1 * c510 + a2 * c501, d500d0 = c600, d500d1 = c510, d500d2 = c501, c401 = a0 * c501 + a1 * c411 + a2 * c402, d401d0 = c501, d401d1 = c411, d401d2 = c501, c410 = a0 * c510 + a1 * c420 + a2 * c411, d410d0 = c510, d410d1 = c420, d410d2 = c411, c302 = a0 * c402 + a1 * c312 + a2 * c303, d302d0 = c402, d302d1 = c312, d302d2 = c303, c311 = a0 * c411 + a1 * c321 + a2 * c312, d311d0 = c411, d311d1 = c321, d311d2 = c312, c320 = a0 * c420 + a1 * c330 + a2 * c321, d320d0 = c420, d320d1 = c330, d320d2 = c321, c203 = a0 * c303 + a1 * c213 + a2 * c204, d203d0 = c303, d203d1 = c213, d203d2 = c204, c230 = a0 * c330 + a1 * c240 + a2 * c231, d230d0 = c330, d230d1 = c240, d230d2 = c231, c212 = a0 * c312 + a1 * c222 + a2 * c213, d212d0 = c312, d212d1 = c222, d212d2 = c213, c221 = a0 * c321 + a1 * c231 + a2 * c222, d221d0 = c321, d221d1 = c231, d221d2 = c222, c104 = a0 * c204 + a1 * c114 + a2 * c105, d104d0 = c204, d104d1 = c114, d104d2 = c105, c140 = a0 * c240 + a1 * c150 + a2 * c141, d140d0 = c240, d140d1 = c150, d140d2 = c141, c113 = a0 * c213 + a1 * c123 + a2 * c114, d113d0 = c213, d113d1 = c123, d113d2 = c114, c131 = a0 * c231 + a1 * c141 + a2 * c132, d131d0 = c231, d131d1 = c141, d131d2 = c132, c122 = a0 * c222 + a1 * c132 + a2 * c123, d122d0 = c222, d122d1 = c132, d122d2 = c123, c005 = a0 * c105 + a1 * c015 + a2 * c006, d005d0 = c105, d005d1 = c015, d005d2 = c006, c050 = a0 * c150 + a1 * c060 + a2 * c051, d050d0 = c150, d050d1 = c060, d050d2 = c051, c014 = a0 * c114 + a1 * c024 + a2 * c015, d014d0 = c114, d014d1 = c024, d014d2 = c015, c041 = a0 * c141 + a1 * c051 + a2 * c042, d041d0 = c141, d041d1 = c051, d041d2 = c042, c023 = a0 * c123 + a1 * c033 + a2 * c024, d023d0 = c123, d023d1 = c033, d023d2 = c024, c032 = a0 * c132 + a1 * c042 + a2 * c033, d032d0 = c132, d032d1 = c042, d032d2 = c033, (* Layer 4 *) c400 = a0 * c500 + a1 * c410 + a2 * c401, d400d0 = c500 + a0*d500d0 + a1*d410d0 + a2*d401d0, d400d1 = c410 + a0*d500d1 + a1*d410d1 + a2*d401d1, d400d2 = c401 + a0*d500d2 + a1*d410d2 + a2*d401d2, c310 = a0 * c410 + a1 * c320 + a2 * c311, d310d0 = c410 + a0*d410d0 + a1*d320d0 + a2*d311d0, d310d1 = c320 + a0*d410d1 + a1*d320d1 + a2*d311d1, d310d2 = c311 + a0*d410d2 + a1*d320d2 + a2*d311d2, c301 = a0 * c401 + a1 * c311 + a2 * c302, d301d0 = c401 + a0*d401d0 + a1*d311d0 + a2*d302d0, d301d1 = c311 + a0*d401d1 + a1*d311d1 + a2*d302d1, d301d2 = c302 + a0*d401d2 + a1*d311d2 + a2*d302d2, c220 = a0 * c320 + a1 * c230 + a2 * c221, d220d0 = c320 + a0*d320d0 + a1*d230d0 + a2*d221d0, d220d1 = c230 + a0*d320d1 + a1*d230d1 + a2*d221d1, d220d2 = c221 + a0*d320d2 + a1*d230d2 + a2*d221d2, c211 = a0 * c311 + a1 * c221 + a2 * c212, d211d0 = c311 + a0*d311d0 + a1*d221d0 + a2*d212d0, d211d1 = c221 + a0*d311d1 + a1*d221d1 + a2*d212d1, d211d2 = c212 + a0*d311d2 + a1*d221d2 + a2*d212d2, c202 = a0 * c302 + a1 * c212 + a2 * c203, d202d0 = c302 + a0*d302d0 + a1*d212d0 + a2*d203d0, d202d1 = c212 + a0*d302d1 + a1*d212d1 + a2*d203d1, d202d2 = c203 + a0*d302d2 + a1*d212d2 + a2*d203d2, c112 = a0 * c212 + a1 * c122 + a2 * c113, d112d0 = c212 + a0*d212d0 + a1*d122d0 + a2*d113d0, d112d1 = c122 + a0*d212d1 + a1*d122d1 + a2*d113d1, d112d2 = c113 + a0*d212d2 + a1*d122d2 + a2*d113d2, c121 = a0 * c221 + a1 * c131 + a2 * c122, d121d0 = c221 + a0*d221d0 + a1*d131d0 + a2*d122d0, d121d1 = c131 + a0*d221d1 + a1*d131d1 + a2*d122d1, d121d2 = c122 + a0*d221d2 + a1*d131d2 + a2*d122d2, c103 = a0 * c203 + a1 * c113 + a2 * c104, d103d0 = c203 + a0*d203d0 + a1*d113d0 + a2*d104d0, d103d1 = c113 + a0*d203d1 + a1*d113d1 + a2*d104d1, d103d2 = c104 + a0*d203d2 + a1*d113d2 + a2*d104d2, c130 = a0 * c230 + a1 * c140 + a2 * c131, d130d0 = c230 + a0*d230d0 + a1*d140d0 + a2*d131d0, d130d1 = c140 + a0*d230d1 + a1*d140d1 + a2*d131d1, d130d2 = c131 + a0*d230d2 + a1*d140d2 + a2*d131d2, c022 = a0 * c122 + a1 * c032 + a2 * c023, d022d0 = c122 + a0*d122d0 + a1*d032d0 + a2*d023d0, d022d1 = c032 + a0*d122d1 + a1*d032d1 + a2*d023d1, d022d2 = c023 + a0*d122d2 + a1*d032d2 + a2*d023d2, c013 = a0 * c113 + a1 * c023 + a2 * c014, d013d0 = c113 + a0*d113d0 + a1*d023d0 + a2*d014d0, d013d1 = c023 + a0*d113d1 + a1*d023d1 + a2*d014d1, d013d2 = c014 + a0*d113d2 + a1*d023d2 + a2*d014d2, c031 = a0 * c131 + a1 * c041 + a2 * c032, d031d0 = c131 + a0*d131d0 + a1*d041d0 + a2*d032d0, d031d1 = c041 + a0*d131d1 + a1*d041d1 + a2*d032d1, d031d2 = c032 + a0*d131d2 + a1*d041d2 + a2*d032d2, c040 = a0 * c140 + a1 * c050 + a2 * c041, d040d0 = c140 + a0*d140d0 + a1*d050d0 + a2*d041d0, d040d1 = c050 + a0*d140d1 + a1*d050d1 + a2*d041d1, d040d2 = c041 + a0*d140d2 + a1*d050d2 + a2*d041d2, c004 = a0 * c104 + a1 * c014 + a2 * c005, d004d0 = c104 + a0*d104d0 + a1*d014d0 + a2*d005d0, d004d1 = c014 + a0*d104d1 + a1*d014d1 + a2*d005d1, d004d2 = c005 + a0*d104d2 + a1*d014d2 + a2*d005d2, (* Layer 3 *) c300 = a0 * c400 + a1 * c310 + a2 * c301, d300d0 = c400 + a0*d400d0 + a1*d310d0 + a2*d301d0, d300d1 = c310 + a0*d400d1 + a1*d310d1 + a2*d301d1, d300d2 = c301 + a0*d400d2 + a1*d310d2 + a2*d301d2, c210 = a0 * c310 + a1 * c220 + a2 * c211, d210d0 = c310 + a0*d310d0 + a1*d220d0 + a2*d211d0, d210d1 = c220 + a0*d310d1 + a1*d220d1 + a2*d211d1, d210d2 = c211 + a0*d310d2 + a1*d220d2 + a2*d211d2, c201 = a0 * c301 + a1 * c211 + a2 * c202, d201d0 = c301 + a0*d301d0 + a1*d211d0 + a2*d202d0, d201d1 = c211 + a0*d301d1 + a1*d211d1 + a2*d202d1, d201d2 = c202 + a0*d301d2 + a1*d211d2 + a2*d202d2, c120 = a0 * c220 + a1 * c130 + a2 * c121, d120d0 = c220 + a0*d220d0 + a1*d130d0 + a2*d121d0, d120d1 = c130 + a0*d220d1 + a1*d130d1 + a2*d121d1, d120d2 = c121 + a0*d220d2 + a1*d130d2 + a2*d121d2, c111 = a0 * c211 + a1 * c121 + a2 * c112, d111d0 = c211 + a0*d211d0 + a1*d121d0 + a2*d112d0, d111d1 = c121 + a0*d211d1 + a1*d121d1 + a2*d112d1, d111d2 = c112 + a0*d211d2 + a1*d121d2 + a2*d112d2, c102 = a0 * c202 + a1 * c112 + a2 * c103, d102d0 = c202 + a0*d202d0 + a1*d112d0 + a2*d103d0, d102d1 = c112 + a0*d202d1 + a1*d112d1 + a2*d103d1, d102d2 = c103 + a0*d202d2 + a1*d112d2 + a2*d103d2, c030 = a0 * c130 + a1 * c040 + a2 * c031, d030d0 = c130 + a0*d130d0 + a1*d040d0 + a2*d031d0, d030d1 = c040 + a0*d130d1 + a1*d040d1 + a2*d031d1, d030d2 = c031 + a0*d130d2 + a1*d040d2 + a2*d031d2, c021 = a0 * c121 + a1 * c031 + a2 * c022, d021d0 = c121 + a0*d121d0 + a1*d031d0 + a2*d022d0, d021d1 = c031 + a0*d121d1 + a1*d031d1 + a2*d022d1, d021d2 = c022 + a0*d121d2 + a1*d031d2 + a2*d022d2, c012 = a0 * c112 + a1 * c022 + a2 * c013, d012d0 = c112 + a0*d112d0 + a1*d022d0 + a2*d013d0, d012d1 = c022 + a0*d112d1 + a1*d022d1 + a2*d013d1, d012d2 = c013 + a0*d112d2 + a1*d022d2 + a2*d013d2, c003 = a0 * c103 + a1 * c013 + a2 * c004, d003d0 = c103 + a0*d103d0 + a1*d013d0 + a2*d004d0, d003d1 = c013 + a0*d103d1 + a1*d013d1 + a2*d004d1, d003d2 = c004 + a0*d103d2 + a1*d013d2 + a2*d004d2, (* Layer 2 *) c200 = a0 * c300 + a1 * c210 + a2 * c201, d200d0 = c300 + a0*d300d0 + a1*d210d0 + a2*d201d0, d200d1 = c210 + a0*d300d1 + a1*d210d1 + a2*d201d1, d200d2 = c201 + a0*d300d2 + a1*d210d2 + a2*d201d2, c110 = a0 * c210 + a1 * c120 + a2 * c111, d110d0 = c210 + a0*d210d0 + a1*d120d0 + a2*d111d0, d110d1 = c120 + a0*d210d1 + a1*d120d1 + a2*d111d1, d110d2 = c111 + a0*d210d2 + a1*d120d2 + a2*d111d2, c101 = a0 * c201 + a1 * c111 + a2 * c102, d101d0 = c201 + a0*d201d0 + a1*d111d0 + a2*d102d0, d101d1 = c111 + a0*d201d1 + a1*d111d1 + a2*d102d1, d101d2 = c102 + a0*d201d2 + a1*d111d2 + a2*d102d2, c020 = a0 * c120 + a1 * c030 + a2 * c021, d020d0 = c120 + a0*d120d0 + a1*d030d0 + a2*d021d0, d020d1 = c030 + a0*d120d1 + a1*d030d1 + a2*d021d1, d020d2 = c021 + a0*d120d2 + a1*d030d2 + a2*d021d2, c011 = a0 * c111 + a1 * c021 + a2 * c012, d011d0 = c111 + a0*d111d0 + a1*d021d0 + a2*d012d0, d011d1 = c021 + a0*d111d1 + a1*d021d1 + a2*d012d1, d011d2 = c012 + a0*d111d2 + a1*d021d2 + a2*d012d2, c002 = a0 * c102 + a1 * c012 + a2 * c003, d002d0 = c102 + a0*d102d0 + a1*d012d0 + a2*d003d0, d002d1 = c012 + a0*d102d1 + a1*d012d1 + a2*d003d1, d002d2 = c003 + a0*d102d2 + a1*d012d2 + a2*d003d2, (* Layer 1 *) c100 = a0 * c200 + a1 * c110 + a2 * c101, d100d0 = c200 + a0*d200d0 + a1*d110d0 + a2*d101d0, d100d1 = c110 + a0*d200d1 + a1*d110d1 + a2*d101d1, d100d2 = c101 + a0*d200d2 + a1*d110d2 + a2*d101d2, c010 = a0 * c110 + a1 * c020 + a2 * c011, d010d0 = c110 + a0*d110d0 + a1*d020d0 + a2*d011d0, d010d1 = c020 + a0*d110d1 + a1*d020d1 + a2*d011d1, d010d2 = c011 + a0*d110d2 + a1*d020d2 + a2*d011d2, c001 = a0 * c101 + a1 * c011 + a2 * c002, d001d0 = c101 + a0*d101d0 + a1*d011d0 + a2*d002d0, d001d1 = c011 + a0*d101d1 + a1*d011d1 + a2*d002d1, d001d2 = c002 + a0*d101d2 + a1*d011d2 + a2*d002d2, (* Layer 0 *) (* c000 = a0 * c100 + a1 * c010 + a2 * c001,*) d000d0 = c100 + a0*d100d0 + a1*d010d0 + a2*d001d0, d000d1 = c010 + a0*d100d1 + a1*d010d1 + a2*d001d1, d000d2 = c001 + a0*d100d2 + a1*d010d2 + a2*d001d2 DO RETURN LR3.T{d000d0, d000d1, d000d2} END END DeCasteljauGrad6;