Листинг 3.14. Рисование дуги окружности
void drawArc(Point2 center, float radius, float startAngle, float sweep) {
// startAngle and sweep are in degrees
// startAngle и sweep измеряются в градусах
const int n - 30: // number of intermediate segments in arc // число промежуточных отрезков дуги
float angle - startAngle * 3.14159265 / 180: // initial angle in radians // начальный угол в радианах
float anglelnc - sweep * 3.14159265 /(180 * n): // angle increment // увеличение угла
float cx center.getXO. cy - center.getYO:
cvs.moveTo(cx + radius * cos(angle), cy + radius * sin(angle)): fordnt k - 1: k < n: k++. angle +- anglelnc)
cvs.lineTo(cx + radius * cos(angle). cy + radius * sin(angle)):
}
CP остается в последней точке дуги. В ряде случаев предпочитают опускать начальную команду moveToO по направлению к первой точке дуги, чтобы соединить дугу с той фигурой, которая была нарисована к моменту вызова drawArcC).
Значительно более быстрая подпрограмма рисования дуги, которая рассматривается в главе 5, не проделывает многократно повторяющихся вычислений функций sin( ) и cos( ). Вместо приведенной здесь процедуры можно с успехом использовать ту подпрограмму.
Располагая функцией drawArcO, нетрудно написать подпрограмму drawCircle(Point2 center, float radius), рисующую окружность целиком. (Как?)
Подпрограмма drawCircleO вызывается спецификацией центра (center) и радиуса (radius), однако существуют другие способы описания окружности, которые имеют широкое применение в интерактивной графике и автоматизированном проектировании. Вот два самых известных из них.
3.7. Рисование окружностей и дуг
1. Задаются центр и точка на окружности. В этом случае подпрограмму сігаїЛі гс!е() можно использовать, если известен радиус. Если с - центр, ар - заданная точка на окружности, то радиус просто равен расстоянию от с до р, которое легко найти с помощью обычной теоремы Пифагора.
2. Заданы три точки, через которые должна пройти окружность. Известно, что через три точки, не лежащие на одной прямой, проходит единственная окружность. В главе 4 обсуждается, как определить центр и радиус этой окружности.