From e385ac5c09eb840f9182b53c908eb4fc5a10c00b Mon Sep 17 00:00:00 2001 From: William Muir Date: Mon, 22 May 2017 15:39:53 +1200 Subject: [PATCH] Initial work on static parser class for polar files story[956] --- pom.xml | 6 + src/main/java/seng302/models/PolarTable.java | 116 +++++++++++++++++++ src/main/resources/config/acc_polars.csv | 8 ++ 3 files changed, 130 insertions(+) create mode 100644 src/main/java/seng302/models/PolarTable.java create mode 100644 src/main/resources/config/acc_polars.csv diff --git a/pom.xml b/pom.xml index 8d10c6fc..ea43245e 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,12 @@ commons-io 1.3.2 + + + com.opencsv + opencsv + 3.9 + com.googlecode.json-simple json-simple diff --git a/src/main/java/seng302/models/PolarTable.java b/src/main/java/seng302/models/PolarTable.java new file mode 100644 index 00000000..578a3a7b --- /dev/null +++ b/src/main/java/seng302/models/PolarTable.java @@ -0,0 +1,116 @@ +package seng302.models; + +import java.io.*; +import java.util.HashMap; + +/** + * A static class for parsing and storing the polars. Will parse the whole polar table and also store the optimised + * upwind and downwind in separate tables here as well + * Created by wmu16 on 22/05/17. + */ +public final class PolarTable { + + //A Polar table will consist of a wind speed key to a hashmap value of pairs of wind angles and boat speeds + private static HashMap> polarTable; + private static HashMap> upwindOptimal; + private static HashMap> downwindOptimal; + + private static int upTwaIndex; + private static int dnTwaIndex; + + + /** + * Iterates through each row of the polar table, in pairs, to extract the row into a hashmap of angle to boat speed. + * These angle boatspeed hashmaps are then added to an outer hashmap at the end of wind speed key to each row hashmap + * as a value + * @param file containing the polar csv information + */ + public static void parsePolarFile(String file) { + polarTable = new HashMap<>(); + upwindOptimal = new HashMap<>(); + downwindOptimal = new HashMap<>(); + + String line; + Boolean isHeaderLine = true; + + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + while ((line = br.readLine()) != null) { + String[] thisLine = line.split(","); + + //Initial line in file + if (isHeaderLine) { + deduceHeaders(thisLine); + isHeaderLine = false; + } else { + HashMap thisPolar = new HashMap<>(); + HashMap thisUpWindPolar = new HashMap<>(); + HashMap thisDnWindPolar = new HashMap<>(); + Double thisWindSpeed = Double.parseDouble(thisLine[0]); + + // -3 <== -1 for length -1, and a further -2 as we iterate in pairs of 2 so finish before final 2 + for (int i = 1; i < thisLine.length; i += 2) { + Double thisWindAngle = Double.parseDouble(thisLine[i]); + Double thisBoatSpeed = Double.parseDouble(thisLine[i + 1]); + thisPolar.put(thisWindAngle, thisBoatSpeed); + if (i == upTwaIndex) { + thisUpWindPolar.put(thisWindAngle, thisBoatSpeed); + } else if (i == dnTwaIndex) { + thisDnWindPolar.put(thisWindAngle, thisBoatSpeed); + } + } + + polarTable.put(thisWindSpeed, thisPolar); + upwindOptimal.put(thisWindSpeed, thisUpWindPolar); + downwindOptimal.put(thisWindSpeed, thisDnWindPolar); + } + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + + + /** + * Parses the header line of a polar file + * @param thisLine The line which is the header of a polar file + */ + private static void deduceHeaders(String[] thisLine) { + + for (int i = 0; i < thisLine.length; i++) { + String thisItem = thisLine[i]; + if (thisItem.toLowerCase().startsWith("uptwa")) { + upTwaIndex = i; + } + else if (thisItem.toLowerCase().startsWith("dntwa")) { + dnTwaIndex = i; + } + } + } + + + /** + * @return The entire polar table + */ + public static HashMap> getPolarTable() { + return polarTable; + } + + + /** + * @return The polar table just containing the optimal upwind values + */ + public static HashMap> getUpwindOptimal() { + return upwindOptimal; + } + + + /** + * @return The polar table just containing the optimal downwind values + */ + public static HashMap> getDownwindOptimal() { + return downwindOptimal; + } + +} \ No newline at end of file diff --git a/src/main/resources/config/acc_polars.csv b/src/main/resources/config/acc_polars.csv new file mode 100644 index 00000000..ee7ea80e --- /dev/null +++ b/src/main/resources/config/acc_polars.csv @@ -0,0 +1,8 @@ +Tws,Twa0,Bsp0,Twa1,Bsp1,UpTwa,UpBsp,Twa2,Bsp2,Twa3,Bsp3,Twa4,Bsp4,Twa5,Bsp5,Twa6,Bsp6,DnTwa,DnBsp,Twa7,Bsp7 +4,0,0,30,4,45,8,60,9,75,10,90,10,115,10,145,10,155,10,175,4 +8,0,0,30,7,43,10,60,11,75,11,90,11,115,12,145,12,153,12,175,10 +12,0,0,30,11,43,14.4,60,16,75,20,90,23,115,24,145,23,153,21.6,175,14 +16,0,0,30,12,42,19.2,60,25,75,27,90,31,115,32,145,30,153,28.8,175,20 +20,0,0,30,13,41,24,60,29,75,37,90,39,115,40,145,38,153,36,175,24 +25,0,0,30,15,40,30,60,38,75,44,90,49,115,50,145,49,151,47,175,30 +30,0,0,30,15,42,30,60,37,75,42,90,48,115,49,145,48,150,46,175,32