Функция Plot не выполняет то, что я ожидаю

#java #plot

#java #график

Вопрос:

В следующем коде у меня есть класс CentralPoints и класс RandomPunt, которые я хочу построить. я пытаюсь построить это, используя следующий код.

 package opdracht1;

import java.awt.Color;
import java.awt.Dimension;
import java.util.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import org.math.plot.*;
import javax.swing.*;

/**
 *
 * @author Falko amp; Daniël
 */
public class Opdracht1_1 
{
    private static Opdracht1_1 op = new Opdracht1_1();
    private int k = 2;

    private double[] puntenX = {1.0,1.5,3.0,5.0,3.5,4.5,3.5};
    private double[] puntenY = {1.0,2.0,4.0,7.0,5.0,5.0,4.5};

    private double xmin = 0;
    private double xmax = 5;
    private double ymin = 0;
    private double ymax = 7;

    private List<CentralPoints> centralpoints;

    public static void main(String[] args)
    {
        op.vindcentralepunten(3, 0.0, 0.0, 5.0, 7.0, 7);
    }
    public void plotGraph(int count) 
    {
        Color[] colors = {Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.white, Color.yellow, Color.black};

        // create your PlotPanel (you can use it as a JPanel)
        Plot2DPanel plot = new Plot2DPanel();

        double[] centralX = new double[centralpoints.size()], centralY = new double[centralpoints.size()];
        for(int i = 0; i < centralpoints.size(); i  ) 
        {
            centralX[i] = centralpoints.get(i).getX();
            centralY[i] = centralpoints.get(i).getY();
        }
        for(int i=0;i<centralpoints.size();i  ) //centralpoints.size()
        {
            try 
            {
                double[] targetX = new double[centralpoints.get(i).getList().size()];
                double[] targetY = new double[centralpoints.get(i).getList().size()];

                for(int j = 0; j < centralpoints.get(i).getList().size(); j  )
                {
                    targetX[j] = centralpoints.get(i).getList().get(j).getX();
                    targetY[j] = centralpoints.get(i).getList().get(j).getY();
                }
                //System.out.println(targetX.length " lengthh " targetY.length);
                //System.out.println(targetX[0] " hallooooo " targetY[0]); //1.0 1.0

                System.out.println("Net voordat ik plot!");
                for(double x : targetX) System.out.println("x: " x);

                for(double y : targetY) System.out.println("y: " y);
                //System.out.println(targetX[1] "" targetY[1]);
                switch(i) 
                {
                    case 0: plot.addScatterPlot("my plot", colors[0], targetX, targetY); break;
                    //case 1: plot.addScatterPlot("my plot", colors[9], targetX, targetY); break;
                    //case 2: plot.addScatterPlot("my plot", colors[4], targetX, targetY); break;
                    //case 3: plot.addScatterPlot("my plot", colors[11], targetX, targetY); break;
                    //case 4: plot.addScatterPlot("my plot", colors[6], targetX, targetY); break;
                }
            } 
            catch(NullPointerException npe) 
            {
                System.out.println(npe);
            }
        }
        //Voeg central punten toe
        //plot.addScatterPlot("my plot", colors[12], centralX, centralY);

        JFrame frame = new JFrame("plot panel: " count);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);

        frame.setContentPane(plot);
        frame.setVisible(true);

    }
    public void vindcentralepunten(int k, double xmin, double ymin, double xmax, double ymax, int aantalwillekeurigePunten) 
    {
        List<RandomPunt> randompoints = new ArrayList<RandomPunt>();
        centralpoints = new ArrayList<CentralPoints>();

        Random rand = new Random();

        for(int i = 0; i<k; i  ) 
        {
            CentralPoints cp = new CentralPoints();
            //cp.setx(rand.nextDouble()*(xmax-xmin) 1);
            //cp.sety(rand.nextDouble()*(ymax-ymin) 1);
            cp.setX(i 2);
            cp.setY(i 2);
            centralpoints.add(cp);
        }
        for(int j = 0; j<puntenX.length; j  ) 
        {
            RandomPunt rp = new RandomPunt();
            rp.setX(puntenX[j]);
            rp.setY(puntenY[j]);
            randompoints.add(rp);
        }

        Boolean[] done = new Boolean[centralpoints.size()];
        for(int i = 0; i < centralpoints.size(); i  ) 
        {
            done[i] = false;
        }
        int count = 1;
        double[] oldx = new double[centralpoints.size()],
                oldy = new double[centralpoints.size()];
        for(RandomPunt rp : randompoints)
        {
            double smallest = 10000000.0, totaleafstand = 0.0;
            CentralPoints smallestCp = null, current = null;
            for(CentralPoints cp : centralpoints)
            {
                try { if(cp.getList().contains(rp)) current = cp;}
                catch(NullPointerException npe){}
                if(pythagoras(rp.getX(),rp.getY(),cp.getX(),cp.getY())<smallest) 
                {
                    smallest = pythagoras(rp.getX(),rp.getY(),cp.getX(),cp.getY());
                    smallestCp = cp;
                    totaleafstand = totaleafstand   pythagoras(rp.getX(), rp.getY(), cp.getX(), cp.getY());
                }
            }
            double afstand = smallestCp.getAfstand()   pythagoras(rp.getX(), rp.getY(), smallestCp.getX(), smallestCp.getY());
            smallestCp.setAfstand(afstand);

            List<RandomPunt> list = new ArrayList<RandomPunt>();
            if(smallestCp.getList()!=null) 
            {
                list = smallestCp.getList();
            }
            if(current!=null) current.getList().remove(rp);
            list.add(rp);
            smallestCp.setList(list);
        }
        while(Arrays.asList(done).contains(false)) 
        {
            op.plotGraph(count);
            for(int centp = 0; centp < centralpoints.size(); centp  ) 
            {
                try 
                {
                    double smallestx = 10000000.0,
                            smallesty = 10000000.0,
                            biggestx = 0.0,
                            biggesty = 0.0;
                    for(RandomPunt randp : centralpoints.get(centp).getList()) 
                    {
                        if(smallestx > randp.getX()) smallestx=randp.getX();
                        if(smallesty > randp.getY()) smallesty=randp.getY();
                        if(biggestx < randp.getX()) biggestx=randp.getX();
                        if(biggesty < randp.getY()) biggesty=randp.getY();
                    }
                    double x = (biggestx smallestx)/2;
                    double y = (biggesty smallesty)/2;
                    System.out.println(biggestx " " smallestx "/2=" x);
                    System.out.println(biggesty " " smallesty "/2=" y);

                    if(oldx[centp] == x amp;amp; oldy[centp] == y) done[centp] = true;
                    centralpoints.get(centp).setX(x);
                    centralpoints.get(centp).setY(y);
                    oldx[centp] = x;
                    oldy[centp] = y;
                } 
                catch(NullPointerException npe) 
                {
                    done[centp] = true;
                }
            }
            count  ;
        }
        //op.plotGraph(count);
    }
    public double pythagoras(double rpx, double rpy, double cpx, double cpy) { return Math.sqrt(Math.pow((rpx-cpx), 2) Math.pow((rpy-cpy), 2)); }
}
  

Теперь я ожидаю получить точки (randomompunt) в следующих координатах:

 x:1.0 y:1.0
x:1.5 y:2.0
x:3.0 y:4.0
x:5.0 y:7.0
x:3.5 y:5.0
x:4.5 y:5.0
x:3.5 y:4.5
  

Странная вещь и реальная проблема, с которой мы сталкиваемся сейчас, заключается в том, что первые 2 точки (randomompunt) расположены в неправильном месте, они расположены по этим координатам:

 x:1.0 y:1.5
x:1.0 y:2.0
  

Кто-нибудь видит, где в коде что-то не так?:)

Большое спасибо за помощь

Комментарии:

1. К вашему сведению: это плохая практика, чтобы поймать NullPointerException . Бит, в котором вы ловите NullPointerException и делаете done[centp] = true; , также кажется очень подозрительным.

2. Похоже, вы где-то перепутали x и y перепутали на основе этих чисел (фактический результат — это транспонирование ожидаемого результата)… и вы не указали определение RandomPunt , в котором может быть ошибка.

Ответ №1:

У вас в строке 149 очень подозрительное утверждение:

 list.add(rp);
  

где rp находится переменная цикла, выполняющая итерацию по списку randompoints , который был заполнен парами координат из puntenX и puntenY .

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