First commit

This commit is contained in:
Joachim 2018-09-23 20:56:34 +02:00
commit 121a04e8f8
5 changed files with 6212 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
target
*.iml
.idea
data

89
pom.xml Normal file
View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>be.nielandt.joachim</groupId>
<artifactId>hyg-svg</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<kotlin.version>1.2.70</kotlin.version>
</properties>
<dependencies>
<dependency>
<groupId>com.singulariti.os</groupId>
<artifactId>ephemeris</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.2</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<jvmTarget>1.8</jvmTarget>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

File diff suppressed because it is too large Load Diff

255
src/main/java/SvgCreator.kt Normal file
View File

@ -0,0 +1,255 @@
import com.opencsv.CSVReaderBuilder
import com.singulariti.os.ephemeris.StarPositionCalculator
import com.singulariti.os.ephemeris.domain.Observatory
import com.singulariti.os.ephemeris.domain.Place
import com.singulariti.os.ephemeris.domain.Pole
import com.singulariti.os.ephemeris.domain.Star
import com.singulariti.os.ephemeris.utils.StarCatalog
import java.io.File
import java.io.FileReader
import java.time.Instant
import java.time.ZoneId
import java.time.ZonedDateTime
import java.util.*
import java.util.stream.Stream
import kotlin.math.absoluteValue
/**
* <svg width="100" height="100">
<circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
</svg>
180 becomes 18000 -> add 2 digits of precision to everything
*/
fun main(args: Array<String>) {
// set the place and time you want
val starPositionCalculator = StarPositionCalculator()
val observatory = getObservatory()
// at least get this absolute magnitude (smaller is brighter)
val apparentMagnitudeCutOff = 6.5
// make the svg file
File("stars.svg").printWriter().use { out ->
out.println("""<svg width="180" height="180">""")
out.println("""<circle cx="90" cy="90" r="90" stroke="white" stroke-width="1" fill="black" />""")
// history.forEach {
// out.println("${it.key}, ${it.value}")
// }
// second attempt
val calendarAstronomer = CalendarAstronomer(Date(Instant.parse("2018-10-05T10:15:30.00Z").toEpochMilli()))
var maxAltitude = Double.NEGATIVE_INFINITY
var minAltitude = Double.POSITIVE_INFINITY
var maxMagnitude = Double.NEGATIVE_INFINITY
var minMagnitude = Double.POSITIVE_INFINITY
// read the hyg database...
parseHygDB()
// filter stars visible to the naked eye
.filter { star ->
star.mag <= apparentMagnitudeCutOff
}
.forEach { star ->
if (star.absmag < minMagnitude)
minMagnitude = star.absmag
if (star.absmag > minMagnitude)
maxMagnitude = star.absmag
val star1 = Star(
null,
null,
null,
convertDegreesToHoursMinutesSeconds(star.ra),
convertDegreesToHoursMinutesSeconds(star.dec),
star.mag.toInt().toString(),
null,
null
)
// print the star
println("it = $star")
val position = starPositionCalculator.getPosition(star1, observatory)
// println("position = $position")
// is the star inside the radius?
// getDistanceFromLatLonInKm(observatory.latitude, observatory.longitude, position.);
// println("position.altitude = ${position.altitude}, ${position.azimuth} ${dmsToRad(position.altitude)}")
val altitude = dmsToRad(position.altitude)
assert(altitude.absoluteValue <= 90)
// only allow stars above the horizon
if (altitude >= 0) {
// alpha -> the angle on the circle, which would be the azimuth
val azimuth = dmsToRad(position.azimuth)
// r -> this represents the altitude, map it to 0-90
// altitude 0 means the outside of the circle... r is 90 then
val r = 90 - altitude
// draw the star! figure out an x,y coordinate on a circle
var y = Math.sin(azimuth) * r
var x = Math.cos(azimuth) * r
// shift everything +90 -> make sure the center of the circle is at (90,90)
y += 90
x += 90
// determine the size of the circle -> depending on the apparent magnitude
val circleR = ((star.mag - apparentMagnitudeCutOff) * -1) * 0.05
// print it to svg
val random = Random()
out.println("""<circle cx="${x}" cy="${y}" r="$circleR" fill="white"/>""")
}
if (altitude < minAltitude)
minAltitude = altitude
if (altitude > maxAltitude)
maxAltitude = altitude
// filter the stars on altitude
}
println("minAltitude = ${minAltitude}")
println("maxAltitude = ${maxAltitude}")
println("minMagnitude = ${minMagnitude}")
println("maxMagnitude = ${maxMagnitude}")
out.println("</svg>")
}
}
/**
* Convert XX:XX to degrees.
*/
fun dmsToRad(input: String): Double {
val resMod = if (input.startsWith("-")) -1 else 1
val split = input.split(":")
var result = 0.0
result += split[0].toDouble().absoluteValue
if (split.size > 1)
result += (split[1].toDouble() / 60)
return result * resMod
}
/**
* Default position: gontrodestraat
*/
fun getObservatory(name: String = "Default place name", latitude: Double = 51.027930, longitude: Double = 3.753585): Observatory {
val time = ZonedDateTime.of(2018, 10, 5, 16, 0, 0, 0, ZoneId.of("UTC")) //Date and time in UTC
val place = Place(name, latitude, Pole.NORTH, longitude, Pole.EAST, TimeZone.getTimeZone("Asia/Calcutta"), "", "")
return Observatory(place, time)
}
/**
* Convert 2.39483 degrees to X:Y:Z, X hours, Y minutes, Z seconds
*/
fun convertDegreesToHoursMinutesSeconds(degrees: Double): String {
val hours = Math.floor(degrees).toInt()
val minutesWithRest = (degrees - hours) * 60
val minutes = Math.floor(minutesWithRest).toInt()
val seconds = (minutesWithRest - minutes) * 60
val result = "$hours:$minutes:$seconds"
return result
}
fun testEphemeris() {
val starCalculator = StarPositionCalculator()
val casA = StarCatalog.byIdAndConstellation("a", "cas")
// val casAPosition = starCalculator.getPosition(casA, hassan)
// println("casA = $casAPosition")
}
fun getDistanceFromLatLonInKm(lat1: Double, lon1: Double, lat2: Double, lon2: Double): Double {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2 - lat1); // deg2rad below
var dLon = deg2rad(lon2 - lon1);
var a =
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon / 2) * Math.sin(dLon / 2)
;
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c; // Distance in km
return d
}
fun deg2rad(deg: Double): Double {
return deg * (Math.PI / 180)
}
/**
* Read the HYG database.
*/
fun parseHygDB(): Stream<Starr> {
// get the csv reader
val csvReader = CSVReaderBuilder(FileReader("data/hygdata_v3.csv"))
.withSkipLines(1)
.build()
// stream the lines
// indices that we're interested in
val id = 0
val hip = 1
val hd = 2
val hr = 3
val gl = 4
val bf = 5
val proper = 6
val ra = 7
val dec = 8
val dist = 9
val pmra = 10
val pmdec = 11
val rv = 12
val mag = 13
val absmag = 14
val spect = 15
val ci = 16
val x = 17
val y = 18
val z = 19
val vx = 20
val vy = 21
val vz = 22
val rarad = 23
val decrad = 24
val pmrarad = 25
val pmdecrad = 26
val bayer = 27
val flam = 28
val con = 29
val comp = 30
val comp_primary = 31
val base = 32
val lum = 33
val varrrr = 34
val var_min = 35
return csvReader.map {
// println("it = ${Arrays.toString(it)}")
Starr(
ra = it[ra].toDouble(),
dec = it[dec].toDouble(),
mag = it[mag].toDouble(),
absmag = it[absmag].toDouble()
)
}.stream()
}
data class Starr(val ra: Double, val dec: Double, val mag: Double, val absmag: Double)

4207
stars.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 379 KiB