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

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

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

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

Ответ
 
Опции темы
Старый 21.01.2007, 01:49   #1
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Пересечение лини и окружности.

может пригодиться для определения коллизии между игроком и быстролетящем снарядом в играх с видом сверху (сбоку).
Graphics 640,480,16,2
SetBuffer BackBuffer()

x#=Rnd(1,600)
y#=Rnd(1,400)
x1#=Rnd(1,600)
y1#=Rnd(1,400)
x2#=Rnd(1,600)
y2#=Rnd(1,400)
r=20

While Not KeyDown(1)
	Cls
	circle(x,y,r)
	Line x1,y1,x2,y2
	If MouseDown(3) Then x=MouseX():y=MouseY()
	If MouseDown(1) Then x1=MouseX():y1=MouseY()
	If MouseDown(2) Then x2=MouseX():y2=MouseY()
	If insect2d(r,x,y,x1,y1,x2,y2) Then Text 10,10,"INSECT!!!"
	Flip
Wend
n=10^6
a=MilliSecs()
For i=1 To n
	Insect2D(5,7,2,6,i,1,4)
Next
RuntimeError("a="+Str(MilliSecs()-a))

Function circle(x,y,r)
	Oval x-r,y-r,r*2,r*2,0
End Function
Function Insect2D(r#,x#,y#,x1#,y1#,x2#,y2#)
mx#=(x2+x1)/2
my#=(y2+y1)/2
d#=Sqr((x1-mx)*(x1-mx)+(y1-my)*(y1-my))
u#=Sqr((mx-x)*(mx-x)+(my-y)*(my-y))
If(u<(d+r))
c#=Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
If(c=0) Return 1
a#=Sqr((x-x2)*(x-x2)+(y-y2)*(y-y2))
b#=Sqr((x1-x)*(x1-x)+(y1-y)*(y1-y))
p#=(a+b+c)/2
s#=Sqr(p*(p-a)*(p-b)*(p-c))
h#=s*2/c
If (h<r) Return 1
EndIf
Return 0
End Function
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (07.07.2010)
Старый 11.02.2007, 15:21   #2
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Re: Пересечение лини и окружности.

и вариант для 3д.
Function Insect3D(r#,x#,y#,z#,x1#,y1#,z1#,x2#,y2#,z2#)
	
Local u#
mx#=(x2+x1)/2
my#=(y2+y1)/2
mz#=(z2+z1)/2
d#=Sqr((x1-mx)*(x1-mx)+(y1-my)*(y1-my)+(z1-mz)*(z1-mz))
u#=Sqr((mx-x)*(mx-x)+(my-y)*(my-y)+(mz-z)*(mz-z))
If(u<(d+r))
c#=Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2))
If(c=0) Return 1
a#=Sqr((x-x2)*(x-x2)+(y-y2)*(y-y2)+(z-z2)*(z-z2))
b#=Sqr((x1-x)*(x1-x)+(y1-y)*(y1-y)+(z1-z)*(z1-z))
p#=(a+b+c)/2
s#=Sqr(p*(p-a)*(p-b)*(p-c))
h#=s*2/c
If (h<r) Return 1
EndIf
Return 0
End Function
(Offline)
 
Ответить с цитированием
Старый 11.02.2007, 15:33   #3
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Re: Пересечение лини и окружности.

определят пересекается ли линия (отрезок) с окружностью.
даны x1,x2,y1,y2 координаты отрезка (начала и конца) и координтаы и радиус окружности.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить пересечение пути юнита с определенным объектом? stone_evil 3D-программирование 22 14.05.2009 17:35
Пересечение объектов AndruXa 3D-программирование 15 24.12.2007 06:29
Пересечение отрезка с вертикальным отрезком ABTOMAT Математика 0 19.12.2007 23:57
Пересечение отрезка с масивом отрезков SBJoker Математика 6 13.12.2007 14:15
Пересечение HolyDel Математика 3 04.01.2007 04:21


Часовой пояс GMT +4, время: 20:38.


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