Это так просто, я не могу поверить, что у меня столько проблем с этим.
Для аналогии с тем, что я ищу, представьте двуручный циферблат, где вместо 12 часов было время от 0 до 1.
Обе стрелки могут указывать в любом направлении, при условии, что значения от 0 до 1, например, одна указывает вверх, а другая по диагонали вниз и влево - 0 и 0,625.
Мне нужна функция c ++ \ c #, которая с учетом позиции обеих рук и логического значения, представляющего, если требуется больший или меньший сегмент между руками, возвращает позицию на полпути между обеими руками.
Например, «0,2, 0,8, ложь» будет означать меньший сегмент между обеими руками, и ответ будет 0.
float func(float a, float b, bool side)
{
return 0f;
}
Во многих случаях вычисление будет просто "(a + b) * 0.5", однако при пересечении 0, как в приведенном выше примере, это не так. Это также не так просто, как вставить одну ветку, как «если». Кажется, должно быть решение, намного более элегантное, чем то, которое я пробовал.
edit: я наконец-то решил это сам, см. Код ниже, кроме того, после того, как различные другие попытались решить проблему, было найдено гораздо более изящное решение.
float segment_size(float a, float b, bool side)
{
float larger, smaller, c, d_smaller, d_larger;
if (a > b)
{
smaller = b;
larger = a;
}
else
{
smaller = a;
larger = b;
}
c = larger - smaller;
if (c > 0.5) {d_larger = c; d_smaller = 1 - c;} else {d_larger = 1 - c; d_smaller = c;}
return side ? d_larger : d_smaller;
}
float func(float a, float b, bool side)
{
float larger, smaller, c;
if(a > b)
{
smaller = b;
larger = a;
}
else
{
smaller = a;
larger = b;
}
c = larger - smaller;
float outf = 0, out1 = (float)((a + b) * 0.5),
out3 = (float)(smaller - (segment_size(a, b, false) * 0.5)),
out4 = (float)((smaller + larger) * 0.5);
if(out4 > 0.5) {out4 -= 0.5f;} else {out4 += 0.5f;}
if ((side == false && c <= 0.5) || (side == true && c > 0.5)) {outf = out1;}
if (side == false && c > 0.5) {outf = out3;}
if (side == true && c <= 0.5) {outf = out4;}
if(outf < 0) {outf += 1;} if(outf >= 1) {outf -= 1;}
return outf;
}