Java2D: как разместить изображения вокруг центра с правильным вращением - PullRequest
0 голосов
/ 09 сентября 2018

enter image description here

У меня проблемы с размещением изображений вокруг центра с правильным углом поворота. Это код, который я сейчас использую, и результат можно увидеть на скриншоте. Количество срезов может быть динамически изменено пользователем, поэтому мне нужно вычислить новое значение поворота на основе количества срезов, но я не могу найти правильный способ сделать это. Я могу произвольно добавить значение в pictureAngle, чтобы настроить вращение, но оно будет работать только для этого определенного количества фрагментов.

ПРИМЕЧАНИЕ. Первое нарисованное изображение - это изображение на красном срезе справа, которое на верхнем снимке экрана выглядит прямым.

double angle = (double) 360 / this.slices.length;

for (int i = 0; i < this.slices.length; i++) {

    double pictureAngle = Math.toRadians(i * (360 / this.slices.length));

    px[i] = this.centerX + (wheelSize/2.1) * Math.cos(Math.toRadians((i * angle) + angle / 2));
    py[i] = this.centerY + (wheelSize/2.1) * Math.sin(Math.toRadians((i * angle) + angle / 2));

    p.addPoint((int)px[i], (int)py[i]);

    AffineTransform backup1 = g2d.getTransform();
    AffineTransform trans = new AffineTransform();

    trans.rotate(pictureAngle, (int)px[i], (int)py[i]);

    g2d.transform( trans );

    g2d.drawImage(pictures[i], (int)px[i] - (pictures[i].getWidth() / 2), (int)py[i], null);

    g2d.setTransform( backup1 );

    g2d.drawLine((int)this.centerX, (int)this.centerY, (int)px[i], (int)py[i]);


}

Если я произвольно добавлю 103 градуса к повороту, он почти сработает, поэтому я полагаю, что мне нужен правильный способ получить правильное число в зависимости от количества срезов:

double pictureAngle = Math.toRadians(103 + i * (360 / this.slices.length));

enter image description here

1 Ответ

0 голосов
/ 10 сентября 2018
        double angle = (double) 360 / nOfSlices;
        double startingAngle = 90 - angle / 2;

        for (int i = 0; i < nOfSlices; i++) {

            // this is the old code

            //rc2D arc = new Arc2D.Double(0, 0, wheelSize, wheelSize,
            //        i * angle,
            //        angle,
            //        Arc2D.PIE);

            Arc2D arc = new Arc2D.Double(0, 0, wheelSize, wheelSize,
                    (i * angle) - startingAngle,
                    angle,
                    Arc2D.PIE);

Решение состояло в том, чтобы нарисовать первый срез прямо посередине (я выделил его черным срезом - изображение снизу) и поместил в него первое изображение с поворотом 0, а затем постепенно поворачивал изображения в соответствии с углом среза .

enter image description here

...