Показать сообщение отдельно
Старый 03.04.2009, 18:17   #29
Venom
Оператор ЭВМ
 
Регистрация: 25.02.2008
Сообщений: 24
Написано 8 полезных сообщений
(для 30 пользователей)
Ответ: Памагитяяяяяяяяяя...

Сообщение от tormoz Посмотреть сообщение
Собстно нормально оформленных тестов не увидел

создай бб-ешник с 2 функциями - проверка стандартны и твоим методом, сделай в цикле вызов проверки достаточное число раз (например 1000), сделай переключение между методами по клавише и вывод результата на экран.

вот это будет корректный тест

и если разница на 1000 вызовов будет менее 1 мс то я считаю что я прав, а ты изобрел очередной велосипед с квадратными колесами
А я что привел? Может тебе к окулисту сходить, зрение проверить, а?

Вот еще один тест "риалтайм", специально для impersonalis ввел константы с понятными именами, а так-же прокомментировал (а то может по названиям непонятно *ROFL*):
; режим работы экрана
Const SCREEN_MODE% = 0

; разрешение экрана
Const SCREEN_WIDTH% = 800
Const SCREEN_HEIGHT% = 600

; центр экрана
Const SCREEN_X_CENTER% = SCREEN_WIDTH / 2
Const SCREEN_Y_CENTER% = SCREEN_HEIGHT / 2

; сдвиг наблюдаемого обьекта по оси Z от камеры
Const ENTITY_Z_OFFSET_FROM_CAMERA# = 5.0

; полный угол в градусах
Const FULL_CIRCLE_IN_DEGREES# = 360.0

; обратная величина полного угла в градусах
Const INVERSE_FULL_CIRCLE_IN_DEGREES# = 1.0 / FULL_CIRCLE_IN_DEGREES

; резкость управления мышью
Const MOUSE_X_SENSITIVITY# = 0.25
Const MOUSE_Y_SENSITIVITY# = 0.25

; ограничение угла обзора камеры по оси ординат
Const CAMERA_PITCH_THRESHOLD# = 85.0

; скорость движения камеры вперед\назад
Const CAMERA_FORWARD_VELOCITY# = 0.05
Const CAMERA_BACKWARD_VELOCITY# = -0.05

; половина угла и дистанция обзора камеры для стандартного метода
Const HALF_FIELD_OF_VIEW_FOR_STANDART_TEST# = 25.0
Const DISTANCE_OF_VIEW_FOR_STANDART_TEST# = 10.0

; половина угла и дистанция обзора камеры для собственного метода
Const HALF_FIELD_OF_VIEW_FOR_CUSTOM_TEST# = 0.906308 ;Cos(HALF_FIELD_OF_VIEW_FOR_STANDART_TEST)
Const DISTANCE_OF_VIEW_FOR_CUSTOM_TEST# = 100.0 ;DISTANCE_OF_VIEW_FOR_STANDART_TEST ^ 2

; кол-во итераций
Const ITERATION_QUANTITY% = 1000

Local xang#, yang#
Local from%, what%
Local frames%, timer%, fps%
Local method%, count%, result%

Graphics3D(SCREEN_WIDTH, SCREEN_HEIGHT, 0, SCREEN_MODE)
SetBuffer(BackBuffer())

;Наблюдаемый обьект
what = CreateSphere()
PositionEntity(what, 0.0, 0.0, ENTITY_Z_OFFSET_FROM_CAMERA)

;Наблюдающий обьект
from = CreateCamera()
CameraZoom(from, 1.0 / Tan(HALF_FIELD_OF_VIEW_FOR_STANDART_TEST))
CameraRange(from, 1.0, DISTANCE_OF_VIEW_FOR_STANDART_TEST)

MoveMouse(SCREEN_X_CENTER, SCREEN_Y_CENTER)
Repeat

    ; -----------------------------------------------------
    ; Управление камерой
    ; -----------------------------------------------------
    xang = xang - MouseXSpeed() * MOUSE_X_SENSITIVITY
    yang = yang + MouseYSpeed() * MOUSE_Y_SENSITIVITY
    MoveMouse(SCREEN_X_CENTER, SCREEN_Y_CENTER)
    
    ; модуль для чисел с плавающей запятой
    xang = xang - Int(xang * INVERSE_FULL_CIRCLE_IN_DEGREES) * FULL_CIRCLE_IN_DEGREES
    ; ограничиваем отрицательное значение угла по оси абсцисс
    If (xang < 0.0) Then
        xang = FULL_CIRCLE_IN_DEGREES + xang
    EndIf
    
    ; impersonalis ты доволен? *ROFL*
    If (Abs(yang) > CAMERA_PITCH_THRESHOLD) Then
        yang = Sgn(yang) * CAMERA_PITCH_THRESHOLD
    EndIf

    RotateEntity(from, yang, xang, 0.0)
    If (KeyDown(200)) Then
        MoveEntity(from, 0.0, 0.0, CAMERA_FORWARD_VELOCITY)
    EndIf
    If (KeyDown(208)) Then
        MoveEntity(from, 0.0, 0.0, CAMERA_BACKWARD_VELOCITY)
    EndIf
    ; -----------------------------------------------------
    
    RenderWorld()
    
    If (KeyHit(57)) Then
        method = 1 Xor method
    EndIf

    If (method = 0)
        Text(10, 10, "Стандартный метод")
        
        For count = 1 To ITERATION_QUANTITY
            result = StandartTest(from, what, DISTANCE_OF_VIEW_FOR_STANDART_TEST, HALF_FIELD_OF_VIEW_FOR_STANDART_TEST)
        Next
    EndIf
    
    If (method = 1)
        Text(10, 10, "Собственный метод")
        
        For count = 1 To ITERATION_QUANTITY
            result = CustomTest(from, what, DISTANCE_OF_VIEW_FOR_CUSTOM_TEST, HALF_FIELD_OF_VIEW_FOR_CUSTOM_TEST)
        Next
    EndIf

    Text(10, 20, Str(fps))
    
    If (result) Then
        Text(10, 30, "Обьект в поле зрения")
    EndIf
    
    Flip(False)
    
    ; -----------------------------------------------------
    ; Счетчик кол-ва кадров в секунду
    ; -----------------------------------------------------
    frames = frames + 1
    If (MilliSecs() > timer) Then
        fps = frames
        frames = 0
        timer = MilliSecs() + 999
    EndIf
    ; -----------------------------------------------------
Until (KeyDown(1))
End

; -------------------------
; Стандартный метод
; -------------------------
Function StandartTest%(from%, what%, dist#, view#)
    If (EntityDistance(from, what) < dist) Then
        If ((Abs(DeltaYaw(from, what)) < view) And (Abs(DeltaPitch(from, what)) < view)) Then
            Return True
        EndIf
    EndIf
    Return False
End Function

; -------------------------
; Собственный метод
; -------------------------
Function CustomTest%(from%, what%, dist#, view#)
    Local xsub#, ysub#, zsub#, temp#
    xsub = EntityX(what) - EntityX(from)
    ysub = EntityY(what) - EntityY(from)
    zsub = EntityZ(what) - EntityZ(from)
    temp = xsub * xsub + ysub * ysub + zsub * zsub
    If (temp < dist) Then
        temp = 1.0 / Sqr(temp)
        xsub = xsub * temp
        ysub = ysub * temp
        zsub = zsub * temp
        temp = xsub * GetMatElement(from, 2, 0) + ysub * GetMatElement(from, 2, 1) + zsub * GetMatElement(from, 2, 2)
        If (temp > view) Then
            Return True
        EndIf
    EndIf
    Return False
End Function
ЗЫ
Хочу заметить что стандартным методом получается прямоугольное поле обзора (четырехугольная пирамида, из-за раздельной проверки по осям), а собственным методом конус, что имхо лучше для данной задачи.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Venom за это полезное сообщение:
h1dd3n (03.04.2009), HolyDel (03.04.2009), impersonalis (03.04.2009)