Для одного из моих текущих проектов javafx я работаю с Venn Diagrams. Я бы хотел использовать Shape.intersect, чтобы облегчить количество математических вычислений, которые мне пришлось бы лично выполнять (и избегать работы с объектами Path). Shape.intersect производит идеальную форму, но она переведена/перемещена немного, и я не могу понять, сколько ее вернуть. В идеале, я бы хотел, чтобы область пересечения происходила точно там, где пересекаются две исходные формы, т. Е. Новое пересечение будет легко сочетаться с исходными фигурами.Почему результирующая фигура из Shape.intersect появляется в неправильном положении?
В настоящий момент мой код создает трехмерную диаграмму Венна, которая масштабируется с окном. У меня есть доступ к 3 центральным точкам кругов, а также к грубым приближениям других важных точек пересечения. Эти другие точки аппроксимируются, потому что они полагаются на значения sin и cos, чтобы убедиться, что все три круга одинакового размера и симметричны.
я издевался до следующего изображения (точки/буквы были добавлены извне в краске, но основное изображение, что мое приложение производит сейчас):
Как вы можете видеть, пересечение окружностей А и В (показано синим цветом) не соответствует значению.
Чтобы создать это, мой код масштабирует нижний холст до размера окна, вычисляет, где размещать центры кругов, а затем рисует все 3 с одинаковым радиусом. Вырезание все дополнительные пуха, мой код по существу выглядит следующим образом:
// Constructor creates 3 circles and adds to canvas
Circle a = new Circle();
canvas.getChildren().add(a);
// etc. for the other two circles
// And also makes a Shape object to hold the intersection
Shape ab = Shape.intersect(a,b); // initially empty
canvas.getChildren().add(ab);
Позже на ...
// Resizing the window calls an update function
// which recalculates the circles' centers and
// radii and then updates them. Since circles are
// drawn from upper left corner, the relocate call
// makes sure to subtract the radius to center it
a.setRadius(radius);
a.relocate(acx-radius,acy-radius);
И логика пересечения (также в функции обновления):
canvas.getChildren().remove(ab);
ab = Shape.intersect(a,b);
// Can relocate to point c, but this doesn't do the job either (see below)
ab.relocate(pcx,pcy);
// Add the new intersection back to the canvas
canvas.getChildren().add(ab);
Я попытался сделать перемещение по полученной форме пересечения в точку C, но я не уверен, что мое приближение к этой точке слишком сильно округлено, потому что оно все еще не выровнено правильно:
Я предполагаю, что это смещение может иметь что-то делать с макетом границ/визуальными границами или что-то, что получает измененные на изменении размера и никогда не должным образом обновлены, но я потратил на длительный срок, глядя на документах и не мог понять.
В идеале, я бы хотел избежать вычисления точки C вручную, так как сами круги создаются с помощью аппроксимации/округления, что делает C практически невозможным. Я надеюсь, что кто-то может указать мне на решение, которое может использовать только исходные круги, но я возьму все, что делает пересечение отображаемым в нужном месте, независимо от размера текущего холста.
В целом: как я могу сделать форму, возвращенную Shape.intersect, появляться в центре двух фигур, из которых она создана? Спасибо за ваше время.
Я попытался воссоздать вашу проблему, но [это сработало отлично] (http://imgur.com/a/42vf9) со мной. Я вижу, что у вас есть панель меню и строка состояния, может быть, потому, что ваше пересечение связывается с набором координат, который не включает один из этих двух элементов? Может быть, если вы разделите код, который связывает или изменяет размеры ваших фигур, было бы легче исправить? – MikaelF
Спасибо за ответ. Я посмотрю, смогу ли я сделать очень краткий пример моей проблемы, так как мой код настолько длинный и беспорядочный, что было бы контрпродуктивно загружать его, как есть. Я обновлюсь через пару часов после того, как закончу работу сегодня. Я подозреваю, что проблема связана с изменением размера объекта canvas, который я использую, поэтому да, я согласен, что определенно будет важно поделиться. – Prester