@alienstone

Как нарисовать только часть окружности, заданной точками кривой Безье?

Добрый день

У меня следующая задача:
Есть точки, задающие квадратную кривую Безье: p0, p2 - основные, p1 - вспомогательная.

Мне необходимо нарисовать окружность, используя эти точки. Считаем, что отрезок, проведенный через p0 и p2 делит окружность ровно напополам. А какую часть окружности для отрисовки выбрать мы определяем с какой стороны от этого отрезка лежит вспомогательная точка p1.

Перерыл все что мог, придумал пока только это:
Vec2f O( 0, 0 );
        Vec2f P0( p0->getX(), p0->getY());
        Vec2f P2( p2->getX(), p2->getY());

        if ( O.distance( P2 ) < O.distance( P0 ) ) std::swap( P0, P2 );

        double angle1 = std::atan2( C.y - P0.y, C.x - P0.x );
        double angle2 = std::atan2( C.y - P2.y, C.x - P2.x );

        for ( double t = angle2; t >= angle1; t -= 0.1 ) {
            int x = R*cos(t);
            int y = R*sin(t);
            Point::drawPoint( image, x+minx, y+miny, qRgb( 255, 0, 0 ));
        }


Но ничего не рисуется. Помогите, пожалуйста!
Спасибо.
  • Вопрос задан
  • 627 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
1. Если отрезок P0P2 делит окружность пополам, значит центр окружности лежит на этом отрезке.
2. Из условия непонятен радиус окружности. Если она должна проходить через точки P0 и P2, то центр окружности лежит на середине отрезка.
3. Раз отрезок делит окружность пополам, то дуга будет начинаться от угла вектора P2P0, и заканчиваться на ±π от этого угла. Направление вращения определяется положением точки P1 относительно вектора P2P0.
Ответ написан
Комментировать
Хорошо сформулированный вопрос - половина ответа.
Что значит "ничего не рисуется"? Нет никаких точек?
Тогда проверяйте, а рисуется ли просто точка хоть где-нибудь. Если нет - ищите, почему.
К тому же, кривую лучше рисовать из маленьких отрезков, а не из точек. Т.е. надо считать "предыдущую точку" и "текущую точку", проводить (рисовать) отрезок; затем переходить к новой точке, сохраняя "текущую" в "предыдущую", и так далее.
Попробуйте нарисовать отрезки P0-P1, P1-P2, чтобы вообще оценить опорные точки безье на картинке, а затем уже проводите какие-то рассчёты, может, проблема в рассчётах.
Ну и так далее, потом видно будет, в чем проблема.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы