From e3cc8717e6933cfcddc9174e0570e6941460e01e Mon Sep 17 00:00:00 2001 From: Jason Dekarske Date: Sat, 2 Apr 2022 22:23:48 -0700 Subject: [PATCH] emulator mvp course parsed and displayed! --- apps/golfview/ChangeLog | 1 + apps/golfview/README.md | 21 ++++++ apps/golfview/golfview-icon.js | 1 + apps/golfview/golfview.js | 51 +++++++++++++++ apps/golfview/golfview.png | Bin 0 -> 22517 bytes apps/golfview/index.html | 114 +++++++++++++++++++++++++++++++++ apps/golfview/maptools.js | 59 +++++++++++++++++ apps/golfview/metadata.json | 14 ++++ 8 files changed, 261 insertions(+) create mode 100644 apps/golfview/ChangeLog create mode 100644 apps/golfview/README.md create mode 100644 apps/golfview/golfview-icon.js create mode 100644 apps/golfview/golfview.js create mode 100644 apps/golfview/golfview.png create mode 100644 apps/golfview/index.html create mode 100644 apps/golfview/maptools.js create mode 100644 apps/golfview/metadata.json diff --git a/apps/golfview/ChangeLog b/apps/golfview/ChangeLog new file mode 100644 index 000000000..b243db101 --- /dev/null +++ b/apps/golfview/ChangeLog @@ -0,0 +1 @@ +0.01: New App! Very limited course support. diff --git a/apps/golfview/README.md b/apps/golfview/README.md new file mode 100644 index 000000000..56d90782d --- /dev/null +++ b/apps/golfview/README.md @@ -0,0 +1,21 @@ +# App Name + +Describe the app... + +Add screen shots (if possible) to the app folder and link then into this file with ![](.png) + +## Usage + +Select your course of interest upon loading this app. + +## Contributions + +The performance of this app depends on the accuracy and consistency of user-submitted maps. Please contribute to Open Street Map using these guidelines and provide input in ways to support this application. + +## Controls + +Swipe to change holes and tap to see a green closeup. + +## Requests/Creator + +[Jason Dekarske](https://github.com/jdekarske) \ No newline at end of file diff --git a/apps/golfview/golfview-icon.js b/apps/golfview/golfview-icon.js new file mode 100644 index 000000000..83b180e4c --- /dev/null +++ b/apps/golfview/golfview-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("AAkCpMkyQCBwANGggLCAQYOOpAONpMgBwgLFHxAOJyVABwt/8QRGBwsv/mREAwOEkv/K4IOFyBZE3/ypMiHwwODy/+AYOJPowFD//Jkh9HAodf/IsGAQMSAoVL/4FD7dtBwWCCgd/6QOE2wjGl/6AoVbBwJDBBwh6BGQYOB7ZBG3/pAoUtBwNkBwuX/ojDBwNsZw3/0gFCBwJcDPQn0AoYOB2QOFpf+AoZcCNYx6ELgRrGAQoOB7IONPQUJBxB6CAoNBBxB6CRINIBYdJlIOIggODkiJFU4UABwmSAoWWU4cAfwQOCpSJDBwcCBAOJHQRNDBwUggAIByIKCJoYCCBwJ6CLAYOHgIFBogKCLgYCCgEAAoNIA4WUBw56CkRrFAQWAB4J6FqQOEyAOBPQRrCPQYCCBwJ6CNYYOFoAPBAoQOIpAOBPQRcCRIwOBPQRcCTBB6CFIoOGeoYCIBwJ6DARCJCNYQOIRIRrDARAOCLgckydtAQaJDLgttcwICCRIRNFpu0AQYOEJpQODVQYOLTZKYCHw4OKHw4NFAAS8ELIgABA==")) diff --git a/apps/golfview/golfview.js b/apps/golfview/golfview.js new file mode 100644 index 000000000..93d70e31c --- /dev/null +++ b/apps/golfview/golfview.js @@ -0,0 +1,51 @@ +let course = require("Storage").readJSON("course_data_hole1.json"); + +console.log(Object.keys(course)); + +g.clear(); + +for (var feature of course.features) { + //console.log(Object.keys(feature)); + if (feature.type === "fairway"){ + g.setColor(0,0,1); + } else if ( feature.type === "tee"){ + g.setColor(1,0,0); + } else if (feature.type === "green"){ + g.setColor(0,1,0); + } else if (feature.type === "bunker"){ + g.setColor(1,1,0); + } else { + continue; + } + + var nodelist = []; + feature.nodesXY.forEach(function (node) { + nodelist.push(node.x); + nodelist.push(node.y); + }); + newnodelist = g.transformVertices(nodelist,{ + x: 150, // x offset (default 0) + y: 150, // y offset (default 0) + scale: 0.45, // scale factor (default 1) + rotate: course.angle - 1.57, // angle in radians (default 0) + }); + + g.fillPoly(newnodelist, true); + console.log(feature.type); + console.log(nodelist); +} + +var nodelist = []; +course.nodesXY.forEach(function (node) { + nodelist.push(node.x); + nodelist.push(node.y); +}); + +newnodelist = g.transformVertices(nodelist,{ + x: 150, // x offset (default 0) + y: 150, // y offset (default 0) + scale: 0.45, // scale factor (default 1) + rotate: course.angle - 1.57, // angle in radians (default 0) +}); +g.setColor(0,1,1); +g.drawPoly(newnodelist); \ No newline at end of file diff --git a/apps/golfview/golfview.png b/apps/golfview/golfview.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb61628218690fdd21aeb651f6275a78ca9318d GIT binary patch literal 22517 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 E2Tt6HqyPW_ literal 0 HcmV?d00001 diff --git a/apps/golfview/index.html b/apps/golfview/index.html new file mode 100644 index 000000000..24016ccbd --- /dev/null +++ b/apps/golfview/index.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/golfview/maptools.js b/apps/golfview/maptools.js new file mode 100644 index 000000000..af05343c8 --- /dev/null +++ b/apps/golfview/maptools.js @@ -0,0 +1,59 @@ +const EARTHRADIUS = 6371000; //km + +function radians(a) { + return a * Math.PI / 180; +} + +function degrees(a) { + let d = a * 180 / Math.PI; + return (d + 360) % 360; +} + +function toXY(a, origin) { + let pt = { + x: 0, + y: 0 + }; + + pt.x = EARTHRADIUS * radians(a.lon - origin.lon) * Math.cos(radians((a.lat + origin.lat) / 2)); + pt.y = EARTHRADIUS * radians(origin.lat - a.lat); + return pt; +} + +function arraytoXY(array, origin) { + let out = []; + for (var j in array) { + let newpt = toXY(array[j], origin); + out.push(newpt); + } + return out; +} + +function angle(a, b) { + let x = b.x - a.x; + let y = b.y - a.y; + return Math.atan2(-y, x); +} + +function rotateVec(a, theta) { + let pt = { + x: 0, + y: 0 + }; + c = Math.cos(theta); + s = Math.sin(theta); + pt.x = c * a.x - s * a.y; + pt.y = s * a.x + c * a.y; + return pt; +} + +// https://stackoverflow.com/questions/19721439/download-json-object-as-a-file-from-browser +function downloadObjectAsJSON(exportObj, exportName) { + var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(exportObj)); + var downloadAnchorNode = document.createElement('a'); + downloadAnchorNode.setAttribute("href", dataStr); + downloadAnchorNode.setAttribute("download", exportName + ".json"); + document.body.appendChild(downloadAnchorNode); // required for firefox + downloadAnchorNode.click(); + downloadAnchorNode.remove(); +} \ No newline at end of file diff --git a/apps/golfview/metadata.json b/apps/golfview/metadata.json new file mode 100644 index 000000000..bbb221b64 --- /dev/null +++ b/apps/golfview/metadata.json @@ -0,0 +1,14 @@ +{ "id": "glfview", + "name": "Golf View", + "version":"0.01", + "description": "This app will provide you with on course data to support your golf game! All information comes from OpenStreetMap. Please contribute by drawing your course using these guidelines: [guidelines](guidelines.com)", + "icon": "golfview.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "custom": "index.html", + "storage": [ + {"name":"glfview.app.js","url":"golfview.js"}, + {"name":"glfview.img","url":"golfview-icon.js","evaluate":true} + ] +}