From 7adc3d54a84cd562240882c41d40e4e80bd38252 Mon Sep 17 00:00:00 2001 From: praktimarc <61456874+praktimarc@users.noreply.github.com> Date: Fri, 3 May 2024 00:01:09 +0200 Subject: [PATCH] Update AirPlane.java --- src/main/java/kst4contest/model/AirPlane.java | 158 +++++++++++------- 1 file changed, 99 insertions(+), 59 deletions(-) diff --git a/src/main/java/kst4contest/model/AirPlane.java b/src/main/java/kst4contest/model/AirPlane.java index b332530..84684ba 100644 --- a/src/main/java/kst4contest/model/AirPlane.java +++ b/src/main/java/kst4contest/model/AirPlane.java @@ -1,67 +1,107 @@ -package kst4contest.model; +package kst4contest.locatorUtils; -public class AirPlane { +public class DirectionUtils { - String apCallSign, apSizeCategory; - String potencialDescriptionAsWord; + /** + * Checks wheter a sked-sender writes to a sked-receiver and is in my direction due he beams to this receiver + * + * @param myLocator + * @param locatorOfSkedSender + * @param locatorOfSekdReceiver + * @param maxRangeKm + * @param hisAntennaBeamWidth + * @return + */ + public static boolean isInAngleAndRange(String myLocator, String locatorOfSkedSender, String locatorOfSekdReceiver, double maxRangeKm, double hisAntennaBeamWidth) { - public String getPotencialDescriptionAsWord() { - if (this.getPotential() <=50) { - return "small AP"; - } else if (this.getPotential() <=75 && this.getPotential() > 50) { - return "big AP"; - } else if (this.getPotential() > 75) { - return "very big AP"; - } + Location myLocation = new Location(myLocator); + Location skedSenderLocation = new Location(locatorOfSkedSender); + Location skedReceiverLocation = new Location(locatorOfSekdReceiver); + + double distanceFromMeToLocSender = new Location(myLocator).getDistanceKm(new Location(locatorOfSkedSender)); + + // Check if distance exceeds my setted maximum range + if (distanceFromMeToLocSender > maxRangeKm) { + System.out.println("too far, " + distanceFromMeToLocSender + " km"); + return false; + } + + //check bearing of sender to receiver + + double bearingOfSekdSenderToSkedReceiver = skedSenderLocation.getBearing(skedReceiverLocation); +// System.out.println("skedTX -> skedTX deg: " + bearingOfSekdSenderToSkedReceiver); + + double bearingOfSekdSenderToMe = skedSenderLocation.getBearing(myLocation); +// System.out.println("skedTX -> me deg: " + bearingOfSekdSenderToMe); + + /** + * simple mech works + */ +// if (bearingOfSekdSenderToMe >= bearingOfSekdSenderToSkedReceiver) { +// if (bearingOfSekdSenderToMe-bearingOfSekdSenderToSkedReceiver <= hisAntennaBeamWidth/2){ +// System.out.println(bearingOfSekdSenderToMe-bearingOfSekdSenderToSkedReceiver + " <= " + hisAntennaBeamWidth); +// return true; +// } +// } else if ((bearingOfSekdSenderToMe <= bearingOfSekdSenderToSkedReceiver)) { +// if (bearingOfSekdSenderToSkedReceiver-bearingOfSekdSenderToMe <= hisAntennaBeamWidth/2){ +// return true; +// } +// } else return false; + /** + * simple mech end + */ + + if (DirectionUtils.isAngleInRange(bearingOfSekdSenderToSkedReceiver, bearingOfSekdSenderToMe, hisAntennaBeamWidth)) { + //I may should get "/2" because of 50% of the 3dB opening angle if txer is directed to sender exactly +// System.out.println("------------> isinangleandrange!"); + return true; + } else { +// System.out.println("not in angle and reach"); + return false; + } + } - return potencialDescriptionAsWord; - } + /** + * Tests, if the angle (from me to) other station is in the range of the + * angle (qtf) in degrees where my antenna points to. + * + * @param toForeignAngle [degrees] + * @param mySelectedQTFAngle [degrees] + * @param antennaBeamwidth [degrees] + * @return + */ + public static boolean isAngleInRange(double toForeignAngle, + double mySelectedQTFAngle, double antennaBeamwidth) { - public void setPotencialDescriptionAsWord(String potencialDescriptionAsWord) { - this.potencialDescriptionAsWord = potencialDescriptionAsWord; - } + double beamwidth = antennaBeamwidth / 2; // half left, half right + + double startAngle = mySelectedQTFAngle - beamwidth; + double endAngle = mySelectedQTFAngle + beamwidth; + + // Normalize angles to be between 0 and 360 degrees + toForeignAngle = normalizeAngle(toForeignAngle); + startAngle = normalizeAngle(startAngle); + endAngle = normalizeAngle(endAngle); + + // Check if the range wraps around 360 degrees + if (startAngle <= endAngle) { + return toForeignAngle >= startAngle && toForeignAngle <= endAngle; + } else { + // Range wraps around 360 degrees, so check if angle is within the + // range or outside the range + return toForeignAngle >= startAngle || toForeignAngle <= endAngle; + } + } + + private static double normalizeAngle(double angle) { + if (angle < 0) { + angle += 360; + } + if (angle >= 360) { + angle -= 360; + } + return angle; + } - int distanceKm, potential, arrivingDurationMinutes; - public String getApCallSign() { - return apCallSign; - } - public void setApCallSign(String apCallSign) { - this.apCallSign = apCallSign; - } - public String getApSizeCategory() { - return apSizeCategory; - } - public void setApSizeCategory(String apSizeCategory) { - this.apSizeCategory = apSizeCategory; - } - public int getDistanceKm() { - return distanceKm; - } - public void setDistanceKm(int distanceKm) { - this.distanceKm = distanceKm; - } - public int getPotential() { - return potential; - } - public void setPotential(int potential) { - this.potential = potential; - } - public int getArrivingDurationMinutes() { - return arrivingDurationMinutes; - } - public void setArrivingDurationMinutes(int arrivingDurationMinutes) { - this.arrivingDurationMinutes = arrivingDurationMinutes; - } - - @Override - public String toString() { - - String toStringString = "\n"; - - toStringString += this.apCallSign + ", category: " + this.apSizeCategory + ", distance: " + this.getDistanceKm() + ", potential: " + this.potential + ", distance: " + this.getDistanceKm() + ", duration " + this.arrivingDurationMinutes + "" ; - - return toStringString; - } - }