在下面的代码中,我有一个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 & 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 && 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)); }
}
现在我希望在以下坐标处得到分数(randompunt):
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个点(randompunt)被放置在错误的位置,它们被放置在这些坐标上:
x:1.0 y:1.5
x:1.0 y:2.0
有人看到代码中出错的地方吗?:)
非常感谢您的帮助
答案 0 :(得分:1)
你在第149行有一个非常可疑的陈述:
list.add(rp);
其中rp
是遍历列表randompoints
的循环变量,该列表已填充puntenX
和puntenY
的坐标对。
我认为这些要点应保持不变;因此,将其中一个实例传递到一个列表中,该列表最终会出现在可能发生事情的另一组对象中:复制操作会更安全。