Сообщение от 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
ЗЫ
Хочу заметить что стандартным методом получается прямоугольное поле обзора (четырехугольная пирамида, из-за раздельной проверки по осям), а собственным методом конус, что имхо лучше для данной задачи.