рдмрд╛рдЗрдХреНрдпреВрдмрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк, рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

2-рдЖрдпрд╛рдореА рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдХреБрдЫ рдорд╛рдкреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдерд╛, рдкрд░рд┐рдгрд╛рдо рдХреНрд░рдорд╢рдГ рдПрдХ рд╕рдорд╛рди рдЧреНрд░рд┐рдб рдкрд░ рдиреЛрдбрд▓ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЬрд╛рдиреЗ рдЬрд╛рддреЗ рдереЗ, рдХреНрд░рдорд╢рдГ рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдк рдореЗрдВ рдХрдо рд╣реЛ рдЧрдпрд╛ рдерд╛ред рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА - рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рдкреНрд░рдХреНрд╖реЗрдк рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛, рдЗрд╕рд▓рд┐рдП рдкрд╕рдВрдж рдмрд╛рдпреВрдмрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдкрд░ рдЧрд┐рд░ рдЧрдИред рд╡рд┐рдХреА рд▓реЗрдЦ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рд╕реВрдЦрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ (рдХрдо рд╕реЗ рдХрдо рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕реНрдХреВрд▓ рдХреЗ рдмрд╛рдж рд╕реЗ рдЧрдгрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛), рд▓реЗрдХрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рднрдпрд╛рдирдХ рд▓реЗрдЦ рдХрд╛ рд▓рд┐рдВрдХ рднреА рдерд╛ред рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред

рд╢рдмреНрджрд╛рд╡рд▓реА


рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди, рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди - рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЧрдгрд┐рдд рдореЗрдВ, рдЬреНрдЮрд╛рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЙрдкрд▓рдмреНрдз рдЕрд╕рддрдд рд╕реЗрдЯ рд╕реЗ рдорд╛рддреНрд░рд╛ рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

(c) рд╡рд┐рдХреА

рдШрди рдкреНрд░рдХреНрд╖реЗрдк



рдмрд╛рдЗрдмрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреНрдпреВрдмрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред

рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди f (x) рдФрд░ рдЗрд╕рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ x = 0 рдФрд░ x = 1 рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреАрд╕рд░реЗ рдХреНрд░рдо рдХреЗ рдмрд╣реБрдкрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрддрд░рд╛рд▓ [0, 1] рдкрд░ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реВрддреНрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреАрд╕рд░рд╛ рдХреНрд░рдо рдмрд╣реБрдкрдж рдФрд░ рдЙрд╕рдХрд╛ рд╡реНрдпреБрддреНрдкрдиреНрди:



рдмрд╣реБрдкрдж рдХреЗ рдорд╛рди рдФрд░ рдЙрд╕рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдмрд┐рдВрджреБ x = 0 рдФрд░ x = 1 рдкрд░





рдЗрди рдЪрд╛рд░ рдкрд╣рдЪрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:





рддреЛ рд╣рдореЗрдВ рдЕрдкрдирд╛ рдкреНрд░рдХреНрд╖реЗрдк рд╕реВрддреНрд░ рдорд┐рд▓рд╛

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рджрд┐рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдХреБрдЫ рдЬреНрдЮрд╛рдд рдореВрд▓реНрдпреЛрдВ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЛ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рджрд┐рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЛ 0 рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪрд┐рдХрдиреА рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рд╢рдВрд╕рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдЧреНрд░рд╛рдлрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдФрд░ рдЕрдЧрд▓реЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рд░реЗрдЦрд╛ рдврд▓рд╛рди рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ 4 рдЕрдВрдХ рдЪрд╛рд╣рд┐рдПред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ x = -1, x = 0, x = 1 рдФрд░ x = 2 рдкрд░ рдХреНрд░рдорд╢рдГ p0, p1, P2 рдФрд░ p3 рдореЗрдВ 4 рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рд╣реИрдВред рдкреНрд░рд╛рдкреНрдд рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ f (0), f (1), f (2) рдФрд░ f (3):






рдЗрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рддреБрд▓рдирд╛ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рд╕реВрддреНрд░реЛрдВ рд╕реЗ рдХрд░реЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:





рдкрд░рд┐рдгрд╛рдо:


PHP рдореЗрдВ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

/** *   * * @param array $p    : f(x0), f(x1), f(x2), f(x3) * @param float $x x-   * @return float   f($x) */ function cubicInterpolate ($p, $x) { return $p[1] + (-0.5 * $p[0] + 0.5 * $p[2]) * $x + ($p[0] - 2.5 * $p[1] + 2.0 * $p[2] - 0.5 * $p[3]) * $x * $x + (-0.5 * $p[0] + 1.5 * $p[1] - 1.5 * $p[2] + 0.5 * $p[3]) * $x * $x * $x; } 


рдмрд╛рдЗрдХреНрдпреВрдмрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк



рдмрд╛рдЗрдмрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рджреЛ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдПрдХ рдШрди рдкреНрд░рдХреНрд╖реЗрдк рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЕрдзрд┐рдХ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдкреНрд░рдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдо 16 рдЕрдВрдХ p ij рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдЙрддреНрдкрддреНрддрд┐ (i-1, j-1) рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдБ i, j 0 рд╕реЗ 3 рддрдХ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдлрд┐рд░, рд╣рдо рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рддрд╣ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ [0,0] x [ 1,1], рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо 4 рд╕реНрддрдВрднреЛрдВ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рджрд┐рд╢рд╛ рдореЗрдВ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


рдкрд╣рд▓реЗ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд PHP рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 /** *    * * @param array $p   2-  (4 x 4),    16-   * @param float $x x-   * @param float $y y-   * @return float   f($x, $y) */ function bicubicInterpolate ($p, $x, $y) { $tmp = array(); $tmp[0] = cubicInterpolate($p[0], $y); $tmp[1] = cubicInterpolate($p[1], $y); $tmp[2] = cubicInterpolate($p[2], $y); $tmp[3] = cubicInterpolate($p[3], $y); return cubicInterpolate($tmp, $x); } 


рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ - рдкреНрд░рджрд░реНрд╢рдиред рдбреЗрдЯрд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рдорд╛рддреНрд░рд╛ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдВрднреАрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред
рдмрд╣реБрдЖрдпрд╛рдореА рдмрд╣реБрдкрдж рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕реВрддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд░реВрдк рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
  g (x, y) = a00 * x ^ 0 * y ^ 0 + a01 * x ^ 0 * y ^ 1 + 
          a02 * x ^ 0 * y ^ 2 + a03 * x ^ 0 * y ^ 3 +
          a10 * x ^ 1 * y ^ 0 + a11 * x ^ 1 * y ^ 1 + 
          a12 * x ^ 1 * y ^ 2 + a13 * x ^ 1 * y ^ 3 +
          a20 * x ^ 2 * y ^ 0 + a21 * x ^ 2 * y ^ 1 + 
          a22 * x ^ 3 * y ^ 2 + a23 * x ^ 2 * y ^ 3 +
          a30 * x ^ 3 * y ^ 0 + a31 * x ^ 3 * y ^ 1 + 
          a32 * x ^ 3 * y ^ 2 + a33 * x ^ 3 * y ^ 3

рдЕрдм рдЖрдкрдХреЛ рдЧреБрдгрд╛рдВрдХ рдПрдХ рдЖрдИрдЬреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ [0,0] рд╕реЗ [1,1] рддрдХ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

















рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ:

 class CachedBicubicInterpolator { private $a00, $a01, $a02, $a03, $a10, $a11, $a12, $a13, $a20, $a21, $a22, $a23, $a30, $a31, $a32, $a33; /** *  . * * @param array $p 2-  (4 x 4),      * @return void */ public function updateCoefficients ($p) { $this->a00 = $p[1][1]; $this->a01 = -.5 * $p[1][0] + .5 * $p[1][2]; $this->a02 = $p[1][0] - 2.5 * $p[1][1] + 2 * $p[1][2] - .5 * $p[1][3]; $this->a03 = -.5 * $p[1][0] + 1.5 * $p[1][1] - 1.5 * $p[1][2] + .5 * $p[1][3]; $this->a10 = -.5 * $p[0][1] + .5 * $p[2][1]; $this->a11 = .25 * $p[0][0] - .25 * $p[0][2] - .25 * $p[2][0] + .25 * $p[2][2]; $this->a12 = -.5 * $p[0][0] + 1.25 * $p[0][1] - $p[0][2] + .25 * $p[0][3] + .5 * $p[2][0] - 1.25 * $p[2][1] + $p[2][2] - .25 * $p[2][3]; $this->a13 = .25 * $p[0][0] - .75 * $p[0][1] + .75 * $p[0][2] - .25 * $p[0][3] - .25 * $p[2][0] + .75 * $p[2][1] - .75 * $p[2][2] + .25 * $p[2][3]; $this->a20 = $p[0][1] - 2.5 * $p[1][1] + 2 * $p[2][1] - .5 * $p[3][1]; $this->a21 = -.5 * $p[0][0] + .5 * $p[0][2] + 1.25 * $p[1][0] - 1.25 * $p[1][2] - $p[2][0] + $p[2][2] + .25 * $p[3][0] - .25 * $p[3][2]; $this->a22 = $p[0][0] - 2.5 * $p[0][1] + 2 * $p[0][2] - .5 * $p[0][3] - 2.5 * $p[1][0] + 6.25 * $p[1][1] - 5 * $p[1][2] + 1.25 * $p[1][3] + 2 * $p[2][0] - 5 * $p[2][1] + 4 * $p[2][2] - $p[2][3] - .5 * $p[3][0] + 1.25 * $p[3][1] - $p[3][2] + .25 * $p[3][3]; $this->a23 = -.5 * $p[0][0] + 1.5 * $p[0][1] - 1.5 * $p[0][2] + .5 * $p[0][3] + 1.25 * $p[1][0] - 3.75 * $p[1][1] + 3.75 * $p[1][2] - 1.25 * $p[1][3] - $p[2][0] + 3 * $p[2][1] - 3 * $p[2][2] + $p[2][3] + .25 * $p[3][0] - .75 * $p[3][1] + .75 * $p[3][2] - .25 * $p[3][3]; $this->a30 = -.5 * $p[0][1] + 1.5 * $p[1][1] - 1.5 * $p[2][1] + .5 * $p[3][1]; $this->a31 = .25 * $p[0][0] - .25 * $p[0][2] - .75 * $p[1][0] + .75 * $p[1][2] + .75 * $p[2][0] - .75 * $p[2][2] - .25 * $p[3][0] + .25 * $p[3][2]; $this->a32 = -.5 * $p[0][0] + 1.25 * $p[0][1] - $p[0][2] + .25 * $p[0][3] + 1.5 * $p[1][0] - 3.75 * $p[1][1] + 3 * $p[1][2] - .75 * $p[1][3] - 1.5 * $p[2][0] + 3.75 * $p[2][1] - 3 * $p[2][2] + .75 * $p[2][3] + .5 * $p[3][0] - 1.25 * $p[3][1] + $p[3][2] - .25 * $p[3][3]; $this->a33 = .25 * $p[0][0] - .75 * $p[0][1] + .75 * $p[0][2] - .25 * $p[0][3] - .75 * $p[1][0] + 2.25 * $p[1][1] - 2.25 * $p[1][2] + .75 * $p[1][3] + .75 * $p[2][0] - 2.25 * $p[2][1] + 2.25 * $p[2][2] - .75 * $p[2][3] - .25 * $p[3][0] + .75 * $p[3][1] - .75 * $p[3][2] + .25 * $p[3][3]; } /** *  . * * @param float $x $x = $x - $x0 * @param float $y $y = $y - $y0 * @return float    . */ public function getValue ($x, $y) { //   2  3 . $x2 = $x * $x; $x3 = $x2 * $x; $y2 = $y * $y; $y3 = $y2 * $y; return ($this->a00 + $this->a01 * $y + $this->a02 * $y2 + $this->a03 * $y3) + ($this->a10 + $this->a11 * $y + $this->a12 * $y2 + $this->a13 * $y3) * $x + ($this->a20 + $this->a21 * $y + $this->a22 * $y2 + $this->a23 * $y3) * $x2 + ($this->a30 + $this->a31 * $y + $this->a32 * $y2 + $this->a33 * $y3) * $x3; } } 


рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ



рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрд╛рдЗрдмрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рд╕реНрд░реЛрдд рдбреЗрдЯрд╛: рдбреЗрдЯрд╛ рд╕рд░рдгреА 7 x 7 рдЕрдВрдХ
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╕рддрд╣ рдХреЛ 300 x 300 рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВред

рдореИрдВрдиреЗ рдХреЛрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдпрдерд╛рд╕рдВрднрд╡ рдХреЛрд╢рд┐рд╢ рдХреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛

 <?php header("Content-type: image/png");//  include 'interpolation.php';//   include 'colormap.php';//   $simpleData = array( array(0, 0.1, 0.15, 0.2, 0.15, 0.1, 0), array(0, 0.1, 0.5, 1, 0.9, 0.1, 0), array(0, 0.1, 0.7, 1, 0.9, 0.1, 0), array(0, 0.1, 0.6, 0.7, 0.5, 0.1, 0), array(0, 0.2, 0.8, 0.6, 0.15, 0.08, 0.1), array(0.08, 0.2, 0.15, 0.2, 0.15, 0.1, 0.1), array(0.1, 0.8, 0.1, 0.1, 0.1, 0, 0) );//    7  7 $countX = count($simpleData[0]);//    $countY = count($simpleData); $input = array(); /*       *      ,         *     -      */ for ($i = 0; $i < $countX; $i ++) { for ($j = 0; $j < $countY; $j ++) { $input[$i + 1][$j + 1] = $simpleData[$j][$i]; if ($i == 0) { $input[0][$j + 1] = $simpleData[$j][$i] - $simpleData[$j][$i + 1];//  } if ($i == ($countX - 1)) { $input[$countX + 1][$j + 1] = $simpleData[$j][$i] - $simpleData[$j][$i - 1];//  } if ($j == 0) { $input[$i + 1][0] = $simpleData[$j][$i] - $simpleData[$j + 1][$i];//  } if ($j == ($countY - 1)) { $input[$i + 1][$countY + 1] = $simpleData[$j][$i] - $simpleData[$j - 1][$i];//  } } } /*   *     ,     . */ $input[0][0] = ($input[1][0] + $input[0][1]) / 2; $input[$countX + 1][0] = ($input[$countX][0] + $input[$countX][1]) / 2; $input[0][$countY + 1] = ($input[0][$countY] + $input[1][$countY]) / 2; $input[$countX + 1][$countY + 1] = ($input[$countX + 1][$countY] + $input[$countX][$countY]) / 2; $step = 50; //  50  $img = imagecreatetruecolor(($countX - 1) * $step, ($countY - 1) * $step);//    $colormap = createColormap($img);//   $b2i = new CachedBicubicInterpolator(); for ($i = 1; $i < $countX; $i ++) {//   for ($j = 1; $j < $countY; $j ++) { $points = array(); $points[0][0] = $input[$i - 1][$j - 1]; $points[1][0] = $input[$i][$j - 1]; $points[2][0] = $input[$i + 1][$j - 1]; $points[3][0] = $input[$i + 2][$j - 1]; $points[0][1] = $input[$i - 1][$j]; $points[1][1] = $input[$i][$j]; $points[2][1] = $input[$i + 1][$j]; $points[3][1] = $input[$i + 2][$j]; $points[0][2] = $input[$i - 1][$j + 1]; $points[1][2] = $input[$i][$j + 1]; $points[2][2] = $input[$i + 1][$j + 1]; $points[3][2] = $input[$i + 2][$j + 1]; $points[0][3] = $input[$i - 1][$j + 2]; $points[1][3] = $input[$i][$j + 2]; $points[2][3] = $input[$i + 1][$j + 2]; $points[3][3] = $input[$i + 2][$j + 2]; $b2i->updateCoefficients($points);//  for ($x = 0; $x < $step; $x ++) {//   for ($y = 0; $y < $step; $y ++) { $rx = ($i - 1) * $step + $x;//     $ry = ($j - 1) * $step + $y;//y     $ax = $x / $step;//x - x0 $ay = $y / $step;//y - y0 $val = $b2i->getValue($ax, $ay);//  $color = ceil(($val) * 1024) - 1;//  if ($color < 0) $color = 0;//   if ($color > 1023) $color = 1023;//   imagesetpixel($img, $rx, $ry, $colormap[$color]);//  } } } } imagepng($img); ?> 


рд░рдВрдЧ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓

 function createColormap(&$image) { $colormap = array(); for ($i = 0; $i < 256; $i ++) { $colormap[$i] = imagecolorallocate($image, 0, $i, 255); } for ($i = 0; $i < 256; $i ++) { $colormap[$i + 256] = imagecolorallocate($image, 0, 255, 255 - $i); } for ($i = 0; $i < 256; $i ++) { $colormap[$i + 512] = imagecolorallocate($image, $i, 255, 0); } for ($i = 0; $i < 256; $i ++) { $colormap[$i + 768] = imagecolorallocate($image, 255, 255 - $i, 0); } return $colormap; } 


рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо:


Source: https://habr.com/ru/post/In111402/


All Articles