Как найти самое яркое место в двумерном массиве чисел

1

Я пытаюсь понять, как использовать эти методы для выполнения этого задания, но я по-прежнему относительно новичок в Java и не знаю, с чем это связано. У файла массива есть: 2D-массив

Вот задание: Назначение

Я просто ищу информацию о математике и что использовать, чтобы начать с этих методов. Я не прошу кого-нибудь сделать домашнее задание! Спасибо за любую помощь заранее!

Вот что я имею до сих пор:

public static void main(String[] args) throws FileNotFoundException {

    File skyimage = new File("skyimage.txt");
    Scanner scan = new Scanner(skyimage);

    int r, c;

    r = scan.nextInt();
    c = scan.nextInt();

    int sky[][] = new int[r][c];


    for(r = 0; r < sky.length; r++){
        for(c = 0; c < sky[r].length; c++)
            sky[r][c] = scan.nextInt();
        }


    printArray(sky);
    lightSource(sky, c);


}//end main



private static void printArray(int[][] sky) {

    for(int r = 0; r < sky.length; r++){
        for(int c = 0; c < sky[r].length; c++){
            System.out.printf("%5d", sky[r][c]);
        }
        System.out.println();
    }
}


public static void lightSource(int sky[][], int n){
    Point[] lightPoint = new Point[n];

    for(int r = 0; r < sky.length; r++){
        for(int c = 0; c < sky[r].length; c++){
            new Point(r, c);
        }
    }

    System.out.println("The brightest interior point is located at: " + lightPoint);

}//end method



public static void darkSource(){

}//end method



public static void filterImage(){

}//end method



public static void negativeImage(){

}//end method
  • 0
    Похоже, вам нужен способ определить, какие соседи доступны (по крайней мере, 3, если вы находитесь в углу как пиксель, не более 9, если вы окружены) ... Получив соседей, вы добавляете их значения и сохраняете <x, y> позиция и значение, если и только если больше (или меньше, в зависимости от того, какое сравнение вы делаете) с вашей предыдущей "точкой"
  • 0
    Спасибо, вот о чем я думал. Так что мне понадобится цикл for с вложенным оператором if? Если оно больше, оно будет хранить значение, оно будет меньше следующей точки?
Теги:
arrays
2d
light
point

1 ответ

0

После того, как вы прочтете ввод, все, что вам нужно, это всего лишь несколько полезных методов
(например, sum, getNeighbours и isValidPoint) и несколько циклов.

Вот эскиз (не полномасштабное решение).
В ней я жестко закодировал образец sky ввода.

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

public class Test045 {

    private static int[][] sky = {
        {10,2,2},
        {10,5,1},
        {1,2,2}
    };

    public static void main(String[] args) {
        Point min = null;
        Point max = null;
        Integer sumMin = null;
        Integer sumMax = null;
        Integer s = null;
        for (int i=0; i<sky.length; i++){
            for (int j=0; j<sky[0].length; j++){
                s=sum(getNeighbours(i, j));

                if (sumMin==null || sumMin > s){
                    min = new Point(i,j);
                    sumMin = s;
                }

                if (sumMax==null || sumMax < s){
                    max = new Point(i,j);
                    sumMax = s;
                }
            }
        }

        System.out.println("Max Light at: " + max.x + ", " + max.y + 
                           " ; MAX Light = " + sumMax);
        System.out.println("Min Light at: " + min.x + ", " + min.y + 
                           " ; MIN Light = " + sumMin);
    }

    private static int sum(List<Point> lst){
        int sum = 0;
        for (Point p : lst){
            sum += sky[p.x][p.y];
        }
        return sum;
    }

    private static List<Point> getNeighbours(int ip, int jp){
        List<Point> lst = new ArrayList<Point>();
        for (int i=-1; i<=1; i++){
            for (int j=-1; j<=1; j++){
                if (isValidPoint(ip+i, jp+j)){
                    lst.add(new Point(ip+i, jp+j));
                }
            }
        }
        return lst;
    }

    private static boolean isValidPoint(int i, int j){
        return 
            i >= 0 && i < sky.length &&
            j >= 0 && j < sky[0].length;
    }

}
  • 0
    Спасибо за помощь! Все работает правильно. Теперь мне просто нужно написать методы для фильтра и негатива. Есть ли у вас какие-либо предложения о том, как сделать негатив? Есть ли что-то в Java, что я могу использовать, чтобы повернуть число между 0-1024 к его противоположности?
  • 0
    Просто понял, что было бы просто «вычесть себя из 1024», чтобы получить противоположное

Ещё вопросы

Сообщество Overcoder
Наверх
Меню