Рисование части идеального круга с помощью кривой
Мне нужно нарисовать часть идеального круга, используя graphics.curveTo
(У меня есть радиус и угол, который я хочу нарисовать), но я не могу понять точную формулу cotorol x&y, чтобы кривая была идеальной
Я знаю, как сделать это с помощью петли и многих lineTo
но этого недостаточно для моих нужд...
заранее спасибо!
3 ответа
Я использую эту функцию для рисования сегментов круга (я думаю, что я перенес это из онлайн-примера 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);
}
}
Я думаю, что это достаточно близко для идеальных кругов. Я не очень понимаю математику внутри, но я надеюсь, что параметры достаточно ясны для вас.
Было бы довольно сложно создать идеальный круг (или даже его часть), используя квадратные кривые Безье, так что не расстраивайтесь.
долгожданное дополнение к графическому API появилось в Flash Player 11 / AIR 3, который представляет собой функцию cubicCurveTo(), которая рисует кубические кривые Безье, что делает рисование таких вещей, как полукруги, особенно простым.
Вы не можете нарисовать идеальный круг с кривыми Безье. Вы только приближаете это. Смотрите http://cgafaq.info/wiki/ Bézier_circle_approximation.