|
Библиотеки Сторонние библиотеки для Blitz |
18.03.2012, 16:06
|
#1
|
ПроЭктировщик
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений (для 63 пользователей)
|
библиотека пересечений
initmath3d%(key$) - key$="boolean" -в принципе можно
и без этой функции
distance3d#(x#,y#,z#,x2#,y2#,z2#) - дистанция между двумя
точками в 3d пространстве
lineoverlap2d%(ax1#,ay1#,ax2#,ay2#,bx1#,by1#,bx2#,by2#) - пересечение
отрезков
trioverlap%(x#,y#,x1#,y1#,x2#,y2#,x3#,y3#) - принадлежность точки
к треугольнику
quadoverlap%(x#,y#,x1#,y1#,x2#,y2#,x3#,y3#,x4#,y4#) - принадлежность
точки к четырехугольнику
ovalsoverlap%(x1#,y1#,r1#,x2#,y2#,r2#)-пересечение двух
окружностей
X#,Y# - координаты точки.
Переменные имеющие индекс(х1...хn) - координаты фигур
протестируйте кому не лень, или кому пригодится, кому что непонятно или баг, глюк или прочая нечисть - пишите
__________________
форум эт вещь... и почему я раньше им не пользовался?
AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Spy4433 за это полезное сообщение:
|
|
05.04.2012, 20:41
|
#2
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: библиотека пересечений
Я конечно не великий програмёр, но мне кажется что нет смысла в некоторых функциях
Например
---------------------
lineoverlap2d%(ax1#,ay1#,ax2#,ay2#,bx1#,by1#,bx2#, by2#)
вместо него использовать старый
RectsOverlap (X1,Y1,1,1,X2,Y2,rectWidth2,rectHeight2) - сделает ту же проверку точки к прямоугольнику
----------------
distance3d#(x#,y#,z#,x2#,y2#,z2#) - мне ни разу не пришлось брать "никкому" не относящиеся точки для проверки, и не представляю для чего это
Лучше старый велосипед entityDistance(ent1,ent2)
На крайняк пивота создать )
-------------------
А вот проверка отрезков, треугольника и окружностей вполне пригодятся
__________________
|
(Offline)
|
|
13.05.2012, 11:23
|
#3
|
ПроЭктировщик
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений (для 63 пользователей)
|
Ответ: библиотека пересечений
ну не всегда нужно проверить точка и прямоугольник, причем строго привязанный к углу .. а пересечении двух линий которые могут быть расположены под какими то углами может пригодится
и что ты этим хочешь сказать?
конечно это как прикол
initmath3d%("boolean")
st=MilliSecs()
For t=0 To 100000
a=distance3db#(10,10,10,100,200,150)
Next
en=MilliSecs()
sum=en-st
DebugLog sum
st=MilliSecs()
For t=0 To 100000
a=distance3d#(10,10,10,100,200,150)
Next
en=MilliSecs()
sum=en-st
DebugLog sum
Stop
Function distance3db#(x1#,y1#,z1#,x2#,y2#,z2#)
Return Sqr((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)
End Function
Результат
47
29
я конечно ни чего не хочу доказывать, но когда один раз нужно вычислить то это одно дело проще юзать функции,
а когда за цикл это вызывается много*много раз, то библиотека будет быстрее
__________________
форум эт вещь... и почему я раньше им не пользовался?
AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
Последний раз редактировалось Spy4433, 14.05.2012 в 00:27.
|
(Offline)
|
|
13.05.2012, 21:42
|
#4
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,360
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: библиотека пересечений
Дистанция 3D:
Function Distance3D#(x1#,y1#,z1#,x2#,y2#,z2#)
Return Sqr((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)
End Function
Пересечение линий:
Global Intersection_X#
Global Intersection_Y#
Global Intersection_AB#
Global Intersection_CD#
Function LinesIntersect(Ax#, Ay#, Bx#, By#, Cx#, Cy#, Dx#, Dy#)
Rn# = (Ay#-Cy#)*(Dx#-Cx#) - (Ax#-Cx#)*(Dy#-Cy#)
Rd# = (Bx#-Ax#)*(Dy#-Cy#) - (By#-Ay#)*(Dx#-Cx#)
If Rd# = 0
Return False ; Lines are parralel.
Else
Sn# = (Ay#-Cy#)*(Bx#-Ax#) - (Ax#-Cx#)*(By#-Ay#)
Intersection_AB# = Rn# / Rd#
Intersection_CD# = Sn# / Rd#
Intersection_X# = Ax# + Intersection_AB#*(Bx#-Ax#)
Intersection_Y# = Ay# + Intersection_AB#*(By#-Ay#)
Return True
EndIf
End Function
2Д точка об 2д треугольник
Function PointInTri(Px#, Py#, V0x#, V0y#, V1x#, V1y#, V2x#, V2y#)
; vector(e1,v1,v0)
E1x# = V1x# - V0x#
E1y# = V1y# - V0y#
; vector(e2,v2,v0)
E2x# = V2x# - V0x#
E2y# = V2y# - V0y#
; crossproduct(h,d,e2)
Hx# = -E2y#
Hy# = E2x#
; a = dotproduct(e1,h)
A# = (E1x# * Hx#) + (E1y# * Hy#)
F# = 1.0 / A#
; vector(s,p,v0)
Sx# = Px# - V0x#
Sy# = Py# - V0y#
;u = f * (dotProduct(s,h))
U# = F# * ((Sx# * Hx#) + (Sy# * Hy#))
; If the value of the U coordinate is outside the range of values inside the triangle,
; then the ray has intersected the plane outside the triangle.
If (U# < 0) Or (U# > 1)
Return False
EndIf
; crossProduct(q,s,e1)
Qz# = (Sx# * E1y#) - (E1x# * Sy#)
; v = f * dotProduct(d,q)
V# = F# * Qz#
; If the value of the V coordinate is outside the range of values inside the triangle,
; then the ray has intersected the plane outside the triangle.
If (V# < 0) Or (V# > 1) Then Return False
; U + V together cannot exceed 1.0 or the point is not in the triangle.
; If you imagine the triangle as half a square this makes sense. U=1 V=1 would be in the
; lower left hand corner which would be in the second triangle making up the square.
If (U# + V#) > 1 Then Return False
; The point was in the triangle. Yay!
Return True
; Note that you could also return the U and V coordinates calculated in this function
; if you need those values!
End Function
Столкновение с неповёрнутым прямоугольником
Function PointInRect(iPointX,iPointY,iXPos1,iYPos1,iXPos2,iYPos2)
iXPos2=iXPos2 + iXPos1
iYPos2=iYPos2 + iYPos1
Return ((((iPointX-iXPos1) Xor (iPointX-iXPos2)) And ((iPointY-iYPos1) Xor (iPointY-iYPos2))) And $80000000)
End Function
Твои овалы это не овалы, а обычная Distance2D:
Function Distance2D#(x1#,y1#,x2#,y2#)
Local nx#=x1-x2 ;Длина горизонтального Катета
Local ny#=y1-y2 ;Длина Вертикального Катета
Return Sqr((nx*nx)+(ny*ny)) ;Длина Гипотенузы
End Function
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
Последний раз редактировалось Randomize, 13.05.2012 в 23:54.
|
(Offline)
|
|
13.05.2012, 23:02
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: библиотека пересечений
Ещё в середине 2007 писал подобные функции..
http://moka.ucoz.ru/load/0-0-0-27-20
|
(Offline)
|
|
14.05.2012, 02:55
|
#6
|
Нуждающийся
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений (для 83 пользователей)
|
Ответ: библиотека пересечений
Сообщение от Randomize
Дистанция 3D:
Function Distance3D#(x1#,y1#,z1#,x2#,y2#,z2#)
Return Sqr((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)
End Function
|
Сообщение от Spy4433
Результат
47
29
|
А вы в курсе что в Блице оператор возведения в степень не оптимизируется (было бы логично оптимизировать т.к. степень в данном случае константная) и не инлайнится (т.е. всегда вызывается как функция), и раза в 3-4 медленее чем аналог умножением?
Spy4433
Разверни степени в умножение и потом сравни со своей библиотечной функцией.
Чтобы ты понял к чему я веду - нет смысла выносить в длл элементарный код.
ЗЫ
Ты оптимизации включал когда собирал библиотеку? Код ужасный, да и весит 386 кило - слишком толсто
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.05.2012, 16:49
|
#7
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,360
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: библиотека пересечений
Сообщение от Платон Александрович
А вы в курсе что в Блице оператор возведения в степень не оптимизируется (было бы логично оптимизировать т.к. степень в данном случае константная) и не инлайнится (т.е. всегда вызывается как функция), и раза в 3-4 медленее чем аналог умножением?
|
Нет не в курсе. Даже после твоего поста. Даже больше - не хочу быть в курсе блица. Моей задачей было тупо вбросить функции которые уже давно существуют. Оптимизировать не так то и сложно.
initmath3d%(key$) - key$="boolean" -в принципе можно
и без этой функции
|
Меня это заставило найти и запостить аналоги.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
14.05.2012, 19:29
|
#8
|
ПроЭктировщик
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений (для 63 пользователей)
|
Ответ: библиотека пересечений
Меня это заставило найти и запостить аналоги.
|
)))))))))))))))))))))))
эту функцию убрал почти сразу тк самого достала )
кстати насчет веса...
в библиотеке были подключены модули для работы с диалоговыми функциями и реализована работа, я их просто не описал в decls, а так библиотека весит около 90 кб
__________________
форум эт вещь... и почему я раньше им не пользовался?
AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:08.
|