Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από geomagas » 26 Ιούλ 2013 10:41

Ωραία. Άρα με μία ksort() τον φέρνεις "στα ίσα του" (δηλ. να αντιστοιχούν τα keys με τη φυσική σειρά):

Κώδικας: Επιλογή όλων

function my_transform($arr)
  {
  ksort($arr);
  // to be continued...
  return $arr;
  }
Η συνέχεια σε λιγάκι, γιατί έχω να τελειώσω κάτι επείγον...

trilos021
Δημοσιεύσεις: 131
Εγγραφή: 04 Νοέμ 2003 18:06

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από trilos021 » 26 Ιούλ 2013 11:19

geomagas έγραψε:Ωραία. Άρα με μία ksort() τον φέρνεις "στα ίσα του" (δηλ. να αντιστοιχούν τα keys με τη φυσική σειρά):

Κώδικας: Επιλογή όλων

function my_transform($arr)
  {
  ksort($arr);
  // to be continued...
  return $arr;
  }
Η συνέχεια σε λιγάκι, γιατί έχω να τελειώσω κάτι επείγον...
Πραγματικά χίλια ευχαριστώ για τη βοήθεια!

έφτιαξα το script που μ είπες βάσει του json από το mapquest

Κώδικας: Επιλογή όλων

<?php 
   
    $url = "http&#58;//mapquestapi.com/directions/v1/route?key=Fmjtd%7Cluub2g6zn0%2Ca5%3Do5-9ua50y&outFormat=json&routeType=fastest&timeType=1&enhancedNarrative=true&shapeFormat=raw&generalize=0&locale=en_US&unit=k&from=38.889840779517,-77.08116306845&to=38.90103,-77.075555&drivingStyle=2&highwayEfficiency=21.0";

 $json = file_get_contents&#40;$url&#41;;
    $obj = json_decode&#40;$json, true&#41;;

      // "ekopsa" polla shmeia gia oikonomia xorou 
  // $obj=json_decode&#40;$json&#41;; 
   
   
    foreach &#40;$obj&#91;'route'&#93; as $key => $val&#41;
&#123;
foreach &#40;$obj&#91;'route'&#93;&#91;'shape'&#93; as $key => $val&#41;
&#123;
foreach &#40;$obj&#91;'route'&#93;&#91;'shape'&#93;&#91;'shapePoints'&#93; as $key => $val&#41;
&#123;
	   $level&#91;$key&#93;=&#40;array&#41;$val; 
   &#125; 
   &#125;
   &#125;
   //$level=my_transform&#40;$level&#41;; 
   header&#40;'Cache-Control&#58; no-cache, must-revalidate'&#41;;
   header&#40;'Expires&#58; Mon, 26 Jul 1997 05&#58;00&#58;00 GMT'&#41;;
  
   header&#40;"Content-type&#58; application/json charset=utf-8"&#41;; // allakse to utf-8 sto diko sou encoding 
   echo json_encode&#40;array&#40;'Level'=>$level&#41;&#41;; 
//echo 'hi';
   //function my_transform&#40;$arr&#41; &#123; return $arr; &#125; // under construction 
   
   ?>
και αυτό π επιστρέφει (χωρίς τη χρήση της my_transform() ακόμα είναι αυτό

Κώδικας: Επιλογή όλων

&#123;"Level"&#58;&#91;&#91;38.889755&#93;,&#91;-77.081756&#93;,&#91;38.890308&#93;,&#91;-77.081832&#93;,&#91;38.890949&#93;,&#91;-77.081886&#93;,&#91;38.890949&#93;,&#91;-77.081886&#93;,&#91;38.890911&#93;,&#91;-77.082893&#93;,&#91;38.890819&#93;,&#91;-77.083847&#93;,&#91;38.89075&#93;,&#91;-77.084739&#93;,&#91;38.89072&#93;,&#91;-77.08506&#93;,&#91;38.890701&#93;,&#91;-77.085243&#93;,&#91;38.890701&#93;,&#91;-77.085243&#93;,&#91;38.890861&#93;,&#91;-77.085533&#93;,&#91;38.890991&#93;,&#91;-77.08567&#93;,&#91;38.89122&#93;,&#91;-77.085807&#93;,&#91;38.891548&#93;,&#91;-77.085868&#93;,&#91;38.89175&#93;,&#91;-77.085899&#93;,&#91;38.893218&#93;,&#91;-77.08612&#93;,&#91;38.893379&#93;,&#91;-77.08612&#93;,&#91;38.894241&#93;,&#91;-77.086242&#93;,&#91;38.894618&#93;,&#91;-77.086303&#93;,&#91;38.894729&#93;,&#91;-77.086311&#93;,&#91;38.895481&#93;,&#91;-77.08641&#93;,&#91;38.8959&#93;,&#91;-77.086456&#93;,&#91;38.896041&#93;,&#91;-77.086486&#93;,&#91;38.896041&#93;,&#91;-77.086486&#93;,&#91;38.89595&#93;,&#91;-77.086769&#93;,&#91;38.895889&#93;,&#91;-77.087028&#93;,&#91;38.89566&#93;,&#91;-77.087951&#93;,&#91;38.89545&#93;,&#91;-77.088882&#93;,&#91;38.895191&#93;,&#91;-77.089912&#93;,&#91;38.894989&#93;,&#91;-77.090858&#93;,&#91;38.894931&#93;,&#91;-77.091247&#93;,&#91;38.89492&#93;,&#91;-77.091316&#93;,&#91;38.894821&#93;,&#91;-77.09217&#93;,&#91;38.89479&#93;,&#91;-77.092536&#93;,&#91;38.894741&#93;,&#91;-77.093177&#93;,&#91;38.894771&#93;,&#91;-77.09349&#93;,&#91;38.894828&#93;,&#91;-77.093788&#93;,&#91;38.894901&#93;,&#91;-77.094078&#93;,&#91;38.894969&#93;,&#91;-77.094261&#93;,&#91;38.895168&#93;,&#91;-77.094657&#93;,&#91;38.895431&#93;,&#91;-77.095039&#93;,&#91;38.89569&#93;,&#91;-77.09542&#93;,&#91;38.895858&#93;,&#91;-77.095886&#93;,&#91;38.895908&#93;,&#91;-77.096138&#93;,&#91;38.895908&#93;,&#91;-77.096138&#93;,&#91;38.89616&#93;,&#91;-77.095886&#93;,&#91;38.89632&#93;,&#91;-77.095733&#93;,&#91;38.896659&#93;,&#91;-77.095382&#93;,&#91;38.897209&#93;,&#91;-77.094787&#93;,&#91;38.897369&#93;,&#91;-77.094627&#93;,&#91;38.89756&#93;,&#91;-77.094429&#93;,&#91;38.897659&#93;,&#91;-77.094322&#93;,&#91;38.897819&#93;,&#91;-77.094177&#93;,&#91;38.897911&#93;,&#91;-77.093971&#93;,&#91;38.898288&#93;,&#91;-77.093513&#93;,&#91;38.89833&#93;,&#91;-77.09346&#93;,&#91;38.898578&#93;,&#91;-77.092979&#93;,&#91;38.898651&#93;,&#91;-77.092796&#93;,&#91;38.898708&#93;,&#91;-77.092498&#93;,&#91;38.898811&#93;,&#91;-77.091163&#93;,&#91;38.898868&#93;,&#91;-77.090728&#93;,&#91;38.89904&#93;,&#91;-77.089927&#93;,&#91;38.899299&#93;,&#91;-77.088958&#93;,&#91;38.899341&#93;,&#91;-77.088661&#93;,&#91;38.89933&#93;,&#91;-77.087692&#93;,&#91;38.899379&#93;,&#91;-77.087287&#93;,&#91;38.899749&#93;,&#91;-77.085823&#93;,&#91;38.899841&#93;,&#91;-77.08551&#93;,&#91;38.900028&#93;,&#91;-77.085029&#93;,&#91;38.900249&#93;,&#91;-77.084701&#93;,&#91;38.900531&#93;,&#91;-77.08435&#93;,&#91;38.900871&#93;,&#91;-77.0839&#93;,&#91;38.900871&#93;,&#91;-77.0839&#93;,&#91;38.90118&#93;,&#91;-77.083236&#93;,&#91;38.90129&#93;,&#91;-77.082878&#93;,&#91;38.901348&#93;,&#91;-77.082481&#93;,&#91;38.901371&#93;,&#91;-77.082122&#93;,&#91;38.90134&#93;,&#91;-77.081657&#93;,&#91;38.901359&#93;,&#91;-77.081146&#93;,&#91;38.901401&#93;,&#91;-77.080398&#93;,&#91;38.90147&#93;,&#91;-77.079879&#93;,&#91;38.90155&#93;,&#91;-77.079269&#93;,&#91;38.901569&#93;,&#91;-77.078872&#93;,&#91;38.901588&#93;,&#91;-77.07862&#93;,&#91;38.90155&#93;,&#91;-77.078056&#93;,&#91;38.901401&#93;,&#91;-77.077423&#93;,&#91;38.901329&#93;,&#91;-77.077209&#93;,&#91;38.900878&#93;,&#91;-77.075599&#93;&#93;&#125;

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από geomagas » 26 Ιούλ 2013 11:59

I'm back!

Αυτή είναι η μορφή που το θέλεις; Γιατί, αν είναι έτσι, τα ευθύγραμμα τμήματα δεν ορίζονται με τα keys, όπως είπες, αλλά με τη φυσική ταξινόμηση.
Επίσης, καλό είναι να παίρνεις associative array από την json_decode, διότι το array είναι πιο δομημένο, και ο κώδικας που θα γράψεις για να το χειριστείς θα έχει πιο πολύ νόημα.

Μπορείς να το συνεχίσεις από εκεί και κάτω; Αν όχι, πες το να συνεχίσουμε με τις διχοτομήσεις.

trilos021
Δημοσιεύσεις: 131
Εγγραφή: 04 Νοέμ 2003 18:06

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από trilos021 » 26 Ιούλ 2013 12:13

geomagas έγραψε:I'm back!

Αυτή είναι η μορφή που το θέλεις; Γιατί, αν είναι έτσι, τα ευθύγραμμα τμήματα δεν ορίζονται με τα keys, όπως είπες, αλλά με τη φυσική ταξινόμηση.
Επίσης, καλό είναι να παίρνεις associative array από την json_decode, διότι το array είναι πιο δομημένο, και ο κώδικας που θα γράψεις για να το χειριστείς θα έχει πιο πολύ νόημα.

Μπορείς να το συνεχίσεις από εκεί και κάτω; Αν όχι, πες το να συνεχίσουμε με τις διχοτομήσεις.
η δομή που θέλω να πάρω είναι του τύπου

Κώδικας: Επιλογή όλων

&#123;"Level"&#58;&#91;&#123;"lat"&#58;38.889755,"lgn"&#58;-77.081756&#125;,&#123;"lat"&#58;38.890308,"lgn"&#58;-77.081832&#125;,&#123;"lat"&#58;38.890949,"lgn"&#58;-77.081886&#125;,&#123;"lat"&#58;38.890949,"lgn"&#58;-77.081886&#125;,&#123;"lat"&#58;38.890911,"lgn"&#58;-77.082893&#125;,&#123;"lat"&#58;38.890865,"lgn"&#58;-77.08337&#125;,&#123;"lat"&#58;38.890842,"lgn"&#58;-77.0836085&#125;,&#123;"lat"&#58;38.8908305,"lgn"&#58;-77.08372775&#125;,&#123;"lat"&#58;38.89082475,"lgn"&#58;-77.083787375&#125;,&#123;"lat"&#58;38.890821875,"lgn"&#58;-77.0838171875&#125;,&#123;"lat"&#58;38.8908204375,"lgn"&#58;-77.08383209375&#125;
βασικά το μεγάλο μου πρόβλημα είναι το πως μπορώ να προσθέσω και άλλα σημεία στον πίνακα ανάμεσα σε εγγραγές πχ ανάμεσα στο {"lat":38.889755,"lgn":-77.081756} και το {"lat":38.890308,"lgn":-77.081832} ώστε ο marker να μην πετάγετε από τη μια άκρη στη άλλη και η κίνησή του να είναι ομαλή

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από geomagas » 26 Ιούλ 2013 13:01

trilos021 έγραψε:βασικά το μεγάλο μου πρόβλημα είναι το πως μπορώ να προσθέσω και άλλα σημεία στον πίνακα ανάμεσα σε εγγραγές πχ ανάμεσα στο {"lat":38.889755,"lgn":-77.081756} και το {"lat":38.890308,"lgn":-77.081832} ώστε ο marker να μην πετάγετε από τη μια άκρη στη άλλη και η κίνησή του να είναι ομαλή
Το ξέρω, θα φτάσουμε κι εκεί. Βήμα-βήμα όμως, για να κατανοώ κι εγώ τις λεπτομέρειες, κι εσύ το σκεπτικό μου, και να έχω την ευκαιρία να δοκιμάζω τον κώδικα που σου γράφω.
---
Οπότε, τελικά, ξεχνάμε την ksort() αφού δεν χρειάζεται, αλλά θέλουμε τον πίνακα, από flat που είναι, σε μορφή

Κώδικας: Επιλογή όλων

array&#40;
  array&#40;'lat'=>......, 'lgn'=>....&#41;,
  array&#40;'lat'=>......, 'lgn'=>....&#41;,
  array&#40;'lat'=>......, 'lgn'=>....&#41;,
  ............
  &#41;;
Σημείωσε ότι, δεν χρειάζεσαι όλα αυτά τα foreach, καθώς η json_decode() σου επιστρέφει stdClass. Επομένως:

Κώδικας: Επιλογή όλων

<?php
	$url = "http&#58;//mapquestapi.com/directions/v1/route?key=Fmjtd%7Cluub2g6zn0%2Ca5%3Do5-9ua50y&outFormat=json&routeType=fastest&timeType=1&enhancedNarrative=true&shapeFormat=raw&generalize=0&locale=en_US&unit=k&from=38.889840779517,-77.08116306845&to=38.90103,-77.075555&drivingStyle=2&highwayEfficiency=21.0";
	$json = file_get_contents&#40;$url&#41;; // the json object in a string
 	$points_flat=json_decode&#40;$json&#41;->route->shape->shapePoints; // decode and get the flat array
 	// now convert it to associative &#40;lat,lgn&#41;
 	for&#40;$i=0;$i<count&#40;$points_flat&#41;/2;$i++&#41;
 		&#123;
 		$t&#91;'lat'&#93;=$points_flat&#91;2*$i&#93;;
 		$t&#91;'lgn'&#93;=$points_flat&#91;2*$i+1&#93;;
 		$level&#91;&#93;=$t;
 		&#125;
 	$level=my_transform&#40;$level&#41;;
	header&#40;'Cache-Control&#58; no-cache, must-revalidate'&#41;;
	header&#40;'Expires&#58; Mon, 26 Jul 1997 05&#58;00&#58;00 GMT'&#41;;
 
	header&#40;"Content-type&#58; application/json charset=utf-8"&#41;; // allakse to utf-8 sto diko sou encoding
	echo json_encode&#40;array&#40;'Level'=>$level&#41;&#41;;
//echo 'hi';
	function my_transform&#40;$arr&#41; &#123; return $arr; &#125; // under construction
Καλά πάμε ως εδώ; Πάμε παρακάτω;

trilos021
Δημοσιεύσεις: 131
Εγγραφή: 04 Νοέμ 2003 18:06

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από trilos021 » 26 Ιούλ 2013 13:08

geomagas έγραψε:
trilos021 έγραψε:βασικά το μεγάλο μου πρόβλημα είναι το πως μπορώ να προσθέσω και άλλα σημεία στον πίνακα ανάμεσα σε εγγραγές πχ ανάμεσα στο {"lat":38.889755,"lgn":-77.081756} και το {"lat":38.890308,"lgn":-77.081832} ώστε ο marker να μην πετάγετε από τη μια άκρη στη άλλη και η κίνησή του να είναι ομαλή
Το ξέρω, θα φτάσουμε κι εκεί. Βήμα-βήμα όμως, για να κατανοώ κι εγώ τις λεπτομέρειες, κι εσύ το σκεπτικό μου, και να έχω την ευκαιρία να δοκιμάζω τον κώδικα που σου γράφω.
---
Οπότε, τελικά, ξεχνάμε την ksort() αφού δεν χρειάζεται, αλλά θέλουμε τον πίνακα, από flat που είναι, σε μορφή

Κώδικας: Επιλογή όλων

array&#40;
  array&#40;'lat'=>......, 'lgn'=>....&#41;,
  array&#40;'lat'=>......, 'lgn'=>....&#41;,
  array&#40;'lat'=>......, 'lgn'=>....&#41;,
  ............
  &#41;;
Σημείωσε ότι, δεν χρειάζεσαι όλα αυτά τα foreach, καθώς η json_decode() σου επιστρέφει stdClass. Επομένως:

Κώδικας: Επιλογή όλων

<?php
	$url = "http&#58;//mapquestapi.com/directions/v1/route?key=Fmjtd%7Cluub2g6zn0%2Ca5%3Do5-9ua50y&outFormat=json&routeType=fastest&timeType=1&enhancedNarrative=true&shapeFormat=raw&generalize=0&locale=en_US&unit=k&from=38.889840779517,-77.08116306845&to=38.90103,-77.075555&drivingStyle=2&highwayEfficiency=21.0";
	$json = file_get_contents&#40;$url&#41;; // the json object in a string
 	$points_flat=json_decode&#40;$json&#41;->route->shape->shapePoints; // decode and get the flat array
 	// now convert it to associative &#40;lat,lgn&#41;
 	for&#40;$i=0;$i<count&#40;$points_flat&#41;/2;$i++&#41;
 		&#123;
 		$t&#91;'lat'&#93;=$points_flat&#91;2*$i&#93;;
 		$t&#91;'lgn'&#93;=$points_flat&#91;2*$i+1&#93;;
 		$level&#91;&#93;=$t;
 		&#125;
 	$level=my_transform&#40;$level&#41;;
	header&#40;'Cache-Control&#58; no-cache, must-revalidate'&#41;;
	header&#40;'Expires&#58; Mon, 26 Jul 1997 05&#58;00&#58;00 GMT'&#41;;
 
	header&#40;"Content-type&#58; application/json charset=utf-8"&#41;; // allakse to utf-8 sto diko sou encoding
	echo json_encode&#40;array&#40;'Level'=>$level&#41;&#41;;
//echo 'hi';
	function my_transform&#40;$arr&#41; &#123; return $arr; &#125; // under construction
Καλά πάμε ως εδώ; Πάμε παρακάτω;
ναι μια χαρά εμφανίζει τώρα τα αποτελέσματα!

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από geomagas » 26 Ιούλ 2013 14:25

ok.
Τώρα θα ασχοληθούμε με το πραγματικό σου πρόβλημα.
Έχεις μία σειρά από Ν σημεία, που ορίζουν ένα polyline (τεθλασμένη γραμμή, δηλαδή σύνολο από συνεχόμενα ευθύγραμμα τμήματα). Θέλεις να διχοτομήσεις τα τμήματα που έχουν μήκος πάνω από $maxdistance.
Για Ν σημεία, χρειάζεσαι Ν-1 ελέγχους (διότι έχεις Ν-1 τμήματα).
Στην υλοποίηση της my_transform() παρακάτω, θα "μεταγγίσουμε" τον πίνακα σε έναν άλλο, ένα στοιχείο κάθε φορά, προσθέτοντας όπου χρειάζεται αυτά που ορίζουν τις διχοτομήσεις.

Κώδικας: Επιλογή όλων

function my_transform&#40;$arr&#41; 
  &#123; 
  $maxdistance=50;
  $p1=array_shift&#40;$arr&#41;; $r&#91;&#93;=$p1;
  while&#40;isset&#40;$arr&#91;0&#93;&#41;&#41;
    &#123;
    $p2=array_shift&#40;$arr&#41;;
    $r=array_merge&#40;$r,divide_long&#40;$p1,$p2,$maxdistance&#41;&#41;;
    $p1=$p2; $r&#91;&#93;=$p1;
    &#125;
  return $r; 
  &#125;
function divide_long&#40;$p1,$p2,$howlong&#41;
  &#123;
  return array&#40;&#41;;
  &#125;
Ακόμα και μετά τη διχοτόμηση ενός τμήματος, αυτά που θα προκύψουν μπορεί να έχουν πάλι μήκος μεγαλύτερο από $maxdistance. Οπότε, ο έλεγχος σου θα πρέπει να είναι αναδρομικός.
Γι αυτό το λόγο η divide_long επιστρέφει array και όχι σημείο, και την έχω αφήσει "κουφάρι" για να τη δούμε εφ' όσον κατανόησες και συμφωνείς με αυτά.

trilos021
Δημοσιεύσεις: 131
Εγγραφή: 04 Νοέμ 2003 18:06

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από trilos021 » 26 Ιούλ 2013 14:35

ακριβώς αυτό! και μετά τη διχοτόμηση μπορεί να προκύψει μεγάλη απόσταση... υπάρχει η δυνατότητα αντί για διχοτόμηση να προσθέσουμε ανα πχ.5 μέτρα markers που να ξεκινάνε από το αρχικό σημείο και να καταλλήγουν στο τελικό. Μήπως είναι πιο εύκολο στην υλοποίηση αυτό;

υ.γ: δλδ δεν χρειάζομαι υποχρεωτικά να υπάρχει marker στο μέσο της απόστασης

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από geomagas » 26 Ιούλ 2013 14:59

Υποθέτω (χωρίς να το πολυσκεφτώ) ότι πιο εύκολο είναι να βρεις το μέσο ενός ευθύγραμμου τμήματος παρά να βρεις το σημείο πάνω του που απέχει L από το ένα άκρο...

Εγώ θα σου απαντήσω στην αρχική σου ερώτηση, που αφορούσε τη διχοτόμηση, κι από εκεί και πέρα, κάνεις τα δικά σου πειράματα και αν θέλεις βοήθεια ή απόψεις το συζητάμε περαιτέρω.

Λοιπόν, έχουμε να φτιάξουμε την divide_long() που παίρνει σαν ορίσματα δυο σημεία (ευθύγραμμο τμήμα) και μία μέγιστη απόσταση.
Επιστρέφει έναν πίνακα από ενδιάμεσα σημεία, τέτοια ώστε να χωρίζουν το τμήμα σε τόσα υποτμήματα, όσα χρειάζεται για να είναι όλα μικρότερα του $howlong. (<-- πρόταση-γλωσσοδέτης...)

Κώδικας: Επιλογή όλων

	function divide_long&#40;$p1,$p2,$howlong&#41;
		&#123;
		if&#40;distance&#40;$p1,$p2&#41;>$howlong&#41;
			&#123;
			$mid=midpoint&#40;$p1,$p2&#41;;
			$left=divide_long&#40;$p1,$mid,$howlong&#41;;
			$right=divide_long&#40;$mid,$p2,$howlong&#41;;
			return array_merge&#40;$left,array&#40;$mid&#41;,$right&#41;;
			&#125;
		else 
			return array&#40;&#41;;
		&#125;
Πρόσεξε την αναδρομικότητα: Αφού βρούμε το μέσο, την καλούμε αναδρομικά για τα τμήματα [p1,mid] και [mid,p2] και συνενώνουμε τους επιμέρους πίνακες δεξιά και αριστερά του array($mid).
Την υλοποίηση των midpoint() και distance() την αφήνω σε σένα (δεν σου άφησα και πολλά, αλλά είμαι στις καλές μου :D )

trilos021
Δημοσιεύσεις: 131
Εγγραφή: 04 Νοέμ 2003 18:06

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από trilos021 » 26 Ιούλ 2013 15:16

χίλια ευχαριστώ για όλα!! :kaloe:

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από geomagas » 26 Ιούλ 2013 15:20

Τίποτα. Καλή συνέχεια!
Α, και αν φτιάξεις τις συναρτήσεις που λείπουν, ρίξε ένα post. Κάποιον μπορεί να βοηθήσουμε...
Τα λέμε!

trilos021
Δημοσιεύσεις: 131
Εγγραφή: 04 Νοέμ 2003 18:06

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από trilos021 » 26 Ιούλ 2013 18:45

μόλις έφτιαξα τα παρακάτω functions και μ πετάει error "Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261900 bytes) in /Applications/XAMPP/xamppfiles/htdocs/index5.php on line 44"

Κώδικας: Επιλογή όλων

function distance&#40;$p1,$p2&#41;&#123;

 	 $theta = $p1&#91;'lgn'&#93; - $p2&#91;'lgn'&#93;; 
    $distance = &#40;sin&#40;deg2rad&#40;$p1&#91;0&#93;&#41;&#41; * sin&#40;deg2rad&#40;$p2&#91;'lat'&#93;&#41;&#41;&#41; + &#40;cos&#40;deg2rad&#40;$p1&#91;'lat'&#93;&#41;&#41; * cos&#40;deg2rad&#40;$p2&#91;'lat'&#93;&#41;&#41; * cos&#40;deg2rad&#40;$theta&#41;&#41;&#41;;
   
    $distance = acos&#40;$distance&#41;; 
    $distance = rad2deg&#40;$distance&#41;; 
    $distance = $distance * 60 * 1.1515; 
    return round&#40;$distance, 2&#41;;
    
&#125;


function midpoint&#40;$p1,$p2&#41;&#123;
	$lat1= deg2rad&#40;$p1&#91;'lat'&#93;&#41;;
    $lng1= deg2rad&#40;$p1&#91;'lgn'&#93;&#41;;
    $lat2= deg2rad&#40;$p2&#91;'lat'&#93;&#41;;
    $lng2= deg2rad&#40;$p2&#91;'lgn'&#93;&#41;;
    $dlng = $lng2 - $lng1;
    $Bx = cos&#40;$lat2&#41; * cos&#40;$dlng&#41;;
    $By = cos&#40;$lat2&#41; * sin&#40;$dlng&#41;;
    $lat3 = atan2&#40; sin&#40;$lat1&#41;+sin&#40;$lat2&#41;,
    sqrt&#40;&#40;cos&#40;$lat1&#41;+$Bx&#41;*&#40;cos&#40;$lat1&#41;+$Bx&#41; + $By*$By &#41;&#41;;
    $lng3 = $lng1 + atan2&#40;$By, &#40;cos&#40;$lat1&#41; + $Bx&#41;&#41;;
    $pi = M_PI;
   //echo round&#40;&#40;$lat3*180&#41;/$pi , 5&#41; .' , '. round&#40;&#40;$lng3*180&#41;/$pi , 5&#41;;die&#40;&#41;;
    return round&#40;&#40;$lat3*180&#41;/$pi , 5&#41; .' , '. round&#40;&#40;$lng3*180&#41;/$pi , 5&#41;;
   
	
&#125;

Το πρόβλημα είναι στο $mid=midpoint($p1,$p2); .Καμιά ιδέα;

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από alou » 26 Ιούλ 2013 18:56

xampp\php\php.ini και μεγάλωσε το memory limit.

Τώρα αν μπορείς να κάνεις το script less consuming, το ψάχνεις.

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από geomagas » 26 Ιούλ 2013 19:45

Μου μυρίζει ατέρμονη αναδρομή (infinite recursion)...
Στα σίγουρα, η midpoint() θα πρέπει να επιστρέφει

Κώδικας: Επιλογή όλων

array&#40;'lat'=>......, 'lgn'=>....&#41;
αλλά δεν ξέρω αν αυτό είναι το μόνο πρόβλημα.

trilos021
Δημοσιεύσεις: 131
Εγγραφή: 04 Νοέμ 2003 18:06

Γρίφος - εισαγωγή ενδιάμεσης τιμής σε πίνακα

Δημοσίευση από trilos021 » 27 Ιούλ 2013 02:56

μήπως το σφάλμα είναι στο $left και στο $right που τρέχουν το function?

Κώδικας: Επιλογή όλων

function divide_long&#40;$p1,$p2,$howlong&#41; 
      &#123; 
      if&#40;distance&#40;$p1,$p2&#41;>$howlong&#41; 
         &#123; 
         $mid=midpoint&#40;$p1,$p2&#41;; 
         $left=divide_long&#40;$p1,$mid,$howlong&#41;; 
         $right=divide_long&#40;$mid,$p2,$howlong&#41;; 
         return array_merge&#40;$left,array&#40;$mid&#41;,$right&#41;; 
         &#125; 
      else 
         return array&#40;&#41;; 
      &#125;

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης