Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм рисования шкалы 
:(
    Опции темы
airens
Дата 29.6.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 29.6.2009

Репутация: нет
Всего: нет



Прошу помочь решить следующую задачку. Тут даже не применительно к какому-либо языку, нужен просто алгоритм. Мне нужно нарисовать окружность и шкалу на ней (риски с промежутком в n-ное количество градусов. Окружность нарисовать естественно проблем не составляет, но каким образом можно вычислить координаты пар точек, через которые строить риски?
PM MAIL   Вверх
jonie
Дата 29.6.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



тут ответы на такие вопросы


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
triclosan
Дата 29.6.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



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

A (x;y):

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

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


PM MAIL   Вверх
kamre
Дата 30.6.2009, 13:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Цитата(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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.