Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Blitz3D > Полезные функции

Полезные функции Выкладываем полезные функции, чтоб не изобретать велосипед заново...

Ответ
 
Опции темы
Старый 04.12.2011, 10:52   #1
pepel
Мастер
 
Аватар для pepel
 
Регистрация: 23.09.2009
Адрес: ленобласть
Сообщений: 1,189
Написано 447 полезных сообщений
(для 2,526 пользователей)
Функции 2d пересечений

Пишу тут физику для игрули и подумал может кому пригодятся функции

Пересечение прямоугольника и квадрата :
Function cross_square_and_rect(x1#,y1#,x2#,y2#,x#,y#,side#)

    
w#=x1-x2
    
h#=y1-y2
    
centerx#=x1-w/2
    
centery#=y1-h/2

    
If Abs(centerx x) <= (Abs(w) + side) / And Abs(centery y) <= (Abs(h) + side) / Return True
    
    
End 
Function 
можно переделать в функцию пересечения двух прямоугольников

прикрепил exe и *.bb примера
Миниатюры
Нажмите на изображение для увеличения
Название: rect_quad.jpg
Просмотров: 201
Размер:	9.7 Кб
ID:	15653  
Вложения
Тип файла: rar test_box_i_rect.rar (477.2 Кб, 112 просмотров)
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pepel за это полезное сообщение:
LLI.T.A.L.K.E.R. (08.01.2012), Nikich (10.08.2012)
Старый 04.12.2011, 11:01   #2
pepel
Мастер
 
Аватар для pepel
 
Регистрация: 23.09.2009
Адрес: ленобласть
Сообщений: 1,189
Написано 447 полезных сообщений
(для 2,526 пользователей)
Ответ: Функции 2d пересечений

Пересечение отрезка и окружности

Function cross(x#,y#,r#,x01#,y01#,x02#,y02#)

    
rr#=r*r

    
;Проверка на нахождение одного из концов отрезка в круге
    
If ((x01-x)*(x01-x)+(y01-y)*(y01-y)<=rr) Return 1
    
If ((x02-x)*(x02-x)+(y02-y)*(y02-y)<=rr) Return 1

    
;axis-aligned

    
If(y01=y02)
        If (((
x01<And x02>x) Or  (x01>And x02<x)) And Abs(y01-y)<=r) Return 1;
    EndIf        

    ;
Находим точку (xp,ypпересечения перпендикуляра от центра круга к линии,
    ;
которой принадлежит отрезок.
    
a#=(y01-y02)/(x01-x02)
    
b#=y01-a*x01
    
xp#=(y-b+x/a)/(a+1/a)
    
yp#=a*xp+b

    
If(y01=y02xp=x:yp=y01
    

    
If ((x01<xp And x02>xp) Or (x02<xp And x01>xp))
    ;
Находится внутри круга?
        
        If ((
xp-x)*(xp-x)+(yp-y)*(yp-y)<rr)     Return 
        
        
    
EndIf

;Return 
False 
End 
Function 
прикрепил exe и *.bb файлы примера
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.PNG
Просмотров: 205
Размер:	8.6 Кб
ID:	15654  
Вложения
Тип файла: rar Okr_i_otrezok.rar (478.4 Кб, 118 просмотров)
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pepel за это полезное сообщение:
LLI.T.A.L.K.E.R. (08.01.2012), Nikich (10.08.2012)
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 11:00.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com