/*PS: This topic has something to do with Java graphics as well*/
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.
Step 3star-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.
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
[B]StarJPanel.java[/B] 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); } } }
[B]Star.java[/B] 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 ???
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.
By the way, I'm using textpad as my editor & complier.
So I have to go: Tools > Run in parameters i put: StarApp < star-data.txt inorder to load the Stars into screen.