Page 2 sur 2

Re: [Résolu] Placer des points sur un cercle

Publié : ven. 11/sept./2020 12:08
par Ollivier
falsam a écrit :
Ollivier a écrit :T'as oublié de typer, et pis c'est tout.
Je n'ai rien oublié du tout. Par défaut le typage est de type Integer et c'est ce dont j'ai besoin !!! :twisted:
Ollivier a écrit :Ça se voit que vous avez le temps pour déconner.
Ca se voit que tu as du temps pour chercher la petite bête là ou il y en a pas ! Et je suis poli !
Ollivier a écrit :Ton LineXY() n'a rien à voir : il n'existe pas dans ton code.
La suite de mon code est sur ce topic https://www.purebasic.fr/french/viewtop ... 59#p208759

J'utilise cette fonction pour tracer des lignes entres des points du cercle. Je pense que le débat sur ce soit disant typage oublié est clos.
JE N'AI PAS BESOIN DE TYPAGE DE TYPE FLOAT DANS CE CODE ! PAR DÉFAUT LE TYPAGE D'UNE VARIABLE EST DE TYPE INTEGER.
CQFD

Imagine quelqu'un découvre le forum : s'il n'a pas le lien vers l'autre sujet, il va décamper.
Ollivier a écrit :A moins de n'avoir besoin que des quatres angles "cardinaux" (0, 90, 180 et 270 degrés)

Re: [Résolu] Placer des points sur un cercle

Publié : ven. 11/sept./2020 12:19
par falsam
Ollivier a écrit :A moins de n'avoir besoin que des quatres angles "cardinaux" (0, 90, 180 et 270 degrés)
Si tu avais pu tester le code (Je sais tu ne peux pas) tu aurais vu que cette remarque était inutile.

Re: [Résolu] Placer des points sur un cercle

Publié : ven. 11/sept./2020 15:14
par kernadec
bjr à tous
un peu en retard sur ce coup, maintenant résolu :mrgreen:
mais pour compléter le sujet voici un exemple de projections circulaires
cordialement

Code : Tout sélectionner

Global Xcentre.l, Ycentre.l, Rayon.d, angle.l, x1.d, y1.d, x2.d, y2.d, ww = 800, wh = 600
Xcentre = ww / 2
Ycentre = wh / 2
Rayon   = 100

If OpenWindow(0, 0, 0, ww, wh, "Projection de rayons", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, ww, wh)
   
  StartDrawing(CanvasOutput(0))
  DrawingMode(#PB_2DDrawing_Outlined)
    Circle(Xcentre, Ycentre, rayon, RGB(0,0,0))
    Circle(Xcentre, Ycentre, rayon + 20, RGB(0,0,0))
  For angle = 0 To 360 Step 30
    x1 = Xcentre + rayon * Sin(Radian(angle))
    y1 = Ycentre + rayon * Cos(Radian(angle))
    x2 = Xcentre + (rayon + 20) * Sin(Radian(angle))
    y2 = Ycentre + (rayon + 20) * Cos(Radian(angle))
    LineXY(x1, y1, x2, y2, RGB(0,0,0))
  Next angle
  StopDrawing()
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Code : Tout sélectionner

Global Xcentre.l, Ycentre.l, Rayon.d, angle.l, x1.d, y1.d, x2.d, y2.d, x3.d, y3.d, x4.d, y4.d, ww = 800, wh = 600
Xcentre = ww / 2
Ycentre = wh / 2
Rayon   = 100

If OpenWindow(0, 0, 0, ww, wh, "Projection de facettes", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, ww, wh)
  
  StartDrawing(CanvasOutput(0))
  DrawingMode(#PB_2DDrawing_Outlined)
  
  For angle = 0 To 360 Step 30
    x1 = Xcentre + rayon * Sin(Radian(angle))
    y1 = Ycentre + rayon * Cos(Radian(angle))
    x2 = Xcentre + (rayon + 50) * Sin(Radian(angle))
    y2 = Ycentre + (rayon + 50) * Cos(Radian(angle))
    x3 = Xcentre + (rayon + 50) * Sin(Radian(angle+30))
    y3 = Ycentre + (rayon + 50) * Cos(Radian(angle+30))
    x4 = Xcentre + rayon * Sin(Radian(angle+30))
    y4 = Ycentre + rayon * Cos(Radian(angle+30))
    LineXY(x1, y1, x2, y2, RGB(1,155,0))
    LineXY(x1, y1, x3, y3, RGB(0,155,0))
    LineXY(x1, y1, x4, y4, RGB(0,155,0))
    LineXY(x2, y2, x3, y3, RGB(0,155,0))
    LineXY(x2, y2, x4, y4, RGB(0,155,0))
    
  Next angle
  
  StopDrawing()
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: [Résolu] Placer des points sur un cercle

Publié : ven. 11/sept./2020 17:22
par Ollivier
falsam a écrit :
Ollivier a écrit :A moins de n'avoir besoin que des quatres angles "cardinaux" (0, 90, 180 et 270 degrés)
Si tu avais pu tester le code (Je sais tu ne peux pas) tu aurais vu que cette remarque était inutile.
Dans ton cas précis et "statique", oui. Mais dans le cas général, non.

Tu peux utiliser une table d'entiers Sn (Sinus) et Cs (Cosinus).

Code : Tout sélectionner

Dim Cs(3)
Dim Sn(3)
Cs(0) = 1
Cs(2) = -1
For I = 0 To 3
   Sn(I) = Cs((I - 1) & 3)
Next
Ce que j'appelle le cas général, c'est la souplesse de découpe que permettent les fonctions trigo.

Code : Tout sélectionner

#Decoupe = 8 ; cercle découpé en 8
#TrigoMax = #Decoupe - 1
Dim Cs.D(#TrigoMax)
Dim Sn.D(#TrigoMax)
For I = 0 To #TrigoMax
 Define Angle.D = Radian(360 / #Decoupe * I)
 Cs(I) = Cos(Angle)
 Sn(I) = Sin(Angle)
Next
Là, tu règles la constante #Decoupe sur autant de points que tu veux. Mais il me semble que

Code : Tout sélectionner

Cs(I) = Cos(Angle) * #RayonGabarit
ne fonctionnera pas si Cs() est entier. Tu es obligé, je crois, de créer un "flottant" temporaire si tu ne veux pas te limiter à 4 points.

Code : Tout sélectionner

#Decoupe = 8 ; cercle découpé en 8
#RayonGabarit = 32767
#TrigoMax = #Decoupe - 1
Dim Cs(#TrigoMax)
Dim Sn(#TrigoMax)
For I = 0 To #TrigoMax
 Define Angle.D = Radian(360 / #Decoupe * I)
 Define Temp.D = Cos(Angle) * #RayonGabarit
 Cs(I) = Temp
 Temp = Sin(Angle) * #RayonGabarit
 Sn(I) = Temp
Next
Pour obtenir les angles approximatifs intermédiaires, tu peux utiliser la barycentrie. Il n'y a pas de flottants, mais ça décompose trop le calcul, car la barycentrie doit être correctement signée selon le quadrant dans lequel elle se situe. Ça fait beaucoup trop pour rester utiliser les entiers en épuisant les ressources CPU, et le résultat est un cercle saccadé.
1) Tableau entier des angles
2) Recherche du quadrant (si #Decoupe = 2^n, sinon catastrophe)
3) Barycentrie
4) Division du rayon pour adapter le rayon gabarit

Pendant ce temps-là, la trigo en flottant, elle libère le CPU, n'a qu'une étape et le cercle n'est pas saccadé.

Re: [Résolu] Placer des points sur un cercle

Publié : ven. 11/sept./2020 21:57
par G-Rom
ça ne vole pas bien haut...
Purebasic travail beaucoup avec des coordonnées en pixels , donc le float et le double tu peu le ranger sans trop de perte de précision, c'est pas un problème et cela fait le café.
en revanche , si tu commences à bosser avec api bas niveau comme opengl directx ou vulcan , oui , le float ou double deviendra une norme pour l'affichage.

@Falsam
Pour que ton texte soit centré sur son propre centre a fait un "plus beau rendu" ( mon coté autiste )

Code : Tout sélectionner

DrawText(X - (TextWidth(Str(I))/2), Y - TextHeight(Str(I))/2, Str(I), RGB(0, 0, 255))

Re: [Résolu] Placer des points sur un cercle

Publié : sam. 12/sept./2020 8:49
par Ollivier
Merci Kernadec.

Re: [Résolu] Placer des points sur un cercle

Publié : sam. 12/sept./2020 13:03
par Ollivier
Dark Vador a écrit :ça ne vole pas bien haut...
C'est une explication. Si elle est lue de haut en bas, ça reste cohérent.

Et pour vulkan, c'est dans la stratosphère pour moi. Un peu comme le romantisme caché des conteneurs à poubelles derrière les bars en France pour faire découvrir à un membre du forum que tu es probablement son Papa.

Après bien sûr, il y a ce que je surnomme le phénomène carte Kiwi ( source SNCF ). Le "signifié", découvrant sa génétique paternelle possiblement de ton origine, dans un sujet Info&Tuto de PureBasic (absolument pas dans la section Hors sujet), donc sulfate alors divers membres de ta famille par des souhaits copulatoires...

"Content" de vous savoir vivants, bande de oufs !!




PS : Falsam, le modulo, c'est bien. Mais quite à utiliser les entiers, pourquoi tu utilises Mod(a, b) pour les flottants, et pas

Code : Tout sélectionner

a % b
spécifiquement faits pour les entiers (dans le code qui fait suite dans Trucs & Astuces) ?

En tout cas, comme je remercie Kernadec, merci aussi pour cette démo de maths.

Re: [Résolu] Placer des points sur un cercle

Publié : dim. 13/sept./2020 10:56
par G-Rom
Calimero a écrit :Dark Vador a écrit:
ça ne vole pas bien haut...
C'est une explication. Si elle est lue de haut en bas, ça reste cohérent.
Tu te sens visé ? c'est pas forcement à toi que je faisait référence.
Et pour vulkan, c'est dans la stratosphère pour moi. Un peu comme le romantisme caché des conteneurs à poubelles derrière les bars en France pour faire découvrir à un membre du forum que tu es probablement son Papa.

Après bien sûr, il y a ce que je surnomme le phénomène carte Kiwi ( source SNCF ). Le "signifié", découvrant sa génétique paternelle possiblement de ton origine, dans un sujet Info&Tuto de PureBasic (absolument pas dans la section Hors sujet), donc sulfate alors divers membres de ta famille par des souhaits copulatoires...
J'ai mis du café partout en te lisant :D , donne des liens quand tu sort des dossiers.

Re: [Résolu] Placer des points sur un cercle

Publié : dim. 13/sept./2020 18:51
par Ollivier
Pardon pour le café... J'espère que falsam appréciera le centrage de texte.

Re: [Résolu] Placer des points sur un cercle

Publié : dim. 13/sept./2020 20:15
par SPH
Ils sont fous ces romains :lol:

Re: [Résolu] Placer des points sur un cercle

Publié : dim. 13/sept./2020 21:39
par falsam
La demande d'aide que je demandais ne justifiée d'aligner correctement les nombres.

J'ai utilisé ce meme system d'alignement dans le code que je présente dans mon autre sujet. Merci quand même G-Rom pour ce rappel.