3

を使用して完全な円の一部を描画する必要がありますgraphics.curveTo(描画したい半径と角度があります)が、曲線を完全にするために、コトロール x&y の正確な式を理解することができません

私はループと多くの方法でそれを行う方法を知っていますlineToが、これは私のニーズには十分ではありません...

前もって感謝します!

4

3 に答える 3

7

この関数を使用して円セグメントを描画します (かなり前に完全な円を描画する方法に関するオンライン AS2 の例から移植したと思います)。

    /**
     * Draw a segment of a circle
     * @param graphics      the graphics object to draw into
     * @param center        the center of the circle
     * @param start         start angle (radians)
     * @param end           end angle (radians)
     * @param r             radius of the circle
     * @param h_ratio       horizontal scaling factor
     * @param v_ratio       vertical scaling factor
     * @param new_drawing   if true, uses a moveTo call to start drawing at the start point of the circle; else continues drawing using only lineTo and curveTo
     * 
     */
    public static function drawCircleSegment(graphics:Graphics, center:Point, start:Number, end:Number, r:Number, h_ratio:Number=1, v_ratio:Number=1, new_drawing:Boolean=true):void
    {
        var x:Number = center.x;
        var y:Number = center.y;
        // first point of the circle segment
        if(new_drawing)
        {
            graphics.moveTo(x+Math.cos(start)*r*h_ratio, y+Math.sin(start)*r*v_ratio);
        }

        // draw the circle in segments
        var segments:uint = 8;

        var theta:Number = (end-start)/segments; 
        var angle:Number = start; // start drawing at angle ...

        var ctrlRadius:Number = r/Math.cos(theta/2); // this gets the radius of the control point
        for (var i:int = 0; i<segments; i++) {
             // increment the angle
             angle += theta;
             var angleMid:Number = angle-(theta/2);
             // calculate our control point
             var cx:Number = x+Math.cos(angleMid)*(ctrlRadius*h_ratio);
             var cy:Number = y+Math.sin(angleMid)*(ctrlRadius*v_ratio);
             // calculate our end point
             var px:Number = x+Math.cos(angle)*r*h_ratio;
             var py:Number = y+Math.sin(angle)*r*v_ratio;
             // draw the circle segment
             graphics.curveTo(cx, cy, px, py);
        }

    }

完全な円に十分近いと思います。内部の数学はよくわかりませんが、パラメーターが十分に明確であることを願っています。

于 2012-04-28T09:54:53.203 に答える
3

二次ベジェ曲線を使用して完全な円(またはその一部)を作成することは非常に難しいので、気分が悪くなることはありません。

グラフィックAPIへの待望の追加がFlashPlayer11 / AIR 3に追加されました。これは、半円などの描画を特に簡単にする3次ベジェ曲線を描画するcubicCurveTo()関数です。

于 2012-04-28T00:50:18.633 に答える
1

ベジェ曲線で完全な円を描くことはできません。あなたはそれを概算するだけです。http://cgafaq.info/wiki/Bézier_circle_approximationを参照してください。

于 2012-04-28T19:38:39.670 に答える