Вобщем вот. Допустим я без труда сделал так, чтобы левые и правые вектора попарно пересекались. Это не сложно. Далее, надо сделать так чтобы для начала пересеклись верхние вектора, и левый с правым остались пересечёнными. Кроссвектор показывает расстояние между верхними лучами. MidPoint = LeftPoint+(RightPoint-LeftPoint)*0.5f. Иначе говоря середина между левой и правой точкой. MoveVector=MidPoint-GO1.
Что вы думаете? Здесь три степени свободы в перемещениях для того, чтобы словить пересечение верхнего вектора.
1 вариант. Вращать вокруг MidPoint по вектору RightPoint-LeftPoint, пока верхние вектора не пересекутся (определяя нехитрым алгоритмом в какую сторону крутить).
2 вариант. Двигать по вектору GO0-MidPoint, то есть вправо-лево. В данном случае влево, потому что лучи сужаются слева.
3 вариант. Двигать по вектору MoveVector назад вперёд.
Я выбрал третий вариант, дабы максимально разнести GO друг от друга.
Но во втором и третьем варианте при движении левые и правые вектора перестают пересекаться.
Приходится доводить их движением вокруг левой и правой точки. Тогда опять верхний вектор не пересекается.
Вобщем туда сюда прыг скок.
Для полного решения нужен 5-тый и шестой вектор, но они получаются только после выравнивания по четырём. 5-тый веткор - вектор максимального разноса. 6-й вектор - вектор окончательной коррекции. То есть может так получиться, что у пятых векторов даже кроссвектор не находится. Вернее он с другой стороны.