BlinCT, Ну вот, 0 градусов (это в выходном интервале) - это право. А правая нижняя граница спидометра как раз на 60 градусов ниже. Т.е. -60. Если к этом прибавить 360, то будет 300, но это будет полный круг. Поэтому левая граница спидометра будет меньше 300. Там как раз кусок визульна на 1/6 от круга вырезан, т.ч. вычитаем 60 градусов и получаем 240. Т.е. выходной интервал от 240 до -60.
BlinCT, что вы туда передаете-то? Скорость от 0 до 100, например? Это и будет входной дипазон. На картинке 0км/ч куда указывать должен? Лево-низ? Это 240 градусов. Вот начало. 100км/ч это -60.
Можно сразу вместо градусов задать радианы, чтоб на пи/180 в каждом косинусе не домножать.
BlinCT, Та формула для толстой линии. Там, действительно, отступ идет перпендикулярно. А, поскольку beta=pi/2, то cos(alpha+beta) = sin(alpha).
В ромбе тоже можно делать отступ перпендикулярно, но тогда от центра ромба и на определенный размер. Я же формулы привел относительно первой точки.
Что-то вроде {x0+sin(alpha)*(r+d1) + cos(alpha)*d2, y0 + cos(alpha)*(r+d1)+sin(alpha)*d2} получается для средних точек, тут d1, d2 - длины диагоналей ромба.
BlinCT, Вообще, можно и упростить формулы немного и считать вторую и четвертые точки с каким-то отступом по углу и брать больше радиус и там будет просто {x0+cos(alpha-beta)*r1, y0+sin(alpha-beta)*r1}. А втретьей точке радиус будет еще больше. Но надо очень аккуратно подбирать эти r1 и beta, чтобы у вас получился ромб, а не какой-то симметричный стрелообразный четырехугольник. Если вы не генерируете сотни тысяч этих ромбов в секунду, лучше лишний раз вызвать косинус/синус и явно отложить вектора вдоль сторон ромба. В противном случае эти r1 и beta можно будет предподсчитать через арксинусы и подобные треугольники, но мне лень формулы выводить. Вряд ли у вас такая высокая нагрузка.
Ага, понятно. Значит у вас есть: координаты центра окружности (x0,y0), угол alphа - из центра к началу ромба, радиус (внешней) окружности r, длина стороны ромба l и угол beta - половина угла в основании ромба.
Первая точка: {x0+cos(alpha)*r, y0+sin(alpha)*r}
Вторая точка: {x0+cos(alpha)*r+cos(alpha-beta)*l, y0+sin(alpha)*r+sin(alpha-beta)*l}
Третья точка: {x0+cos(alpha)*r+cos(alpha-beta)*l+cos(alpha+beta)*l, y0+sin(alpha)*r+sin(alpha-beta)*l+sin(alpha+beta)*l}
Четвертая точка: {x0+cos(alpha)*r+cos(alpha+beta)*l, y0+sin(alpha)*r+sin(alpha+beta)*l}
Числа l, beta - это фиксированные параметры ромба. Больше beta - более толстый ромб. Не делайте beta больше 90 градусов, ромб вывернется внутрь окружности.
alpha - это угол от стрелочки.
Как и раньше, все углы считаются в радианах (от 0 до 2пи) и 0 указывает вправо.
Вы, похоже, напутали, что надо складывать косинусы с косинусами и угол ромба надо еще откладывать от угла стрелки.
BlinCT, Нужна картинка, как этот ромб проходит. Так-то, ромб задается точкой и двумя векторами (одинаковой длины). 2 точки: (первая точка + один из векторов). Последняя точка: (первая + оба векотра).
while (2*current+1 < size){
int maxP = (arr[2*current+1] >= arr[2*current+2] ? 2*current+1 : 2*current+2);
У вершины может быть 0, 1 или 2 ребенка. И вот в случае, если 2*current+1==size-1, как раз есть только левый ребенок. А вы все-равно залезете в правого ребенка и может даже туда спустите.
Надо добавить условие, что если второго ребенка нет, то не надо элементы сравнивать - идем точно влево.
Герман, нет, нужен список свободных блоков для каждого размера. В вашм примере изначально только в списке 0 храниться один блок. Вы его пилите, одну половину выдаете, а вторую сохраняете в список 1. Если бы щапрос был на 10b, то вы бы уполовинили блок 2 раза и созранили бы пустой блок в чписки 1 и 2 соответственно.
Dmitrii, вообще-то, для того, что вы хотите и придумали массивы. Но вот их не задать как константу прямо в месте вызова не используя эти самые std::initializer_list