Programozás‎ > ‎Feladatok‎ > ‎

Távolságok a Földön

Készítsünk programot a következő feladatok megoldására:

  1. Ha megadunk egy magyarországi települést, akkor megadja, hogy hány településre van Budapesttől, ha egy lépésben légvonalban legfeljebb 30 km távolságra lévő településre utazhatunk.

  2. Ugyanezt a kérdést úgy is oldjuk meg, hogy az légvonalban számolt útnak kell legrövidebbnek lennie, és továbbra is legfeljebb 30 km lehet egy lépés.

  3. Járjuk körbe a magyar megyeszékhelyeket úgy, hogy a körutazás hossza a lehető legkevesebb legyen.

  4. Mind a három részfeladat megoldását jelenítsük meg Google térképen is!

Részfeladatok és megoldásuk

Település lista


Települések távolsága földrajzi koordináták alapján

Clojure

(defn find-distance [lat1 lon1 lat2 lon2]
  (let [radius 6371000
        a (+ (Math/pow (Math/sin (/ (Math/toRadians (- lat2 lat1)) 2)) 2)
             (* (Math/cos (Math/toRadians lat1))
                (Math/cos (Math/toRadians lat2))
                (Math/pow (Math/sin (/ (Math/toRadians (- lon2 lon1)) 2)) 2)))
        c (* 2 (Math/atan2 (Math/sqrt a) (Math/sqrt (- 1 a))))]
    (* radius c)))

Python

import math # Bemenet varos lat long varos2 lat2 long2 t = input().strip("\n").split("\t") lat1 = math.radians(float(t[1])) long1 = math.radians(float(t[2])) lat2 = math.radians(float(t[4])) long2 = math.radians(float(t[5])) a = math.pow(math.sin((lat1-lat2)/2), 2) + math.cos(lat1)*math.cos(lat2)*math.pow(math.sin((long1-long2)/2), 2) c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) R = 6371000 d = R*c print(int(d))

C

#include <math.h>

float rad(float deg) { return deg * M_PI / 180f; }

float fdist(float lat1, float lon1, float lat2, float lon2)
{
    float a =
        sin(rad(lat2 - lat1)) * sin(rad(lat2 - lat1)) +
        cos(rad(lat1)) * cos(rad(lat2)) *
        sin(rad(lon2 - lon1)) * sin(rad(lon2 - lon1));

    float c = 2f * atan2(sqrt(a), sqrt(1.0f - a));

    return 6371000 * c;
}

Település gráf 30 km-nél rövidebb élekkel



Szélességi bejárás Budapestről indulva



Dijkstra-algoritmus két település közötti legrövidebb út kiszámításához



Megyeszékhelyek körbejárása

Kovács Levente megoldása, euklieszi közelítéssel:  megye.szekhely    Korut.java

Google Maps Api + javascript/html felület

Megyeszékhelyek

<!DOCTYPE html>
<html>
  <head>
    <title>Megyeszékhelyek Magyarországon</title>
    <meta name="viewport" content="initial-scale=1.0">
    <meta charset="utf-8">
    <style>
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #map {
        height: 100%;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
      var map;
      function initMap() {
        var latlng = {lat: 47.494328, lng: 19.042383};
          
        map = new google.maps.Map(document.getElementById('map'), {
          center: latlng,
          zoom: 6
        });
        
        var megye = [
        {title:'Békéscsaba',position:{  lat:46.677, lng: 21.0852},map: map},
        {title:'Budapest', position:{lat:   47.4825 , lng:19.1593},map: map},
        {title:'Debrecen', position:{lat:   47.5288 , lng:21.6372},map: map},
        {title:'Eger', position:{lat:   47.9007 , lng:20.3792},map: map},
        {title:'Győr', position:{lat:   47.688  , lng:17.6328},map: map},
        {title:'Kaposvár', position:{lat:   46.3575 , lng:17.7958},map: map},
        {title:'Kecskemét', position:{lat:  46.9088 , lng:19.6928},map: map},
        {title:'Miskolc', position:{lat:    48.1037 , lng:20.7993},map: map},
        {title:'Nyíregyháza', position:{lat:    47.94254    , lng:21.7158},map: map},
        {title:'Pécs', position:{lat:   46.0802 , lng:18.2475},map: map},
        {title:'Salgótarján', position:{lat:    48.111  , lng:19.8147},map: map},
        {title:'Szeged', position:{lat: 46.2492 , lng:20.1628},map: map},
        {title:'Szekszárd', position:{lat:  46.3523 , lng:18.7037},map: map},
        {title:'Székesfehérvár', position:{lat: 47.18602, lng:18.42213},map: map},
        {title:'Szolnok', position:{lat:    47.1793 , lng:20.1875},map: map},
        {title:'Szombathely', position:{lat:    47.2335 , lng:16.6203},map: map},
        {title:'Tatabánya', position:{lat:  47.5673 , lng:18.4088},map: map},
        {title:'Veszprém', position:{lat:   47.0915 , lng:17.911},map: map},
        {title:'Zalaegerszeg', position:{lat:   46.835  , lng:16.8385}  ,map: map}
        ]
        var marker = new Array();
        for(var i = 0; i < 20; i++) {
            marker[i] = new google.maps.Marker(megye[i]);
        }
         
        
      }
    </script>
    <script src="https://maps.googleapis.com/maps/api/js?key=API_KEY&callback=initMap"
    async defer></script>
  </body>
</html>


Körút Levente optimalizációjával:

<!DOCTYPE html>
<html>
  <head>
    <title>Megyeszékhelyek Magyarországon</title>
    <meta name="viewport" content="initial-scale=1.0">
    <meta charset="utf-8">
    <style>
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #map {
        height: 100%;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
      var map;
      function initMap() {
        var latlng = {lat: 47.494328, lng: 19.042383};
          
        map = new google.maps.Map(document.getElementById('map'), {
          center: latlng,
          zoom: 6
        });
        
        var megye = [
        {title:'Békéscsaba',position:{  lat:46.677, lng: 21.0852},map: map},
        {title:'Budapest', position:{lat:   47.4825 , lng:19.1593},map: map},
        {title:'Kecskemét', position:{lat:  46.9088 , lng:19.6928},map: map},
        {title:'Szekszárd', position:{lat:  46.3523 , lng:18.7037},map: map},
        {title:'Szeged', position:{lat: 46.2492 , lng:20.1628},map: map},
        {title:'Pécs', position:{lat:   46.0802 , lng:18.2475},map: map},
        {title:'Zalaegerszeg', position:{lat:   46.835  , lng:16.8385}  ,map: map},
        {title:'Szombathely', position:{lat:    47.2335 , lng:16.6203},map: map},
        {title:'Kaposvár', position:{lat:   46.3575 , lng:17.7958},map: map},
        {title:'Veszprém', position:{lat:   47.0915 , lng:17.911},map: map},
        {title:'Győr', position:{lat:   47.688  , lng:17.6328},map: map},
        {title:'Tatabánya', position:{lat:  47.5673 , lng:18.4088},map: map},
        {title:'Salgótarján', position:{lat:    48.111  , lng:19.8147},map: map},
        {title:'Székesfehérvár', position:{lat: 47.18602, lng:18.42213},map: map},
        {title:'Miskolc', position:{lat:    48.1037 , lng:20.7993},map: map},
        {title:'Nyíregyháza', position:{lat:    47.94254    , lng:21.7158},map: map},
        {title:'Eger', position:{lat:   47.9007 , lng:20.3792},map: map},
        {title:'Debrecen', position:{lat:   47.5288 , lng:21.6372},map: map},
        {title:'Szolnok', position:{lat:    47.1793 , lng:20.1875},map: map}
        ]
        
        var path = [
        {  lat:46.677, lng: 21.0852},
        {lat:   47.4825 , lng:19.1593},
        {lat:  46.9088 , lng:19.6928},
        {lat:  46.3523 , lng:18.7037},
        {lat: 46.2492 , lng:20.1628},
        {lat:   46.0802 , lng:18.2475},
        {lat:   46.835  , lng:16.8385},
        {lat:    47.2335 , lng:16.6203},
        {lat:   46.3575 , lng:17.7958},
        {lat:   47.0915 , lng:17.911},
        {lat:   47.688  , lng:17.6328},
        {lat:  47.5673 , lng:18.4088},
        {lat:    48.111  , lng:19.8147},
        {lat: 47.18602, lng:18.42213},
        {lat:    48.1037 , lng:20.7993},
        {lat:    47.94254    , lng:21.7158},
        {lat:   47.9007 , lng:20.3792},
        {lat:   47.5288 , lng:21.6372},
        {lat:    47.1793 , lng:20.1875},
        {  lat:46.677, lng: 21.0852}
        ]
        
        var kor = new google.maps.Polyline({
path: path,
geodesic: true,
strokeColor: '#FF0000',
strokeOpacity: 1.0,
strokeWeight: 2
});

kor.setMap(map);
        
        var marker = new Array();
        for(var i = 0; i < 20; i++) {
            marker[i] = new google.maps.Marker(megye[i]);
        }
         
        
      }
    </script>
    <script src="https://maps.googleapis.com/maps/api/js?key=API_KEY&callback=initMap"
    async defer></script>
  </body>
</html>