Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6

Тема: IsPointInPolygon

  1. #1
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±

    IsPointInPolygon

    Да,знаю, есть функция от пользователя RyDeR`, но проблема в том, что она, лично у меня, корректно не работает.
    Ссылка на тему: http://forum.sa-mp.com/showthread.ph...on#post1154971

    Я просто её переписал под рабочий вариант и изменил параметры функции, ибо на мой взгляд удобнее в параметрах указать массив с координатами, нежели их записывать в функцию.

    Значение MAX_POLYGON_POINTS меняйте в том случае, если количество точек полигона больше, чем 32.

    PHP код:
    stock IsPointInPolygonFloatpointXFloatpointYFloatpolygon[], totalPoints sizeofpolygon ) ){
        
    #define MAX_POLYGON_POINTS (32) // empty statement with 'polygonSize' =_=
            
    new
                
    polygonSize = ( totalPoints ), // get polygon size
                
    FloatpointsMAX_POLYGON_POINTS ][ ], // x and y
                
    0,
                
    0,
                
    result false
            
    ;
        
    #undef MAX_POLYGON_POINTS
        
        
    for( ; != polygonSize ++, i++ ) { // add points in array
            
    points][ ] = polygon] ; // x
            
    points][ ] = polygon[ ++] ; // y
        
    }

        for( 
    0-= 1polygonSizei++ ) { // first 'i' and last 'j'
            
    if( ( ( points][ ] >= pointY ) != ( points][ ] >= pointY ) ) && ( pointX <= ( points][ ] - points][ ] ) * ( pointY points][ ] ) / ( points][ ] - points][ ] ) + points][ ] ) )
                   
    result = !result// MEGA OPTIMIZATOR 3500
        
    }
        return 
    result ;

    Пример использования:

    PHP код:
    new Float:country_points_0[] = { // "Los Santos"
        
    3000.0,-3000.0,2996.0,-1040.0,1376.0,-684.0,84.0,-1000.0,100.0,-2996.0,3000.0,-3000.0
    };

    ...

    new 
    FloatxFloatyFloat;
    GetPlayerPosplayeridxy);
    if( 
    IsPointInPolygonxycountry_points_0 ) ) { // los santos
          
    SendClientMessageplayerid, -1"Вы в Лос Сантосе." );

     P.S. Код был переписан с приведенного ниже.

    PHP код:
    bool IsPointInPolygon(List<LocpolyLoc point)
    {
        
    int ij;
        
    bool c false;
        for (
    0poly.Count 1poly.Counti++)
        {
            if ((((
    poly[i].Lt <= point.Lt) && (point.Lt poly[j].Lt)) 
                    || ((
    poly[j].Lt <= point.Lt) && (point.Lt poly[i].Lt))) 
                    && (
    point.Lg < (poly[j].Lg poly[i].Lg) * (point.Lt poly[i].Lt
                        / (
    poly[j].Lt poly[i].Lt) + poly[i].Lg))

                
    = !c;
            }
        }

        return 
    c;
    }

    //Loc class

    public class Loc
    {
        private 
    double lt;
        private 
    double lg;

        public 
    double Lg
        
    {
            
    get { return lg; }
            
    set lg value; }
        }

        public 
    double Lt
        
    {
            
    get { return lt; }
            
    set lt value; }
        }

        public 
    Loc(double ltdouble lg)
        {
            
    this.lt lt;
            
    this.lg lg;
        }


  2. 4 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (18.10.2015) Desulaid (18.10.2015) Osetin (18.10.2015) [ForD] (18.10.2015)
  3. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Во-первых, можно было обойтись без MAX_POLYGON_POINTS и без копирования координат в массив points, совершая все операции напрямую с массивом polygon.

    Во-вторых, похожий функционал уже есть в стримере (функции IsPointInDynamicArea и IsPlayerInDynamicArea).

    В-третьих, в Pawn не предусмотрено отдельных инструкций для операций с вещественными числами, поэтому все эти операции делаются с помощью нативных функций.
    Эти вызовы сами по себе уже затратны: тратится время на переход из виртуальной машины на нативный код и обратно - такая проблема характера для многих языков интерпретируемого типа.
    В данном же случае происходит куча вызовов floatcmp, floatadd, floatmul и floatdiv - каждая из этих функция вызывается от 1 до 3 раз для каждой точки.
    Как следствие, та же функция IsPointInDynamicArea из стримера будет работать в разы быстрее.

    Вывод: IsPointInPolygon (возможно) подойдёт только в том случае, если кому-то лень подключать стример из-за одной функции, но результатом такого удобства будет потеря производительности.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. #3
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Во-вторых, похожий функционал уже есть в стримере (функции IsPointInDynamicArea и IsPlayerInDynamicArea).
    Соль в том, что мне не нужен был стример для работы. Функцию я применил при переводе текстовых данных в БД для получения информации о геолокации объектов.

    Ну а в остальном согласен. Будет время - переделаю.

  5. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Seregamil Посмотреть сообщение
    Будет время - переделаю.
    Нет смысла. Из-за операций с вещ. числами через нативки функции стримера в любом случае будут быстрее, чем реализация на Pawn.
    #ITS_NO_USE
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. #5
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Нет смысла. Из-за операций с вещ. числами через нативки функции стримера в любом случае будут быстрее, чем реализация на Pawn.
    #ITS_NO_USE
    Про стример я не говорил не слова и функция с ним никаким боком не связана.

  7. #6
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Seregamil Посмотреть сообщение
    Про стример я не говорил не слова и функция с ним никаким боком не связана.
    Это не повод запрещать другим говорить про альтернативы.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •