From 66aa136ce5da900c216532189e94ec896351014d Mon Sep 17 00:00:00 2001 From: Geoffrey Hunter Date: Sun, 18 Feb 2018 17:21:59 -0800 Subject: [PATCH 1/4] 'Distance Between Two Points' calculator now draws great circle between the two points. --- changelog.md | 4 +- .../MainView.vue | 40 ++++++++++--------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/changelog.md b/changelog.md index 066837c1..4c761c0e 100644 --- a/changelog.md +++ b/changelog.md @@ -6,10 +6,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Added +- 'Distance Between Two Points' calculator now draws great circle between the two points. + ### Changed - Updated changelog to 'Keep a Changelog' standards, closes #159. - ## [v3.0.0] - 2018-02-18 ### Added diff --git a/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/MainView.vue b/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/MainView.vue index 2ab30bcf..98eb5068 100644 --- a/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/MainView.vue +++ b/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/MainView.vue @@ -240,16 +240,17 @@ }, render: function () { console.log('render() called. this.water =') - console.log(this.water - - - ) + console.log(this.water) this.context.clearRect(0, 0, this.width, this.height) this.fill(this.water, this.colorWater) + console.log('this.graticule = ') + console.log(this.graticule) this.stroke(this.graticule, this.colorGraticule) this.fill(this.land, this.colorLand) + + if(this.point1Coord != null) { // console.log('this.point1 = ' + this.point1.GetLat_rad() + ', ' + this.point1.GetLon_rad()) var point = this.projection([this.point1Coord.GetLon_deg(), this.point1Coord.GetLat_deg()]) @@ -267,19 +268,21 @@ this.context.fill() } - // if(this.point1 != null && this.point2 != null) { - // var circle = d3.geo.circle().angle(180).origin([0, 52]); - // var circles = [circle()]; - // this.context.beginPath(); - // this.path({type: "GeometryCollection", geometries: circles}); - // this.context.fillStyle = "rgba(0,100,0,.5)"; - // this.context.fill(); - // this.context.lineWidth = .2; - // this.context.strokeStyle = "#000"; - // this.context.stroke(); - // } - - + if(this.point1Coord != null && this.point2Coord != null) { + var oldLineWidth = this.context.lineWidth + var line = { + type: "MultiLineString", + coordinates: [[ + [this.point1Coord.GetLon_deg(), this.point1Coord.GetLat_deg()], + [this.point2Coord.GetLon_deg(), this.point2Coord.GetLat_deg()] + ]]} + this.context.beginPath() + this.path(line) + this.context.strokeStyle = "red" + this.context.lineWidth = 3 + this.context.stroke() + this.context.lineWidth = oldLineWidth + } }, @@ -314,9 +317,10 @@ this.context = this.canvas.node().getContext('2d') this.projection = d3.geoOrthographic().precision(0.1) + console.log('blah = ') + console.log(d3.geoGraticule10()) this.graticule = d3.geoGraticule10() this.path = d3.geoPath(this.projection).context(this.context) - // this.loadData(this.loadDataCallback) this.land = topojson.feature(world110m, world110m.objects.land) this.countries = topojson.feature(world110m, world110m.objects.countries) From eb025fddc7cbce3936931d2d58c41d1a63529d2a Mon Sep 17 00:00:00 2001 From: Geoffrey Hunter Date: Sun, 18 Feb 2018 18:17:01 -0800 Subject: [PATCH 2/4] Points drawn on sphere now disappear when they rotate around the back of the sphere. --- changelog.md | 1 + .../DistanceBetweenTwoCoordinates/MainView.vue | 10 ++-------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/changelog.md b/changelog.md index 4c761c0e..3e9b7988 100644 --- a/changelog.md +++ b/changelog.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - 'Distance Between Two Points' calculator now draws great circle between the two points. +- Points drawn on sphere now disappear when they rotate around the back of the sphere. ### Changed - Updated changelog to 'Keep a Changelog' standards, closes #159. diff --git a/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/MainView.vue b/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/MainView.vue index 98eb5068..81f24c85 100644 --- a/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/MainView.vue +++ b/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/MainView.vue @@ -248,23 +248,17 @@ this.stroke(this.graticule, this.colorGraticule) this.fill(this.land, this.colorLand) - - - if(this.point1Coord != null) { - // console.log('this.point1 = ' + this.point1.GetLat_rad() + ', ' + this.point1.GetLon_rad()) - var point = this.projection([this.point1Coord.GetLon_deg(), this.point1Coord.GetLat_deg()]) this.context.beginPath() this.context.fillStyle = "red"; - this.context.arc(point[0], point[1], 5, 0, 2*Math.PI) + this.path({ type: "Point", coordinates: [this.point1Coord.GetLon_deg(), this.point1Coord.GetLat_deg()]}) this.context.fill() } if(this.point2Coord != null) { - var point = this.projection([this.point2Coord.GetLon_deg(), this.point2Coord.GetLat_deg()]) this.context.beginPath() this.context.fillStyle = "red"; - this.context.arc(point[0], point[1], 5, 0, 2*Math.PI) + this.path({ type: "Point", coordinates: [this.point2Coord.GetLon_deg(), this.point2Coord.GetLat_deg()]}) this.context.fill() } From 8acdbccc94c8ebb51855d4700d435b2f1735f91a Mon Sep 17 00:00:00 2001 From: Geoffrey Hunter Date: Sun, 18 Feb 2018 19:07:23 -0800 Subject: [PATCH 3/4] Added mid-point calculation (and visuals) to 'Two Coordinate Geodesics' calculator. --- changelog.md | 2 + src/components/App/App.vue | 4 +- .../DistanceBetweenTwoCoordinates/Calc.js | 10 --- .../grid-icon.png | Bin 8493 -> 0 bytes .../Geospatial/TwoCoordinateGeodesics/Calc.js | 10 +++ .../MainView.vue | 62 +++++++++++++++++- .../TwoCoordinateGeodesics/grid-icon.png | Bin 0 -> 35809 bytes .../world-110m.json | 0 8 files changed, 74 insertions(+), 14 deletions(-) delete mode 100644 src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/Calc.js delete mode 100644 src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/grid-icon.png create mode 100644 src/components/Calculators/Geospatial/TwoCoordinateGeodesics/Calc.js rename src/components/Calculators/Geospatial/{DistanceBetweenTwoCoordinates => TwoCoordinateGeodesics}/MainView.vue (81%) create mode 100644 src/components/Calculators/Geospatial/TwoCoordinateGeodesics/grid-icon.png rename src/components/Calculators/Geospatial/{DistanceBetweenTwoCoordinates => TwoCoordinateGeodesics}/world-110m.json (100%) diff --git a/changelog.md b/changelog.md index 3e9b7988..56da2392 100644 --- a/changelog.md +++ b/changelog.md @@ -9,9 +9,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - 'Distance Between Two Points' calculator now draws great circle between the two points. - Points drawn on sphere now disappear when they rotate around the back of the sphere. +- Added mid-point calculation (and visuals) to 'Two Coordinate Geodesics' calculator. ### Changed - Updated changelog to 'Keep a Changelog' standards, closes #159. +- Renamed 'Distance Between Two Points' calculator to 'Two Coordinate Geodesics'. ## [v3.0.0] - 2018-02-18 diff --git a/src/components/App/App.vue b/src/components/App/App.vue index 9507f6e1..c47b9435 100644 --- a/src/components/App/App.vue +++ b/src/components/App/App.vue @@ -59,7 +59,7 @@ import { ntcThermistorTemperature } from '../Calculators/Electronics/Sensors/NtcThermistor/Calc' import { buckConverterCalculator } from '../Calculators/Electronics/Smps/BuckConverter/Calc' - import { distanceBetweenTwoCoordinates } from "../Calculators/Geospatial/DistanceBetweenTwoCoordinates/Calc"; + import { twoCoordinateGeodesics } from "../Calculators/Geospatial/TwoCoordinateGeodesics/Calc"; import { crcCalculator } from '../Calculators/Software/Crc/Calc' @@ -200,7 +200,7 @@ // ================= GEOSPATIAL =============== // // ============================================ // - this.$store.dispatch('registerCalc', distanceBetweenTwoCoordinates) + this.$store.dispatch('registerCalc', twoCoordinateGeodesics) // ============================================ // // ================== SOFTWARE ================ // diff --git a/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/Calc.js b/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/Calc.js deleted file mode 100644 index f19950c2..00000000 --- a/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/Calc.js +++ /dev/null @@ -1,10 +0,0 @@ -import MainView from './MainView' - -export var distanceBetweenTwoCoordinates = { - displayName: 'Distance Between Two Coordinates', - description: 'Calculate the great-circle distance between two coordinates specified by latitude/longitude.', - imagePath: require('./grid-icon.png'), - category: [ 'Geospatial' ], - tags: [ 'coordinate', 'distance', 'great circle', 'latitude', 'longitude' ], - mainView: MainView -} diff --git a/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/grid-icon.png b/src/components/Calculators/Geospatial/DistanceBetweenTwoCoordinates/grid-icon.png deleted file mode 100644 index 4775fdbe2b1cba652ad6d1cf4fb094579440dced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8493 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 m|Jk$q|G{4Xe84Ykqbyi9-Cg|`JK(PwP= + + Intermediate Point Fraction + + + + Coordinates + + @@ -95,9 +103,10 @@ ], selCoordinateUnit: 'Degrees', - point1String: null, - point2String: null, + point1String: '-20, -30', + point2String: '40, 20', distanceUnits: 'km', + intermediatePointFraction: 0.5, canvas: null, water: {type: 'Sphere'}, @@ -203,6 +212,44 @@ } return bearing_units.toPrecision(4) + }, + intermediatePointCoordinates: function() { + if(!this.distance) + return '' + + const p1Lat = this.point1Coord.GetLat_rad() + const p1Lon = this.point1Coord.GetLon_rad() + const p2Lat = this.point2Coord.GetLat_rad() + const p2Lon = this.point2Coord.GetLon_rad() + const f = parseFloat(this.intermediatePointFraction) + const d = this.distance/this.geospatial.EARTH_RADIUS_M + + var A = Math.sin((1-f)*d)/Math.sin(d) + var B = Math.sin(f*d)/Math.sin(d) + var x = A*Math.cos(p1Lat)*Math.cos(p1Lon) + B*Math.cos(p2Lat)*Math.cos(p2Lon) + var y = A*Math.cos(p1Lat)*Math.sin(p1Lon) + B*Math.cos(p2Lat)*Math.sin(p2Lon) + var z = A*Math.sin(p1Lat) + B*Math.sin(p2Lat) + var intPointLat = Math.atan2(z,Math.sqrt(Math.pow(x,2)+Math.pow(y,2))) + var intPointLon = Math.atan2(y,x) + + var intPointCoord = new Coordinate() + intPointCoord.SetLat_rad(intPointLat) + intPointCoord.SetLon_rad(intPointLon) + return intPointCoord + }, + intermediatePointCoordinatesString: function() { + if(!this.intermediatePointCoordinates) + return '' + + if(this.selCoordinateUnit === 'Degrees') { + return this.intermediatePointCoordinates.GetLat_deg().toPrecision(4) + ', ' + + this.intermediatePointCoordinates.GetLon_deg().toPrecision(4) + } else if(this.selCoordinateUnit === 'Radians') { + return this.intermediatePointCoordinates.GetLat_rad().toPrecision(4) + ', ' + + this.intermediatePointCoordinates.GetLon_rad().toPrecision(4) + } else { + throw Error('Selected unit not recognized.') + } } }, watch: { @@ -211,6 +258,9 @@ }, point2Coord: function(val) { this.render() + }, + intermediatePointCoordinates: function(val) { + this.render() } }, methods: { @@ -278,6 +328,14 @@ this.context.lineWidth = oldLineWidth } + if(this.intermediatePointCoordinates) { + this.context.beginPath() + this.context.fillStyle = "orange"; + this.path({ type: "Point", coordinates: + [this.intermediatePointCoordinates.GetLon_deg(), this.intermediatePointCoordinates.GetLat_deg()]}) + this.context.fill() + } + }, dragstarted: function() { diff --git a/src/components/Calculators/Geospatial/TwoCoordinateGeodesics/grid-icon.png b/src/components/Calculators/Geospatial/TwoCoordinateGeodesics/grid-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c49ceddf1120949d84ddc906bc84b879dec31e6c GIT binary patch literal 35809 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

72!SSF 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 Date: Sun, 18 Feb 2018 19:08:03 -0800 Subject: [PATCH 4/4] Updated files in preparation for release of v3.1.0. --- changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog.md b/changelog.md index 56da2392..6af61b5d 100644 --- a/changelog.md +++ b/changelog.md @@ -6,6 +6,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +## [v3.1.0] - 2018-02-18 + ### Added - 'Distance Between Two Points' calculator now draws great circle between the two points. - Points drawn on sphere now disappear when they rotate around the back of the sphere.