src/thinkextend/Verify.php
private function _writeCurve()
    {
        $px = $py = 0;

        // 曲线前部分
        $A = mt_rand(1, $this->imageH / 2); // 振幅
        $b = mt_rand(-$this->imageH / 4, $this->imageH / 4); // Y轴方向偏移量
        $f = mt_rand(-$this->imageH / 4, $this->imageH / 4); // X轴方向偏移量
        $T = mt_rand($this->imageH, $this->imageW * 2); // 周期
        $w = (2 * M_PI) / $T;

        $px1 = 0; // 曲线横坐标起始位置
        $px2 = mt_rand($this->imageW / 2, $this->imageW * 0.8); // 曲线横坐标结束位置

        for ($px = $px1; $px <= $px2; $px = $px + 1) {
            if (0 != $w) {
                $py = $A * sin($w * $px + $f) + $b + $this->imageH / 2; // y = Asin(ωx+φ) + b
                $i  = (int) ($this->fontSize / 5);
                while ($i > 0) {
                    imagesetpixel($this->_image, $px + $i, $py + $i, $this->_color); // 这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出（不用这while循环）性能要好很多
                    $i--;
                }
            }
        }

        // 曲线后部分
        $A   = mt_rand(1, $this->imageH / 2); // 振幅
        $f   = mt_rand(-$this->imageH / 4, $this->imageH / 4); // X轴方向偏移量
        $T   = mt_rand($this->imageH, $this->imageW * 2); // 周期
        $w   = (2 * M_PI) / $T;
        $b   = $py - $A * sin($w * $px + $f) - $this->imageH / 2;
        $px1 = $px2;
        $px2 = $this->imageW;

        for ($px = $px1; $px <= $px2; $px = $px + 1) {
            if (0 != $w) {
                $py = $A * sin($w * $px + $f) + $b + $this->imageH / 2; // y = Asin(ωx+φ) + b
                $i  = (int) ($this->fontSize / 5);
                while ($i > 0) {
                    imagesetpixel($this->_image, $px + $i, $py + $i, $this->_color);
                    $i--;
                }
            }
        }
    }
private function _writeCurve()
    {
        $px = $py = 0;

        // 曲线前部分
        $A = mt_rand(1, $this->imageH / 2); // 振幅
        $b = mt_rand(-$this->imageH / 4, $this->imageH / 4); // Y轴方向偏移量
        $f = mt_rand(-$this->imageH / 4, $this->imageH / 4); // X轴方向偏移量
        $T = mt_rand($this->imageH, $this->imageW * 2); // 周期
        $w = (2 * M_PI) / $T;

        $px1 = 0; // 曲线横坐标起始位置
        $px2 = mt_rand($this->imageW / 2, $this->imageW * 0.8); // 曲线横坐标结束位置

        for ($px = $px1; $px <= $px2; $px = $px + 1) {
            if (0 != $w) {
                $py = $A * sin($w * $px + $f) + $b + $this->imageH / 2; // y = Asin(ωx+φ) + b
                $i  = (int) ($this->fontSize / 5);
                while ($i > 0) {
                    imagesetpixel($this->_image, $px + $i, $py + $i, $this->_color); // 这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出（不用这while循环）性能要好很多
                    $i--;
                }
            }
        }

        // 曲线后部分
        $A   = mt_rand(1, $this->imageH / 2); // 振幅
        $f   = mt_rand(-$this->imageH / 4, $this->imageH / 4); // X轴方向偏移量
        $T   = mt_rand($this->imageH, $this->imageW * 2); // 周期
        $w   = (2 * M_PI) / $T;
        $b   = $py - $A * sin($w * $px + $f) - $this->imageH / 2;
        $px1 = $px2;
        $px2 = $this->imageW;

        for ($px = $px1; $px <= $px2; $px = $px + 1) {
            if (0 != $w) {
                $py = $A * sin($w * $px + $f) + $b + $this->imageH / 2; // y = Asin(ωx+φ) + b
                $i  = (int) ($this->fontSize / 5);
                while ($i > 0) {
                    imagesetpixel($this->_image, $px + $i, $py + $i, $this->_color);
                    $i--;
                }
            }
        }
    }
private function _writeCurve ( ) { $ px = $ py = 0 ; // 曲线前部分 $ A = mt_rand ( 1 , $ this -> imageH / 2 ) ; // 振幅 $ b = mt_rand ( - $ this -> imageH / 4 , $ this -> imageH / 4 ) ; // Y轴方向偏移量 $ f = mt_rand ( - $ this -> imageH / 4 , $ this -> imageH / 4 ) ; // X轴方向偏移量 $ T = mt_rand ( $ this -> imageH , $ this -> imageW * 2 ) ; // 周期 $ w = ( 2 * M_PI ) / $ T ; $ px1 = 0 ; // 曲线横坐标起始位置 $ px2 = mt_rand ( $ this -> imageW / 2 , $ this -> imageW * 0.8 ) ; // 曲线横坐标结束位置 for ( $ px = $ px1 ; $ px <= $ px2 ; $ px = $ px + 1 ) { if ( 0 != $ w ) { $ py = $ A * sin ( $ w * $ px + $ f ) + $ b + $ this -> imageH / 2 ; // y = Asin(ωx+φ) + b $ i = ( int ) ( $ this -> fontSize / 5 ) ; while ( $ i > 0 ) { imagesetpixel ( $ this -> _image , $ px + $ i , $ py + $ i , $ this -> _color ) ; // 这里(while)循环画像素点比imagettftext和imagestring用字体大小一次画出（不用这while循环）性能要好很多 $ i -- ; } } } // 曲线后部分 $ A = mt_rand ( 1 , $ this -> imageH / 2 ) ; // 振幅 $ f = mt_rand ( - $ this -> imageH / 4 , $ this -> imageH / 4 ) ; // X轴方向偏移量 $ T = mt_rand ( $ this -> imageH , $ this -> imageW * 2 ) ; // 周期 $ w = ( 2 * M_PI ) / $ T ; $ b = $ py - $ A * sin ( $ w * $ px + $ f ) - $ this -> imageH / 2 ; $ px1 = $ px2 ; $ px2 = $ this -> imageW ; for ( $ px = $ px1 ; $ px <= $ px2 ; $ px = $ px + 1 ) { if ( 0 != $ w ) { $ py = $ A * sin ( $ w * $ px + $ f ) + $ b + $ this -> imageH / 2 ; // y = Asin(ωx+φ) + b $ i = ( int ) ( $ this -> fontSize / 5 ) ; while ( $ i > 0 ) { imagesetpixel ( $ this -> _image , $ px + $ i , $ py + $ i , $ this -> _color ) ; $ i -- ; } } } }
画一条由两条连在一起构成的随机正弦函数曲线作干扰线(你可以改成更帅的曲线函数)

高中的数学公式咋都忘了涅，写出来
正弦型函数解析式：y=Asin(ωx+φ)+b
各常数值对函数图像的影响：
A：决定峰值（即纵向拉伸压缩的倍数）
b：表示波形在Y轴的位置关系或纵向移动距离（上加下减）
φ：决定波形与X轴位置关系或横向移动距离（左加右减）
ω：决定周期（最小正周期T=2π/∣ω∣）
画一条由两条连在一起构成的随机正弦函数曲线作干扰线 ( 你可以改成更帅的曲线函数 )