Переделка солвера #8
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Плохие вести, коллеги
Обнаружилось то, о чём я совершенно забыл. В js реализации planegcs автор специально сериализовал все примитивы и ограничения. Таким образом в солвер подавался только этот набор.
Что у нас?
В текущей кодовой реализации солвер хранится как объект класса Canvas. Хорошо - скажете Вы. И это будет правдой. Но до тех пор пока мы не узнаём, что координаты привязаны к списку параметров. И вот например мы хотим сделать что-то такое:
Казалось бы - гуляй да радуйся - тем более radius теперь в списке параметров.
Но не тут то было...
Посмотрим на реализацию addConstraintCircleRadius в GCS.cpp:
Как Вы можете увидеть - внутри этого ограничения - другое ограничение. Это нормально. Интересно тут другое. Я не знаю с чем это связано, но по какой-то неведомой мне причине addConstraintEqual работает не как c.rad = radius, а как radius = c.rad. То есть при попытке сменить radius нас обратно тянет к c.rad.
Что делать?
Пока что не слишком много идей. Есть два основных варианта:
Это наиболее древний экземпляр, но старичок всё ещё живой. Из его плюсов - для него есть нормальная документация и примеры (!!). Из минусов - код всё-таки там запутанный и непонятно как вообще собрать там либу без makefile.
В нанокаде я подсмотрел, что размерные ограничения там хранятся в отдельном менеджере. Можно что-то проделать и у нас. Таким образом мы не потеряем данные, и радиус окружности будет изменяться под воздействием radius.
P.S. Возможно стоит ещё оптимизировать немного код, хотя скорее я выделю это в отдельную задачу.
Я тут так подумал - наверное стоит создать отдельный массив
Но в целом я готов переписать под SolveSpace