не могу выдержать отступы линий на "круге"?
вот код :
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 шт):
У Вас a измеряется в градусах, а используете функции cos/sin, которые ожидают в радианах. Но число оно число, возле него не подписано, килограммы это или мегапарсеки. В результате чего у Вас линии появляются с шагом где то около 57 градусов и наматывают много-много кругов. Но так как 57 не делится хорошо на 360, то и получается такая картина.
Что делать? либо в цикле перейти на радианы, либо для тригонометрических функций преобразовывать в радианы (просто поделив на 180 и домножив на пи).
вместо cos(a) - cos(a/180*3.1415) (можно просто завести отдельную переменную)
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); // вот попорот всей сценны на один градус
}


