Есть ли способ перебрать массив кругов, чтобы я мог определить, какие круги перекрываются и изменить цвет - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть массив, состоящий из 50 кругов, и я могу заставить их отображаться при запуске приложения. Я чувствую, что либо у меня неверная логика, когда я пытаюсь определить расстояние между кругами, либо я неправильно устанавливаю цвет после проведения сравнения.

Это мой ГЛАВНЫЙ кружок. Одно из требований к назначению состояло в том, чтобы кружок был отдельным отдельным классом.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package CircleJavier;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.Group;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.control.Label;
import java.util.Random;
import javafx.scene.paint.Paint;
import javafx.scene.transform.Scale;
import javafx.scene.shape.*;


/**
 *
 * @author javyc
 */
public class Circ extends Group {
        Random rand = new Random();
        int x = rand.nextInt(300);
        int y = rand.nextInt(300);
        int rad = rand.nextInt(35);
        Paint fill = Color.RED;

    public Circ()
    {


        Circle cockpit = new Circle();
            cockpit.setCenterX(x);
            cockpit.setCenterY(y);
            cockpit.setRadius(rad);
            cockpit.setFill(fill);



        boolean addAll;
        addAll = getChildren().addAll(cockpit);
                   }


                         }

Это мой основной код приложения, который, как мне кажется, таит в себе проблему во втором цикле for?

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package CircleJavier;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.Group;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.control.Label;
import java.util.Random;
import javafx.scene.paint.Paint;
import javafx.scene.transform.Scale;
import javafx.scene.shape.*;

/**
 *
 * @author javyc
 */
public class CircleJavier extends Application {

    @Override
    public void start(Stage primaryStage) {
//        Circ circ1 = new Circ();
//        Circ circ2 = new Circ();
//        Circ circ3 = new Circ();
//        Circ circ4 = new Circ();
//        Circ circ5 = new Circ();

        Circ[] circleArray = new Circ[50];
            for (int i = 0 ; i < circleArray.length; i++){
                Circ circle = new Circ();
                circleArray[i] = circle;

                boolean overlaps = false;

                for (int j = 0; j<i; j++){
                    double center = circleArray[j].x;
                    double dx = center - circle.x;
                    double y = circleArray[j].y;
                    double dy = y - circle.y;
                    double radius = circleArray[j].rad;

                    double dist = Math.sqrt((dx * dx)+(dy *dy));

                    if (dist <= (circle.rad + radius)) {

                        circleArray[i].fill = Color.AQUAMARINE;               
                        overlaps = true;
                        circleArray[j].fill = Color.CADETBLUE;
                    } 
                }
                if (!overlaps){
                    circleArray[i].fill = Color.BLACK;

                }
            }

        Group root = new Group();
        root.getChildren().addAll(circleArray);
        Scene Scene = new Scene(root, 500,350, Color.WHITE);



        primaryStage.setTitle("Elephant Javier!");
        primaryStage.setScene(Scene);
        primaryStage.show();   

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

1 Ответ

0 голосов
/ 16 апреля 2019

Основная проблема в том, что вы просто обновляете эталон краски новым значением.Это не относится к кругу.Если вы хотите применить на круге, создайте метод в Circ, который принимает Paint и установить на круг.

public class Circ extends Group {
    Random rand = new Random();
    int x = rand.nextInt(300);
    int y = rand.nextInt(300);
    int rad = rand.nextInt(35);
    Paint fill = Color.RED;
    Circle cockpit;
    public Circ() {
        cockpit = new Circle();
        cockpit.setStyle("-fx-stroke-width:1px;-fx-stroke:black;-fx-opacity:.5");
        cockpit.setCenterX(x);
        cockpit.setCenterY(y);
        cockpit.setRadius(rad);
        cockpit.setFill(fill);
        getChildren().addAll(cockpit);
    }

    public void setFill(Color clr) {
        cockpit.setFill(clr);
    }
}

И установите заливку, вызвав setFill of Circ.

circleArray[i].setFill(Color.AQUAMARINE);
circleArray[j].setFill(Color.CADETBLUE);
circleArray[i].setFill(Color.BLACK);

Установка некоторого обводки и непрозрачности может дать визуальную обратную связь перекрытия;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...