Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Алгоритм рисования шкалы


Автор: airens 29.6.2009, 18:48
Прошу помочь решить следующую задачку. Тут даже не применительно к какому-либо языку, нужен просто алгоритм. Мне нужно нарисовать окружность и шкалу на ней (риски с промежутком в n-ное количество градусов. Окружность нарисовать естественно проблем не составляет, но каким образом можно вычислить координаты пар точек, через которые строить риски?

Автор: jonie 29.6.2009, 18:58
http://www.google.com/search?client=opera&rls=ru&q=%D0%B3%D0%B5%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%8F%2B%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA&sourceid=opera&ie=utf-8&oe=utf-8 на такие вопросы

Автор: triclosan 29.6.2009, 19:10
Центр окружности совпадает с центром начала координат, тогда для точки А

A (x;y):

x = R*cos(a)
y = R*sin(a)

где а - угол наклона.


Автор: kamre 30.6.2009, 13:12
Цитата(airens @ 29.6.2009,  18:48)
но каким образом можно вычислить координаты пар точек, через которые строить риски?

Можно вот так, например:

Код

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void paintEvent(QPaintEvent *event);

private:
    void circleScale(QPainter *painter, qreal radius, qreal tickLength, int numTicks);
};

#endif // WIDGET_H

Код

#include "widget.h"

#include <math.h>
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setMinimumSize(100, 100);
}

Widget::~Widget()
{

}

void Widget::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.translate(0.5 * width(), 0.5 * height());
    qreal radius = 0.35 * qMin(width(), height());
    qreal tickLength = 0.15 * radius;
    circleScale(&painter, radius, tickLength, 16);
}

void Widget::circleScale(QPainter *painter, qreal radius, qreal tickLength, int numTicks)
{
    QPen pen(QBrush(Qt::blue), 2.0);
    QFont font("Arial");
    font.setPixelSize((int)tickLength);
    painter->setPen(pen);
    painter->setFont(font);
    painter->drawEllipse(QPointF(0, 0), radius, radius);
    for (int i = 0; i < numTicks; ++i) {
        qreal angle = 2 * M_PI * i / numTicks;
        qreal cs = cos(angle);
        qreal sn = -sin(angle);
        qreal x = radius * cs;
        qreal y = radius * sn;
        qreal dx = 0.5 * tickLength *cs;
        qreal dy = 0.5 * tickLength *sn;
        painter->drawLine(QPointF(x - dx, y - dy), QPointF(x + dx, y + dy));
        QString text = QString("%1").arg(i);
        QTextOption textOption(Qt::AlignCenter);
        QRectF rect(x + dx, y + dy, 3 * dx, 3 * dy);
        rect = painter->boundingRect(rect, text, textOption);
        painter->drawText(rect, text, textOption);
    }
}

Код

#include <QtGui/QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.resize(400, 300);
    w.show();
    return a.exec();
}


user posted image

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)