Hi,
I'm working on a star map (graphics program), the final output of the program is similar to:
http://nifty.stanford.edu/2009/reid-.../starchart.jpg
These are the steps i follow:
Step 1
Write a method to convert between star coordinate system to the Java picture coordinate system.
The star coordinate system has (0,0) in the center, and −1 and 1 as the extremes.
The Java graphics coordinate system has (0,0) as the top-left corner, and positive numbers extend down and right up to the screen size.
---->diagram:
http://i45.tinypic.com/2z4fgog.jpg
Step 2
Read the contents of the star-data.txt file, and plot the stars on a Java graphics window. Use a black background, and plot the stars as white circles.
|
Quote:
|
star-data.txt contains info on 3,526 stars, this number appears on the first line of the file.
Subsequent lines has the following fields:
-x, y coordinates for stars (in star coordinate system, e.g. 0.512379, 0.020508)
- Henry Draper number (just a unique identifer for the star)
-magnitude (or brightness of star)
-names of some stars. A star may have several names.
|
Step 3
Vary the size of the circles to reflect their magnitude. Since brighter stars have smaller magnitude values, you will need to calculate the circle radius, say, 10/(magnitude + 2).
Step 4
Read from all files in constellation folder, and plot them on top of the stars.
Each file contains pairs of star names that make up lines in the constellation.
I have already done Steps 1 - 3.
I'm using files :
-
StarApp.java as my application class that has main() method
-
StarJFrame.java ,this class creates the window & defines its properties & behavior
-
StarJPanel.java ---> heres the code, for this class, below
-
Star.java -----> heres the code, for this class, below
|
Code:
|
StarJPanel.java
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Scanner;
public class StarJPanel extends JPanel implements ActionListener {
private Star[] stars;
private Timer timer;
public StarJPanel() {
setBackground(Color.black);
timer = new Timer(5, this);
stars = getArrayOfStars();
timer.start();
}
private Star[] getArrayOfStars() {
// This method reads the Stars data from a file and stores it in the stars array.
int howMany = Integer.parseInt(Keyboard.readInput());
Star[] stars = new Star[howMany];
for (int i = 0; i < stars.length; i++) {
String input = Keyboard.readInput();
Scanner fields = new Scanner(input);
double x = Double.parseDouble(fields.next());
double y = Double.parseDouble(fields.next());
int draper = Integer.parseInt(fields.next());
double magnitude = Double.parseDouble(fields.next());
String namesString = "";
String[] names = {};
if (fields.hasNext()) {
namesString = fields.nextLine();
names = namesString.trim().split("; ");
}
stars[i] = new Star(x, y, draper, magnitude, names);
}
return stars;
}
public void actionPerformed(ActionEvent e) {
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for(int i = 0; i < stars.length; i++) {
stars[i].coordinateToPixel(stars[i].getX(), stars[i].getY());
stars[i].drawStar(g);
}
}
} |
|
Code:
|
Star.java
import java.awt.*;
import javax.swing.*;
public class Star {
private double x, y; // coordinates of star
private int draper; // Henry Draper number (unique identifier)
private double magnitude; // Magnitude (brightness) of star
private String[] names; // Star name(s) - not always present
private int newX;
private int newY;
private int size;
public Star( double x, double y, int draper, double magnitude, String[] names ) {
this.x = x;
this.y = y;
this.draper = draper;
this.magnitude = magnitude;
this.names = names;
size = (int)(10/(magnitude + 2));
}
public void coordinateToPixel(double x, double y) {
newX = (int) ( (x + 1) * 350);
newY = (int) ( (y - 1) * -350);
}
public void drawStar(Graphics g) {
g.setColor(Color.white);
g.drawOval( newX, newY, size, size);
}
public int getNumberOfNames() {
return names.length;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
} |
As you can see I have done:
Step 1: in
Star class, with method:
coordinateToPixel(double x, double y)
Step 2: in
StarJPanel class with method:
private Star[] getArrayOfStars()
(PS: I'm also using
Keyboard class to read lines from the stars.txtfile)
Step 3: in
Star class, with method:
drawStar(Graphics g), where
size = (int)(10/(magnitude + 2));
Please tell me if I have done 3 steps without confusing & incoherent code, I guess I have written the code differently from what ppl write. Somehow thats how we were taught to write. For me, my way gets a bit confusing sometimes!!
Now I'm left stuck with
Step 4.
I have a folder where all my StarApp, StarJPanel, etc files are & a folder called
Constellation
Inside constellation folder I have files that contain pairs of star names that make up lines in the constellation.
--Heres the constellation folder & star-data.txt file:
Constellations & star-data.rar
Although I'm thinkin i can use below code to read contents in files & use
g.drawLine somewhere in
StarJPanel. But I'm not sure how to find same names of stars in constellation files with names in the already set array from star-data & then join the coordinates with
g.drawLine ???
|
Code:
|
import java.io.*;
public class reader {
public static void main(String args[]) throws Exception {
FileReader fr = new FileReader("Constellation/...."); /** Don't know what to put in ....... **/
BufferedReader br = new BufferedReader(fr);
String s;
while((s = br.readLine()) != null) {
System.out.println(s);
}
fr.close();
}
} |
Not sure how Step 4 is done please guide me.