[Résolu] Placer des points sur un cercle

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

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

Message 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)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

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

Message 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
Dernière modification par kernadec le lun. 14/sept./2020 9:13, modifié 1 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

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

Message 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é.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message 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))
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

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

Message par Ollivier »

Merci Kernadec.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

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

Message 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.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message 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.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

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

Message par Ollivier »

Pardon pour le café... J'espère que falsam appréciera le centrage de texte.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

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

Message par SPH »

Ils sont fous ces romains :lol:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre