не могу выдержать отступы линий на "круге"?

вот код :

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this); // Создаём объект отрисовщика
    painter.setRenderHint(QPainter::Antialiasing); // убираем резкие кубики

    razmer_kompas(this->width(), this->height());

    float  vertires_chikl[361]; //все точки окружности

    QPointF perv_point; perv_point = QPointF(0.0, 0.0);
    QPointF wtor_point; wtor_point = QPointF(0.0, 0.0);


    QString ctroka; ctroka = "";   // строка для вывода цифр
    QFont razm_shrift("Areal", _myTexpr.m_t_razm[8], QFont::Light); // свойства шрифта
    painter.setFont(razm_shrift);                                   // устанавливаем размер шрифта
    QFontMetrics stroka_razm = painter.fontMetrics();               // метрика шрифта

    int a = 0; bool t_slovo = false;
    for(;a<360;a++)
    {
//        if (a <= 40 || a >= 320)


//                painter.drawPoint((_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*sin(a))));
//                painter.drawPoint((_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*1.3*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*1.3*sin(a))));

        if((a % 20) == 0)
        {
            t_slovo = true;
            if(a == 360)
                ctroka = QString::number(0, 10);
            else
                ctroka = QString::number(a, 10);

            _myTexpr.m_t_razm[8] = stroka_razm.width(ctroka); // узнаём ширину строки


            perv_point.setX(_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*cos(a))); perv_point.setY(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*sin(a)));
            wtor_point.setX(_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*1.3*cos(a))); wtor_point.setY(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*1.3*sin(a)));

            //        painter.drawLine((_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*sin(a))),
            //                (_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*1.3*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*1.3*sin(a))));

            painter.drawLine(perv_point, wtor_point);
//            // тут потехоньку вывод текста
//            perv_point.setX(); perv_point.setY();
//            perv_point.setX(); perv_point.setY();
//            painter.drawText((_myTexpr.m_t_razm[1]*0.03)+_myTexpr.m_t_razm[0]+(x_t*a)-(_myTexpr.m_t_razm[8]/2),
//                    _myTexpr.m_t_razm[3]*0.8, ctroka); // рисуем надпись
            qDebug() <<"a: "<< a << "perv_point:  " <<perv_point << "wtor_point:  "<< wtor_point;
        }


        if((a % 10) == 0 && t_slovo == false)
        {
            perv_point.setX(_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*cos(a))); perv_point.setY(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*sin(a)));
            wtor_point.setX(_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*1.3*cos(a))); wtor_point.setY(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*1.3*sin(a)));

            //        painter.drawLine((_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*sin(a))),
            //                (_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*1.3*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*1.3*sin(a))));

            painter.drawLine(perv_point, wtor_point);
            qDebug() <<"a: "<< a << "perv_point:" <<perv_point << "wtor_point^" << wtor_point;

        }
        t_slovo = false;

    }
}


void MainWindow::razmer_kompas(int x, int y)
{
    // тут задай размер  линий
    _myTexpr.m_t_razm[0] = x/2.0;  // начало (отступ по х) х1
    _myTexpr.m_t_razm[1] = x/3.0;  // ширина по х х2 (ширина круга)
    _myTexpr.m_t_razm[2] = y/2.0; // отступ (отступ по у) у1
    _myTexpr.m_t_razm[3] = y/3.0;  // ширина по у у2 чтобы сделать элипс y/6.0
    _myTexpr.m_t_razm[4] = (x/2.0)/12;  // ширина треугола


    _myTexpr.m_t_razm[5] = (_myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[2])* 0.6;    // высота линии
    _myTexpr.m_t_razm[6] = (_myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[2])* 0.2;    // высота линии малой
    _myTexpr.m_t_razm[7] = (_myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[2])* 0.4;     // высота текста
    _myTexpr.m_t_razm[8] = (_myTexpr.m_t_razm[3] - _myTexpr.m_t_razm[2])*0.25;    // ширина текста (шрифта)
    //    qDebug() << "x: " << x << " x/4: " << x/4 << " _myTexpr.m_t_razm[0]: "<< _myTexpr.m_t_razm[0];
    //    qDebug() << "x: " << x << " x/2: " << x/2 << " _myTexpr.m_t_razm[1]: "<< _myTexpr.m_t_razm[1];
    //    qDebug() << "y: " << y << " y/12: " << y/12 << " _myTexpr.m_t_razm[2]: "<< _myTexpr.m_t_razm[2];
    //    qDebug() << "y: " << y << " y/6: " << y/6 << " _myTexpr.m_t_razm[3]: "<< _myTexpr.m_t_razm[3];
}



        if((a % 10) == 0 && t_slovo == false)
        {
            perv_point.setX(_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*cos(a))); perv_point.setY(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*sin(a)));
            wtor_point.setX(_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*1.3*cos(a))); wtor_point.setY(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*1.3*sin(a)));

            //        painter.drawLine((_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*sin(a))),
            //                (_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*1.3*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*1.3*sin(a))));

            painter.drawLine(perv_point, wtor_point);
            qDebug() <<"a: "<< a << "perv_point:" <<perv_point << "wtor_point^" << wtor_point;

        }
        t_slovo = false;

    }

Вот не получается получить ровные между линиями хотя кудебаг выводит верные позиции:

a:  10 perv_point: QPointF(422.994,321.528) wtor_point^ QPointF(261.892,266.636)
a:  20 perv_point:   QPointF(1221.17,811.554) wtor_point:   QPointF(1299.52,903.67)
a:  30 perv_point: QPointF(1058.72,172.192) wtor_point^ QPointF(1088.34,72.4996)
a:  40 perv_point:   QPointF(533.16,755.106) wtor_point:   QPointF(405.108,830.288)
a:  50 perv_point: QPointF(1577.58,416.255) wtor_point^ QPointF(1762.85,389.781)
a:  60 perv_point:   QPointF(350.456,401.982) wtor_point:   QPointF(167.592,371.227)
a:  70 perv_point: QPointF(1365.32,764.785) wtor_point^ QPointF(1486.92,842.871)
a:  80 perv_point:   QPointF(889.352,170.222) wtor_point:   QPointF(868.158,69.9387)
a:  90 perv_point: QPointF(673.233,805.181) wtor_point^ QPointF(587.203,895.385)
a:  100 perv_point:   QPointF(1511.88,334.192) wtor_point:   QPointF(1677.45,283.1)
a:  110 perv_point: QPointF(320.627,489.62) wtor_point^ QPointF(128.815,485.156)
a:  120 perv_point:   QPointF(1481.08,699.779) wtor_point:   QPointF(1637.4,758.363)
a:  130 perv_point: QPointF(724.934,191.674) wtor_point^ QPointF(654.414,97.8267)
a:  140 perv_point:   QPointF(833.399,834.187) wtor_point:   QPointF(795.419,933.093)
a:  150 perv_point: QPointF(1407.52,264.063) wtor_point^ QPointF(1541.78,191.932)
a:  160 perv_point:   QPointF(335.597,578.3) wtor_point:   QPointF(148.276,600.44)
a:  170 perv_point: QPointF(1560.32,621.09) wtor_point^ QPointF(1740.41,656.067)
a:  180 perv_point:   QPointF(576.986,235.046) wtor_point:   QPointF(462.081,154.209)
a:  190 perv_point: QPointF(1002.44,840.093) wtor_point^ QPointF(1015.17,940.771)
a:  200 perv_point:   QPointF(1271.8,210.781) wtor_point:   QPointF(1365.34,122.665)
a:  210 perv_point: QPointF(394.318,661.809) wtor_point^ QPointF(224.614,709.002)
a:  220 perv_point:   QPointF(1597.49,534.231) wtor_point:   QPointF(1788.74,543.151)
a:  230 perv_point: QPointF(455.875,297.297) wtor_point^ QPointF(304.637,235.136)
a:  240 perv_point:   QPointF(1168.5,822.485) wtor_point:   QPointF(1231.05,917.88)
a:  250 perv_point: QPointF(1114.23,178.079) wtor_point^ QPointF(1160.5,80.1528)
a:  260 perv_point:   QPointF(492.676,734.296) wtor_point:   QPointF(352.478,803.235)
a:  270 perv_point: QPointF(1590,445.29) wtor_point^ QPointF(1779.01,427.527)
a:  280 perv_point:   QPointF(370.087,374.067) wtor_point:   QPointF(193.113,334.937)
a:  290 perv_point: QPointF(1319.95,782.596) wtor_point^ QPointF(1427.94,866.024)
a:  300 perv_point:   QPointF(945.858,168.249) wtor_point:   QPointF(941.616,67.3734)
a:  310 perv_point: QPointF(623.778,790.682) wtor_point^ QPointF(522.911,876.536)
a:  320 perv_point:   QPointF(1538.37,360.497) wtor_point:   QPointF(1711.88,317.296)
a:  330 perv_point: QPointF(325.633,459.976) wtor_point^ QPointF(135.323,446.618)
a:  340 perv_point:   QPointF(1446.19,723.221) wtor_point:   QPointF(1592.04,788.838)
a:  350 perv_point: QPointF(778.475,181.979) wtor_point^ QPointF(724.017,85.2226)

введите сюда описание изображения

Не знаю что я делаю не так ??


Ответы (2 шт):

Автор решения: KoVadim

У Вас a измеряется в градусах, а используете функции cos/sin, которые ожидают в радианах. Но число оно число, возле него не подписано, килограммы это или мегапарсеки. В результате чего у Вас линии появляются с шагом где то около 57 градусов и наматывают много-много кругов. Но так как 57 не делится хорошо на 360, то и получается такая картина.

Что делать? либо в цикле перейти на радианы, либо для тригонометрических функций преобразовывать в радианы (просто поделив на 180 и домножив на пи).

вместо cos(a) - cos(a/180*3.1415) (можно просто завести отдельную переменную)

→ Ссылка
Автор решения: timob256
QPainter painter(this); // Создаём объект отрисовщика
painter.setRenderHint(QPainter::Antialiasing); // убираем резкие кубики

razmer_kompas(this->width(), this->height());

float  vertires_chikl[361]; //все точки окружности 


QString ctroka; ctroka = "";   // строка для вывода цифр
QFont razm_shrift("Areal", _myTexpr.m_t_razm[8], QFont::Light); // свойства шрифта
painter.setFont(razm_shrift);                                   // устанавливаем размер шрифта
QFontMetrics stroka_razm = painter.fontMetrics();               // метрика шрифта


painter.translate(width() / 2, height() / 2); // смещение отрисовки

int a = 0;  
for(;a<360;a++)
{

//            painter.drawPoint(_myTexpr.m_t_razm[1]*cos(a), _myTexpr.m_t_razm[3]*sin(a));

    painter.drawLine(_myTexpr.m_t_razm[1]*cos(a/180.0*3.1415), _myTexpr.m_t_razm[3]*sin(a/180.0*3.1415),(_myTexpr.m_t_razm[1]+_myTexpr.m_t_razm[6])*cos(a/180.0*3.1415), _myTexpr.m_t_razm[3]*sin(a/180.0*3.1415));

//        painter.drawPoint(this->width()/2+_myTexpr.m_t_razm[1]*cos(a),this->height()/2+ _myTexpr.m_t_razm[3]*sin(a));

//                painter.drawPoint((_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*sin(a))));
//                painter.drawPoint((_myTexpr.m_t_razm[0]+(_myTexpr.m_t_razm[1]*1.3*cos(a))),(_myTexpr.m_t_razm[2]+(_myTexpr.m_t_razm[3]*1.3*sin(a)))); 
}

введите сюда описание изображения

в общем через синусы с косинусами она мне выдаёт способность нарисовать сферу и прото обекты 3д (сфера, пончик) но именно нарисовать циферблат не выходит. Я смог нарисовать подсмотрев в примерах по сути рисуют одну линию а потом двигают на один градус всю сценну

QPainter painter(this); // Создаём объект отрисовщика
painter.setRenderHint(QPainter::Antialiasing); // убираем резкие кубики
painter.translate(this->width()/2, this->height()/2); // смещение отрисовки
razmer_kompas(this->width(), this->height()); // выставляем размеры

float  vertires_chikl[361]; //все точки окружности

QString ctroka; ctroka = "";   // строка для вывода цифр
QFont razm_shrift("Areal", _myTexpr.m_t_razm[8], QFont::Light); // свойства шрифта
painter.setFont(razm_shrift);                                   // устанавливаем размер шрифта
QFontMetrics stroka_razm = painter.fontMetrics();



    int a = 0; bool t_slovo = false;
    for(;a<360;++a)
    {

        if((a % 20) == 0)
        {
            t_slovo = true;
            if(a == 360)
                ctroka = QString::number(0, 10);
            else
                ctroka = QString::number(a, 10);

             painter.drawLine(_myTexpr.m_t_razm[3], 0, _myTexpr.m_t_razm[3]-_myTexpr.m_t_razm[5], 0);


        }
        if((a % 10) == 0 && t_slovo == false)
        {
            painter.drawLine(_myTexpr.m_t_razm[3], 0, _myTexpr.m_t_razm[3]-_myTexpr.m_t_razm[6], 0);


        }
        t_slovo = false;

        painter.rotate(1.0); // вот попорот всей сценны на один градус
    }

введите сюда описание изображения

→ Ссылка