Пусть изображение летит по кругу на Яве - PullRequest
0 голосов
/ 13 октября 2011

Мне нужно, чтобы изображение летело по кругу, сейчас я застрял только на одной части.Для вычисления точек нужно использовать im pythagoras для вычисления высоты (точка B).

Теперь при использовании функции sqrt возникает ошибка, что я не могу преобразовать double в int.Вот мой код:

package vogel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class vogel extends Component {
    private int x;
    private int r;
    private int b;


    BufferedImage img;

    public vogel() {
       try {
           img = ImageIO.read(new File("F:/JAVA/workspace/School/src/vogel/vogel.png"));
       } catch (IOException e) {
       } 
       r = 6;
    }


    @Override
    public void paint(Graphics g) {
        for(int i = -r; i <= r; i++) {
            x = i;      

            b = Math.sqrt(r^2 - x^2);
            g.drawImage(img, x, b, this);
        }        
    }


    public static void main(String[] args) { 
        JFrame f = new JFrame("Boot");   
        f.setSize(1000,1000);
        f.add(new vogel());        
        f.setVisible(true);

        for (int number = 1; number <= 1500000; number++) {
            f.repaint();

            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {}
        }
    }
}

Надеюсь, один из вас, ребята, может помочь мне

Ответы [ 5 ]

3 голосов
/ 13 октября 2011

Приведите значение.EG

b = (int)Math.sqrt(r^2 - x^2);
1 голос
/ 13 октября 2011

преобразуйте его, сотворив

b = (int)Math.sqrt(..);

хотя использование алгоритма Брезенхэма более эффективно, чем вычисление по корням

0 голосов
/ 14 октября 2011

Предварительный расчет координат пути ускорит циклы перерисовки, самый быстрый способ получить каждую пиксельную координату - это метод Брезенхэма (ссылка Хати), вот код Java

private void drawCircle(final int centerX, final int centerY, final int radius) {
    int d = 3 - (2 * radius);
    int x = 0;
    int y = radius;
    Color circleColor = Color.white;

    do {
        image.setPixel(centerX + x, centerY + y, circleColor);
        image.setPixel(centerX + x, centerY - y, circleColor);
        image.setPixel(centerX - x, centerY + y, circleColor);
        image.setPixel(centerX - x, centerY - y, circleColor);
        image.setPixel(centerX + y, centerY + x, circleColor);
        image.setPixel(centerX + y, centerY - x, circleColor);
        image.setPixel(centerX - y, centerY + x, circleColor);
        image.setPixel(centerX - y, centerY - x, circleColor);
        if (d < 0) {
            d = d + (4 * x) + 6;
        } else {
            d = d + 4 * (x - y) + 10;
            y--;
        }
        x++;
    } while (x <= y);
}

Вам нужно будет немного изменить свою собственную реализацию, так как в этом примере используется тип хранения данных, определенный Rosetta. http://rosettacode.org/wiki/Basic_bitmap_storage#Java

Примечание: поскольку он генерирует дугу 1/8 и отражает ее, он не будет создавать координаты в правильном порядке для перемещения изображения - вам нужно будет загрузить их в массив и отсортировать их.

Полный класс можно найти в Розетте здесь; http://rosettacode.org/wiki/Bitmap/Midpoint_circle_algorithm#Java

Более подробную информацию об уравнениях Брезенама можно найти здесь. http://free.pages.at/easyfilter/bresenham.html

0 голосов
/ 13 октября 2011

Эта строка:

 b = Math.sqrt(r^2 - x^2);

... Не делает то, что вы думаете, несколькими способами. Начать с ^ означает XOR, это не оператор степени - и он возвращает двойное, где, как b является целым числом.

Имея дело с проблемой питания, мы можем вместо этого использовать Math.pow (который фактически дает вам силу), чтобы получить:

 b = Math.sqrt(Math.pow(r, 2), Math.pow(x, 2));

Конечно, я предполагаю, что здесь вы имели в виду силу и не хотели вместо этого XOR вместо двух чисел!

Вы можете просто привести результат к int:

 b = (int)Math.sqrt(Math.pow(r, 2), Math.pow(x, 2));

Но вы, вероятно, хотите изменить b, чтобы оно было двойным, и вы можете сохранить дополнительную точность.

0 голосов
/ 13 октября 2011
b = (int)Math.sqrt(r^2 - x^2); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...