دریافت اوقات شرعی در کانستراکت
#1
Lightbulb 
به نام خدا؛
سلام دوستان امیدوارم حالتون خوب باشه...
حتماً براتون پیش اومده که بخواین اوقات شرعی (شامل ساعت طلوع و غروب آفتاب، اذان ظهر، اذان مغرب و نیمه شب شرعی) رو به دست بیارین. امروز قصد دارم کد PHP رو به شما معرفی کنم که بدون اینکه از API خاصی استفاده کنه تنها با توابع ریاضی اوقات شرعی رو محاسبه کنه. پس با من همراه باشین.
دریافت اوقات شرعی: 
قبل از هر چیز باید شیء اِی جَکس (AJAX) رو به پروژه تون اضافه کنین و کد PHP رو در یک دایرکتوری دلخواه از هاست یا سرورتون آپلود کنین. 
کد:
<?php
/**
 * @author Master Badfar
 * @copyright 2020
 */
// صدور مجوز برای AJAX
header('Access-Control-Allow-Origin: *'); 
// قطع نمایش خطاهای مفسر PHP
ini_set('display_errors', 0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// متغیر میزان ارور
$error = 0;
// فانکشن بررسی خالی بودن پارامترها
function check_param($param,$errMsg){
    global $error;
    if (empty($_GET[$param])){
        echo $errMsg . '</br>';
        $error++;
    }
}
// استفاده از تابع تعریف شده برای چک کردن پارامترها
check_param('lat' , 'You should enter the latitude.');
check_param('long' , 'You should enter the longitude.');
check_param('prayer_time' , 'You should enter the prayertime.');
check_param('month' , 'You should enter the month.');
check_param('day' , 'You should enter the day.');
// تابع محاسبه اوقات شرعی
function owghat($m,$d,$lg,$lat,$seconds=1,$dslst=1,$farsi=1){
 $a_2=array(107.695,90.833,0,90.833,94.5,0);
 $doy_1=(($m<7)?($m-1):6) + (($m-1)*30) + $d;
 for($h=0,$i=0;$i<6;$i++){
  $s_m=$m;$s_lg=$lg;  
  if($i<5){
   $doy=$doy_1+($h/24);
    $s_m=74.2023+(0.98560026*$doy);
    $s_l=-2.75043+(0.98564735*$doy);
    $s_lst=8.3162159+(0.065709824*floor($doy))+(24.06570984*fmod($doy,1))+($s_lg/15);    
    $s_omega=(4.85131-(0.052954*$doy))*0.0174532;
    $s_ep=(23.4384717+(0.00256*cos($s_omega)))*0.0174532;
    $s_u=$s_m;
    for($s_i=1;$s_i<5;$s_i++){
     $s_u=$s_u-(($s_u-$s_m-(0.95721*sin(0.0174532*$s_u)))/(1-(0.0167065*cos(0.0174532*$s_u))));
    }
    $s_v=2*(atan(tan(0.00872664*$s_u)*1.0168)*57.2957);
    $s_theta=($s_v-$s_m-2.75612-(0.00479*sin($s_omega))+(0.98564735*$doy))*0.0174532;
    $s_delta=asin(sin($s_ep)*sin($s_theta))*57.2957;
    $s_alpha=57.2957*atan2(cos($s_ep)*sin($s_theta),cos($s_theta));
    if($s_alpha>=360)$s_alpha-=360;
    $s_ha=$s_lst-($s_alpha/15);
    $s_zohr=fmod($h-$s_ha,24);
   $loc2hor=((acos(((cos(0.0174532*$a_2[$i])-sin(0.0174532*$s_delta)*sin(0.0174532*$lat))/cos(0.0174532*$s_delta)/cos(0.0174532*$lat)))*57.2957)/15);
   $azan[$i]=fmod((($i<2)?($s_zohr-$loc2hor):(($i>2)?$s_zohr+$loc2hor:$s_zohr)),24);
  }else{
   $azan[$i]=($azan[0]+$azan[3]+24)/2;
  }
   $x=$azan[$i];
    if($dslst==1 and $doy_1>1 and $doy_1<186){$x++;}else{$dslst=0;}
    if($x<0){$x+=24;}elseif($x>=24){$x-=24;}
    $hor=(int)($x);
    $ml=fmod($x,1)*60;
    $min=(int)($ml);
    $mr=round($ml);
    if($mr==60){$mr=0;$hor++;}
    $sec=(int)(fmod($ml,1)*60);
    $a_1[$i]=(($hor<10)?'0':'').$hor.':'.( ($seconds==0) ? ((($mr<10)?'0':'').$mr) : ((($min<10)?'0':'').$min.':'.(($sec<10)?'0':'').$sec) );
    if($h==0){$h=$azan[$i];$i--;}else{$h=0;}
 }
 $out=array(
    'azan_sobh'=>$a_1[0],
    'sunrise'=>$a_1[1],
    'azan_zohr'=>$a_1[2],
    'sunset'=>$a_1[3],
    'azan_maghreb'=>$a_1[4],
    'nimeshabesharee'=>$a_1[5],
    'month'=>$m,
    'day'=>$d,
    'longitude'=>$lg,
    'latitude'=>$lat,
    'show_seconds'=>$seconds,
    'daylight_saving_time'=>$dslst,
    'farsi_numbers'=>$farsi
 );
 if($farsi==1)$out=str_replace(array('0','1','2','3','4','5','6','7','8','9','.'),array('۰','۱','۲','۳','۴','۵','۶','۷','۸','۹','٫'),$out);
 return $out;
}
// نمایش تعداد کل ارورها
if ($error > 0 ){
    echo "Number of Total Errors: " . $error . '</br>';
}
// استفاده از تابع جهت محاسبه اوقات شرعی
if ($error == 0 && $_GET['prayer_time'] != "all"){
$ogt=owghat( $_GET['month'] , $_GET['day'] , $_GET['long'] , $_GET['lat'] , 0 , 1 , 0);
echo $_GET['prayer_time'] .   " " . "is: " .  $ogt[$_GET['prayer_time']];
}elseif($_GET['prayer_time'] == "all" && $error == 0){
    $ogt=owghat( $_GET['month'] , $_GET['day'] , $_GET['long'] , $_GET['lat'] , 0 , 1 , 0);
    echo 'azan sobh is:'  . " ". $ogt['azan_sobh'] . '</br>';
    echo 'azan zohr is:'  . " ". $ogt['azan_zohr'] . '</br>';
    echo 'azan maghreb is:'  . " ". $ogt['azan_maghreb'] . '</br>';
    echo 'nimeshabesahree is:'  . " ". $ogt['nimeshabesharee'] . '</br>';
    echo 'sunset is:'  . " ". $ogt['sunset'] . '</br>';
    echo 'sunrise is:'  . " ". $ogt['sunrise'] . '</br>';
}
?>
خُب حالا برای استفاده از این کد کافیه اکشن Request URL شیء AJAX رو انتخاب کنین. آرگومان Tag رو هر مقداری که خواستین بهش بدین یا هم اصلاً مقداری براش لحاظ نکنین. آرگومان URL رو به شکل زیر تعریف کنین:
کد:
"http://yourhost.com/file.php?long="&x&"&lat="&y&"&month="&z&"&day="&m&"&prayer_time="&"azan_sobh/azan_zohr/sunrise/sunset/nimeshabesahree/azan_maghreb/all"
همونطور که مشخصه ما 5 پارامتر رو به فایل PHP ارسال می کنیم. پارامتر long در واقع طول جغرافیایی شهری هست که قصد داریم اوقات شرعی اش رو محاسبه کنیم و پارامتر lat هم عرض جغرافیایی اون شهر هست. میتونین مختصات شهرهای ایران رو از این لینک مشاهده کنین و ازش استفاده کنین. حواستون باشه که یک وقت جا به جا طول و عرض جغرافیایی رو وارد نکنید. پارامتر month در واقع برای مشخص کردن شماره ماه تعیین میشه. پارامتر day هم برای مشخص کردن شماره روز در ماه به کار میره. دقت کنین مبنای شما برای وارد کردن شماره روز و ماه تاریخ شمسی خودمون هست. پارامتر prayer_time برای تعیین کردن نمایش هر یک از اوقات شرعی به کار میره. به طوری که اگر خواستین اذان صبح نمایش داده بشه عبارت azan_sobh، برای نماز ظهر عبارت azan_zohr، برای اذان مغرب عبارت azan_maghreb، برای طلوع خورشید عبارت sunrise، برای غروب خورشید عبارت sunset و برای نیمه شب شرعی عبارت nimeshabesahree رو دقیقاً برای پارامتر prayer_time قرار بدین. اگر همه موارد رو خواستین میتونین عبارت  prayer_time رو برابر با عبارت all قرار بدین.
نکته: الگوریتم محاسبه اوقات شرعی میتونه همراه با خطا (حداکثر تا نیم ساعت) باشه. برای افزایش هر چه بیشتر دقت الگوریتم توصیه میشه طول و عرض جغرافیایی شهر موردنظر رو با دقت بیشتری (تعداد اعشار بیشتری) وارد کنین. 
توضیحات خروجی ارورهای کد PHP: 
  • اگر برای هر یک از پارامترها (lat،long،day،month و prayer_time) مقداری تعیین نشده باشد پیغام زیر نمایش داده خواهد شد:
کد:
You should enter the (x).
(عبارت x بیانگر نام هر یک از پارامترها می باشد.)
  • اگر تعداد کل ارورها بیش از یک عدد شود پیغام زیر پس از نمایش سایر ارورها در انتها نمایش داده خواهد شد:
کد:
Number of Total Errors: (y)
(عبارت y بیانگر تعداد ارورهای یافت شده می باشد.)
امیدوارم این مطلب براتون مفید و کاربردی واقع شده باشه.
خوشحال میشم نظراتتون رو به بنده گوشزد کنین و اگر جایی ایرادی مشاهده میشه اعلام کنین.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: mohammadslt ، MohammadHadi ، Mahdi Azimi ، amin hosseini
#2

خسته نباشید 
باهاش میشه یه چیزی مثل باد صبا درست کرد اره ؟
غایب
  پاسخ


 سپاس شده توسط:
#3
(1399/2/4، 12:59 عصر)mohammadslt نوشته است: خسته نباشید 
باهاش میشه یه چیزی مثل باد صبا درست کرد اره ؟
سلام و درود به شما؛
بله این امکان وجود داره. اما برای زمان دقیق تر بهتره از API اوقات شرعی استفاده کنین. البته که این الگوریتم هم زمان رو تقریباً درست محاسبه میکنه.
نکته دیگه ای هم که هست اینه که کانستراکت یک انجین بازیسازیه و بهتره برای پیاده سازی اپ اندروید سمت جاوا و b4a برین. (خودمم خیلی به این موضوع پایبندم ماشاالله 22)
موفق باشین.
غایب
  پاسخ


 سپاس شده توسط: mohammadslt
#4
ممنون از زحماتی که میکشید ، اگه میشه یه اموزش از rss یا تفکیک کدهای صفحات وب هم بسازید . که چطوری وقتی یه صفحه وب رو کدهاشو با آژاکس دریافت میکنیم به خط موردنظر برسیم.
استودیو بازیسازی ایروید
جدید ترین ها : شهرزاد ، دربند;1357 و ATOM
[تصویر:  ads.gif]
  پاسخ


 سپاس شده توسط:
#5
(1399/2/4، 01:23 عصر)محمد 82 نوشته است: ممنون از زحماتی که میکشید ، اگه میشه یه اموزش از rss یا تفکیک کدهای صفحات وب هم بسازید . که چطوری وقتی یه صفحه وب رو کدهاشو با آژاکس دریافت میکنیم به خط موردنظر برسیم.
سلام؛
یه مشکلی هست و اونم اینه که همه سایت ها از یک فرمت RSS خاص پیروی نمیکنن. اگر قصد داری از PHP استفاده کنی میتونی خزنده (رباتت) رو با کتابخانه CURL این زبان ایجاد کنی.
موفق باشین.
غایب
  پاسخ


 سپاس شده توسط: mohammadslt


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش پروژه محور ساخت بازی مار و پله mohsen_nasri 6 3,807 1403/10/24، 09:38 عصر
آخرین ارسال: Tggi
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 128 86,462 1403/10/23، 04:58 عصر
آخرین ارسال: Tggi
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 20,911 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,601 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 8,600 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100

پرش به انجمن: