亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gpstools.c

?? Open DMT Client C Source code
?? C
字號:
// ----------------------------------------------------------------------------// Copyright 2006-2007, Martin D. Flynn// All rights reserved// ----------------------------------------------------------------------------//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at// // http://www.apache.org/licenses/LICENSE-2.0// // Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.//// ----------------------------------------------------------------------------// Description://  GPS tools //  Tools for managing GPS Latitude/Longitude and calculating distance.// ---// General References://  http://williams.best.vwh.net/avform.htm//  http://www.boeing-727.com/Data/fly%20odds/distance.html    [excellent ref]//  http://williams.best.vwh.net/intersect.htm//  http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry1//  http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry3#satellites//  http://geometryalgorithms.com/Archive/algorithm_0102/algorithm_0102.htm#Distance%20to%20Ray%20or%20Segment//  http://mathforum.org/library/drmath/sets/select/dm_lat_long.html//  http://mathforum.org/library/drmath/view/51818.html// Heading/Bearing://  http://mathforum.org/library/drmath/view/55417.html//  http://williams.best.vwh.net/avform.htm// Velocities://  http://www.xbow.com/Support/Support_pdf_files/NAV420AppNote.pdf// ---// Change History://  2006/01/04  Martin D. Flynn//     -Initial release//  2006/03/12  Martin D. Flynn//     -Fixed bug where Longitude was not encoded/decoded properly in the Eastern Hemishpere.//  2006/06/08  Martin D. Flynn//     -Added 'pdop' to 'GPT_t'//  2007/01/28  Martin D. Flynn//     -WindowsCE port//     -Added support for 'GPSOdometer_t'// ----------------------------------------------------------------------------#include "stdafx.h" // TARGET_WINCE#define SKIP_TRANSPORT_MEDIA_CHECK // only if TRANSPORT_MEDIA not used in this file #include "custom/defaults.h"#include <stdio.h>#include <string.h>#include <ctype.h>#include <math.h>#include "tools/stdtypes.h"#include "tools/strtools.h"#include "tools/gpstools.h"#include "tools/utctools.h"#include "custom/log.h"// ----------------------------------------------------------------------------static double SQUARE(double X) { return X * X; }#if defined(TARGET_WINCE)#define IS_NAN(X)   _isnan(X)#define SNPRINTF    _snprintf#else#define IS_NAN(X)   isnan(X)#define SNPRINTF    snprintf#endif// ----------------------------------------------------------------------------/* clear GPSPoint_t structure */void gpsPointClear(GPSPoint_t *gp){    gpsPoint(gp, GPS_UNDEFINED_LATITUDE, GPS_UNDEFINED_LONGITUDE);}/* init GPSPoint_t structure */GPSPoint_t *gpsPoint(GPSPoint_t *gp, double lat, double lon){    if (gp) {        gp->latitude  = lat;        gp->longitude = lon;    }    return gp;}/* copy source point to destination structure */GPSPoint_t *gpsPointCopy(GPSPoint_t *d, const GPSPoint_t *s){    if (d && s) {        memcpy(d, s, sizeof(GPSPoint_t));        return d;    } else {        return (GPSPoint_t*)0;    }}/* return true if the specified point is valid */utBool gpsPointIsValid(const GPSPoint_t *gp){    // return 'true' if this is a valid GPS point, 'false' otherwise    if (gp) {        //if (isNAN(gp->latitude) || isNAN(gp->longitude)) {        //    return utFalse;        //} else        if ((gp->latitude == 0.0) && (gp->longitude == 0.0)) {            return utFalse;        } else        if ((gp->latitude  >=  90.0) || (gp->latitude  <=  -90.0) ||            (gp->longitude >= 180.0) || (gp->longitude <= -180.0)   ) {            return utFalse;        } else {            return utTrue;        }    } else {        return utFalse;    }}// ----------------------------------------------------------------------------/* return the distance (in radian) between the specified points */double gpsRadiansToPoint(    const GPSPoint_t *gpS,            // From point    const GPSPoint_t *gpE)            // To point{        /* validate both points */    if ((gpS->latitude  >=  90.0) || (gpS->latitude  <=  -90.0) ||        (gpS->longitude >= 180.0) || (gpS->longitude <= -180.0) ||        (gpE->latitude  >=  90.0) || (gpE->latitude  <=  -90.0) ||        (gpE->longitude >= 180.0) || (gpE->longitude <= -180.0)   ) {        return 0.0;    }    // Haversine formula (faster and less prone to rounding errors than 'Law of Cosines' algorithm    // required math functions: sin, cos, atan2, sqrt    double radLatS, radLonS, radLatE, radLonE, dlat, dlon, a, rad;    radLatS = gpS->latitude  * RADIANS;  // Y    radLonS = gpS->longitude * RADIANS;  // X    radLatE = gpE->latitude  * RADIANS;  // Y    radLonE = gpE->longitude * RADIANS;  // X    dlat    = radLatE - radLatS;    dlon    = radLonE - radLonS;    a       = SQUARE(sin(dlat/2.0)) + (cos(radLatS) * cos(radLatE) * SQUARE(sin(dlon/2.0)));    rad     = 2.0 * atan2(sqrt(a), sqrt(1.0 - a));    return rad;    }/* return the distance (in meters) between the specified points */double gpsMetersToPoint(    const GPSPoint_t *gpS,            // From point    const GPSPoint_t *gpE)            // To point{    double rad = gpsRadiansToPoint(gpS, gpE);    return rad * EARTH_RADIUS_METERS;}/* return the distance (in kilometers) between the specified points */double gpsKilometersToPoint(    const GPSPoint_t *gpS,            // From point    const GPSPoint_t *gpE)            // To point{    double rad = gpsRadiansToPoint(gpS, gpE);    return (rad * EARTH_RADIUS_METERS) / 1000.0;}// ----------------------------------------------------------------------------/* copy source GPS structure to destination */GPS_t *gpsCopy(GPS_t *dest, const GPS_t *src){    if (dest) {        if (src) {            memcpy(dest, src, sizeof(GPS_t));        } else {            gpsClear(dest);        }        return dest;    } else {        return (GPS_t*)0;    }}/* initialize GPS structure */GPS_t *gpsClear(GPS_t *gps){    if (gps) {        memset(gps, 0, sizeof(GPS_t));        // explicitly init all floating point values ...        gps->point.latitude  = GPS_UNDEFINED_LATITUDE;        gps->point.longitude = GPS_UNDEFINED_LONGITUDE;        gps->accuracy        = GPS_UNDEFINED_ACCURACY;        gps->speedKPH        = GPS_UNDEFINED_SPEED;        gps->heading         = GPS_UNDEFINED_HEADING;        gps->altitude        = GPS_UNDEFINED_ALTITUDE;        gps->pdop            = GPS_UNDEFINED_DOP;        gps->hdop            = GPS_UNDEFINED_DOP;        gps->vdop            = GPS_UNDEFINED_DOP;    }    return gps;}/* return true if the specified GPS stgructure has been populated with a valid GPS fix */utBool gpsIsValid(const GPS_t *gps){    if (!gps) {        // no GPS specified        return utFalse;    } else    if (gps->fixtime <= 0L) {        // no valid GPS fix        return utFalse;    } else {        return utTrue;    }}// ----------------------------------------------------------------------------/* parse strng into GPS structure */GPS_t *gpsParseString(GPS_t *gps, const char *s){    // <fixtime>,<latitude>,<longitude>,<accuracy>,<speed>,<heading>,<altitude>    if (!gps || !s) {                // nothing to parse        return (GPS_t*)0;            } else {                gpsClear(gps);        int f;        for (f = 0; f < 7; f++) { // 7 possible fields                        /* skip to field */            while (*s && isspace(*s)) { s++; }            if (!*s || (!isdigit(*s) && (*s != '-'))) { break; }                        /* parse field */            switch (f) {                case 0: gps->fixtime         =        strParseUInt32(s,      0L); break;                case 1: gps->point.latitude  =        strParseDouble(s,     0.0); break;                case 2: gps->point.longitude =        strParseDouble(s,     0.0); break;                case 3: gps->accuracy        = (float)strParseDouble(s,     0.0); break;                case 4: gps->speedKPH        = (float)strParseDouble(s,    -1.0); break;                case 5: gps->heading         = (float)strParseDouble(s,    -1.0); break;                case 6: gps->altitude        = (float)strParseDouble(s, -9999.0); break;            }            /* skip over comma */            while (*s && (*s != ',')) { s++; }            if (*s != ',') { break; }            *s++;        }        return gps;            }}/* create a string from the specified GPS structure */const char *gpsToString(GPS_t *gps, utBool all, char *s, int slen){    // <fixtime>,<latitude>,<longitude>,<accuracy>,<speed>,<heading>,<altitude>    if (s && (slen > 0)) {        if (all) {            SNPRINTF(s, slen, "%lu,%.6lf,%.6lf,%.1f,%.1f,%.1f,%.1f",                 gps->fixtime,                gps->point.latitude, gps->point.longitude,                gps->accuracy,                gps->speedKPH,                gps->heading,                gps->altitude                );        } else {            SNPRINTF(s, slen, "%lu,%.6lf,%.6lf",                 gps->fixtime,                gps->point.latitude, gps->point.longitude                );        }        return s;    }    return (char*)0;}// ----------------------------------------------------------------------------/* parse GPSOdometer_t from string */GPSOdometer_t *gpsOdomParseString(GPSOdometer_t *gps, const char *s){    // <fixtime>,<latitude>,<longitude>,<meters>    if (!gps || !s) {                // nothing to parse        return (GPSOdometer_t*)0;            } else {                memset(gps, 0, sizeof(GPSOdometer_t));        gpsPointClear(&(gps->point));        int f;        for (f = 0; f < 4; f++) { // 4 possible fields                        /* skip to field */            while (*s && isspace(*s)) { s++; }            if (!*s || (!isdigit(*s) && (*s != '-'))) { break; }                        /* parse field */            switch (f) {                case 0: gps->fixtime         = strParseUInt32(s,  0L); break;                case 1: gps->point.latitude  = strParseDouble(s, 0.0); break;                case 2: gps->point.longitude = strParseDouble(s, 0.0); break;                case 3: gps->meters          = strParseUInt32(s,  0L); break;            }            /* skip over comma */            while (*s && (*s != ',')) { s++; }            if (*s != ',') { break; }            *s++;        }        return gps;    }}/* print GPSOdometer_t to string */const char *gpsOdomToString(GPSOdometer_t *gps, char *s, int slen){    // <fixtime>,<latitude>,<longitude>,<meters>    if (s && (slen > 0)) {        SNPRINTF(s, slen, "%lu,%.6lf,%.6lf,%lu",             gps->fixtime,            gps->point.latitude, gps->point.longitude,            gps->meters            );        return s;    }    return (char*)0;}// ----------------------------------------------------------------------------/* encode GPS lat/lon to 6-byte buffer */UInt8 *gpsPointEncode6(UInt8 *buf, const GPSPoint_t *gps){    if (gpsPointIsValid(gps)) {        int i;        UInt32 rLat = (UInt32)((gps->latitude  -  90.0) * (POW2_24F / -180.0));        UInt32 rLon = (UInt32)((gps->longitude + 180.0) * (POW2_24F /  360.0)); // BUGFIX_2006/03/12        for (i = 2; i >= 0; i--) {            buf[i    ] = (UInt8)(rLat & 0xFF);            buf[i + 3] = (UInt8)(rLon & 0xFF);            rLat >>= 8;            rLon >>= 8;        }    } else {        memset(buf, 0, 6);    }    return buf;}/* decode GPS lat/lon from 6-byte buffer */GPSPoint_t *gpsPointDecode6(GPSPoint_t *gps, const UInt8 *buf){    int i;    UInt32 rLat = 0L, rLon = 0L;    for (i = 0; i < 3; i++) {        rLat = (rLat << 8) | buf[i    ];        rLon = (rLon << 8) | buf[i + 3];    }    if (rLat || rLon) {        gps->latitude  = ((double)rLat * (-180.0 / POW2_24F)) +  90.0;        gps->longitude = ((double)rLon * ( 360.0 / POW2_24F)) - 180.0; // BUGFIX_2006/03/12    } else {        gps->latitude  = 0.0;        gps->longitude = 0.0;    }    return gps;}// ----------------------------------------------------------------------------/* encode GPS lat/lon to 8-byte buffer */UInt8 *gpsPointEncode8(UInt8 *buf, const GPSPoint_t *gps){    if (gpsPointIsValid(gps)) {        int i;        UInt32 rLat = (UInt32)((gps->latitude  -  90.0) * (POW2_32F / -180.0));        UInt32 rLon = (UInt32)((gps->longitude + 180.0) * (POW2_32F /  360.0)); // BUGFIX_2006/03/12        for (i = 3; i >= 0; i--) {            buf[i    ] = (UInt8)(rLat & 0xFF);            buf[i + 4] = (UInt8)(rLon & 0xFF);            rLat >>= 8;            rLon >>= 8;        }    } else {        memset(buf, 0, 8);    }    return buf;}/* decode GPS lat/lon from 8-byte buffer */GPSPoint_t *gpsPointDecode8(GPSPoint_t *gps, const UInt8 *buf){    int i;    UInt32 rLat = 0L, rLon = 0L;    for (i = 0; i < 4; i++) {        rLat = (rLat << 8) | buf[i    ];        rLon = (rLon << 8) | buf[i + 4];    }    if (rLat || rLon) {        gps->latitude  = ((double)rLat * (-180.0 / POW2_32F)) +  90.0;        gps->longitude = ((double)rLon * ( 360.0 / POW2_32F)) - 180.0; // BUGFIX_2006/03/12    } else {        gps->latitude  = 0.0;        gps->longitude = 0.0;    }    return gps;}// ----------------------------------------------------------------------------

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二区三区中文精品 | 97精品久久久午夜一区二区三区| 成年人网站91| 欧美丰满高潮xxxx喷水动漫| 国产欧美一二三区| 欧美aaa在线| 在线亚洲免费视频| 国产欧美一区视频| 精品一区在线看| 欧美精品久久一区| 亚洲激情在线播放| 成人激情综合网站| 久久一区二区三区四区| 日韩国产在线一| 欧洲激情一区二区| 国产精品三级av| 国产毛片一区二区| 日韩精品一区二区三区swag| 无码av免费一区二区三区试看| 91亚洲国产成人精品一区二区三| 久久精子c满五个校花| 精品中文字幕一区二区小辣椒| 欧美日韩五月天| 亚洲一区二区三区四区五区黄| aaa亚洲精品| 国产精品久久久久久户外露出 | 在线观看免费视频综合| 亚洲国产精华液网站w| 国产在线精品不卡| 久久色视频免费观看| 激情亚洲综合在线| 26uuu另类欧美| 国产伦精品一区二区三区在线观看 | 亚洲第一成年网| 欧洲亚洲国产日韩| 午夜亚洲福利老司机| 欧美日韩国产bt| 日韩专区一卡二卡| 日韩一级二级三级精品视频| 天天av天天翘天天综合网色鬼国产| 欧美在线免费视屏| 日韩影院免费视频| 精品伦理精品一区| 国产精品原创巨作av| 国产日韩欧美a| 91亚洲精品久久久蜜桃| 亚洲大型综合色站| 欧美一区二区三区视频在线 | 亚洲成人在线免费| 日韩欧美精品三级| 国产精品自拍一区| 亚洲天堂2016| 欧美性猛交xxxxxx富婆| 秋霞电影一区二区| 久久久国产精华| 99久久伊人久久99| 亚洲图片一区二区| 精品欧美一区二区在线观看| 国产.欧美.日韩| 亚洲一级二级三级| 日韩视频永久免费| 成人av手机在线观看| 亚洲成人激情自拍| ww亚洲ww在线观看国产| 色综合一个色综合| 蜜臀99久久精品久久久久久软件| 国产欧美日韩在线| 欧美三级视频在线观看| 国产曰批免费观看久久久| 成人欧美一区二区三区白人| 91精品一区二区三区在线观看| 国产精品自在在线| 视频在线观看一区二区三区| 中文字幕欧美激情| 欧美日韩黄色影视| 成人h动漫精品| 日韩二区三区四区| 亚洲人午夜精品天堂一二香蕉| 91麻豆精品国产91久久久资源速度| 国产精品亚洲综合一区在线观看| 亚洲一区在线观看免费 | 日韩一区二区在线观看视频播放| 成人激情免费电影网址| 免费一级欧美片在线观看| 亚洲乱码中文字幕综合| 久久香蕉国产线看观看99| 欧美三级电影网| 高清不卡在线观看av| 美女被吸乳得到大胸91| 夜夜嗨av一区二区三区中文字幕| 久久众筹精品私拍模特| 在线观看91av| 欧美色综合影院| 99精品视频一区二区| 精品一区二区三区在线观看国产| 亚洲国产成人av| 亚洲色图.com| 国产精品乱码人人做人人爱| 精品久久久三级丝袜| 欧美一区二视频| 欧美亚洲一区二区在线观看| 99精品视频一区| 不卡av在线网| 成人高清视频免费观看| 国产成a人无v码亚洲福利| 精品一区在线看| 精品亚洲porn| 国精产品一区一区三区mba视频 | 国产婷婷色一区二区三区| 欧美白人最猛性xxxxx69交| 欧美精品v国产精品v日韩精品| 欧洲激情一区二区| 欧美在线一区二区三区| 欧美性生活久久| 欧美日韩国产美| 4438成人网| 日韩午夜小视频| 精品精品国产高清a毛片牛牛| 日韩精品中文字幕一区| 欧美xxxx在线观看| 亚洲精品一区二区三区福利 | 精品少妇一区二区三区视频免付费| 欧美伦理电影网| 日韩欧美在线一区二区三区| 日韩欧美电影一二三| 2021国产精品久久精品| 久久久国产精品不卡| 亚洲视频在线一区二区| 亚洲激情一二三区| 日韩精品一级中文字幕精品视频免费观看 | 国产精品的网站| 亚洲色图色小说| 亚洲r级在线视频| 奇米四色…亚洲| 国产麻豆精品一区二区| 成人动漫一区二区| 欧美性高清videossexo| 日韩欧美在线1卡| 国产午夜亚洲精品不卡| 亚洲精品福利视频网站| 日韩电影在线免费| 国产精品1区2区| 色婷婷综合久色| 欧美一区二区三区思思人| 国产欧美精品区一区二区三区 | 国产黑丝在线一区二区三区| 99久久99久久精品国产片果冻| 在线观看国产一区二区| 日韩欧美另类在线| 亚洲人成网站影音先锋播放| 日本不卡一区二区三区高清视频| 国产不卡高清在线观看视频| 色综合一区二区| 久久亚洲捆绑美女| 亚洲123区在线观看| 国产精品99久久久久久久女警| 一本大道久久a久久精二百| 日韩免费高清av| 亚洲毛片av在线| 国产乱码字幕精品高清av| 在线观看欧美黄色| 国产欧美日韩综合精品一区二区 | 亚洲二区在线视频| 国产一区二区不卡| 欧美日韩亚洲综合一区| 中文字幕一区二区在线观看| 久久99最新地址| 欧美视频一区二区三区在线观看| 国产日韩欧美电影| 免费观看91视频大全| 91搞黄在线观看| 国产欧美视频在线观看| 玖玖九九国产精品| 欧美日韩国产精品成人| 国产精品国产三级国产aⅴ中文| 激情综合色播激情啊| 欧美一区二区三区思思人| 亚洲成人动漫av| 欧美日韩中文国产| 亚洲久草在线视频| proumb性欧美在线观看| 国产午夜三级一区二区三| 美国一区二区三区在线播放| 欧美性一二三区| 亚洲黄一区二区三区| 成人av在线资源网| 国产午夜精品福利| 国产一区二区三区最好精华液| 91精品国产黑色紧身裤美女| 亚洲已满18点击进入久久| 一本色道久久综合精品竹菊| 中文字幕精品一区| 国产成人免费在线观看| 久久精品男人天堂av| 国产一区二区三区在线看麻豆| 欧美一级在线观看| 麻豆国产精品777777在线| 日韩一区二区三| 久久97超碰国产精品超碰| 亚洲精品在线电影|