oui il y a de tout et n'importe quoi , c'est pourquoi je ne veux pas rentrer dans les détails du post que j'ai collé
Il y a une autre raison pour laquelle j'aimerais être capable de faire une fonction en C ou C++ et la lire avec PureBasic, c'est que la plupart des algos que je peux trouver sont écrits dans ces langages.
Le but serait de tester rapidement l'efficacité de ces fonctions, sans avoir à les retranscrire en PureBasic. D'autant plus que je ne comprends pas forcément tout
Par exemple j'ai trouvé un algo pour tester l'intersection d'un triangle avec une box, son auteur prétend que c'est le plus rapide, mais c'était en 2001 ou 2002 je crois. C'est celui que j'utilise actuellement, il était simple à recoder en PureBasic.
Depuis j'en ai trouvé un autre plus récent, et bien sûr son auteur prétend qu'il est plus rapide que celui que je viens de citer. Les résultats sont publiés dans des revues universitaires, je peux espérer qu'il dit vrai
Mais celui ci est plus complexe à aborder, je sens que je vais galérer pour l'adapter, et j'aurais voulu le tester sans le retranscrire.
Sinon pour en revenir à nos moutons , c'est difficile d'extraire une boucle puisque c'est l'ensemble des mes fonctions de collisions ainsi que l'octree que je voulais coder en C pour tester.
Mais soit, prenons par exemple ces deux fonctions (très sollicités pour le calcul d'une collision) :
Code : Tout sélectionner
Macro SOUSTRACTION_VECTEUR(V, V1, V2)
V\x = V1\x - V2\x
V\y = V1\y - V2\y
V\z = V1\z - V2\z
EndMacro
Macro PRODUIT_SCALAIRE(V1, V2)
(V1\x * V2\x + V1\y * V2\y + V1\z * V2\z)
EndMacro
Procedure TestPointDansTriangle1(*point.s_Vecteur, *pa.s_Vecteur, *pb.s_Vecteur, *pc.s_Vecteur)
Define.s_Vecteur e10, e20, vp
Define.f a, b, c, ac_bb, d, e, x, y, z
SOUSTRACTION_VECTEUR(e10, *pb, *pa)
SOUSTRACTION_VECTEUR(e20, *pc, *pa)
a = PRODUIT_SCALAIRE(e10, e10)
b = PRODUIT_SCALAIRE(e10, e20)
c = PRODUIT_SCALAIRE(e20, e20)
ac_bb = (a * c) - (b * b)
SOUSTRACTION_VECTEUR(vp, *point, *pa)
d = PRODUIT_SCALAIRE(vp, e10)
e = PRODUIT_SCALAIRE(vp, e20)
x = (d * c) - (e * b)
y = (e * a) - (d * b)
z = x + y - ac_bb
ProcedureReturn ((PeekL(@z) & ~(PeekL(@x) | PeekL(@y))) & $80000000)
EndProcedure
Procedure.b ChercheLaPlusPetiteSolution(a.f, b.f, c.f, maxR.f, *Solution.Float)
Define.f Determinant, t1, t2, q
;Cherche les solutions d'une équation de cette forme : At²+Bt+C=0
;http://fr.wikipedia.org/wiki/%C3%89quation_du_second_degr%C3%A9 (bas de la page "Gain de précision")
;Calcul le déterminant
Determinant = b * b - 4.0 * a * c
;Si le déterminant est inférieur ou égal à zéro , il n'y a pas d'intersection significative.
If Determinant < 0.0 : ProcedureReturn #False : EndIf
; If a = 0.0
; t1 = -c / b
; t2 = 0.0
; Else
;Calcul les deux solutions
If b < 0.0
q = 0.5 * (-b - Sqr(Determinant))
Else
q = 0.5 * (-b + Sqr(Determinant))
EndIf
t1 = q / a
t2 = c / q
;EndIf
;Est-ce vraiment utile ?
If t2 < t1
Swap t1, T2
EndIf
;Renvoie la solution la plus petite si elle est valide
If t1 > 0 And t1 < maxR
*Solution\f = t1
ProcedureReturn #True
EndIf
If t2 > 0 And t2 < maxR
*Solution\f = t2
ProcedureReturn #True
EndIf
;Pas de solution
ProcedureReturn #False
EndProcedure