Dégradé de couleur dans une ellipse
Forums › ProRealTime forum Français › Support ProBuilder › Dégradé de couleur dans une ellipse
-
-
01/09/2026 at 8:59 AM #25516501/09/2026 at 10:17 AM #255169
Bonjour. Il n’y a pas moyen de le faire avec l’instruction native… Je pense qu’on pourrait utiliser une boucle qui parcourt les couleurs de l’arc-en-ciel et dessine des ellipses concentriques.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051defparam drawonlastbaronly=true//-----------------------------------------------------// Rainbow Ellipse Template - Optimized Gradient//-----------------------------------------------------// Variables for the areaxStart = barindex[40]yTop = high + 20 * pipsizexEnd = barindexyBottom = low - 20 * pipsize// Resolution: more steps = higher quality gradienttotalSteps = 25// Calculating incrementswidthStep = (xEnd - xStart) / (2 * totalSteps)heightStep = (yTop - yBottom) / (2 * totalSteps)FOR i = 0 TO totalSteps DO// Current coordinates calculationcurrentX1 = xStart + (i * widthStep)currentY1 = yTop - (i * heightStep)currentX2 = xEnd - (i * widthStep)currentY2 = yBottom + (i * heightStep)// Smooth Rainbow Transition Logic// Division in 3 segments to cover the full spectrumIF i < (totalSteps / 3) THEN// Segment 1: Red to YellowrVal = 255gVal = (i * 255) / (totalSteps / 3)bVal = 0ELSIF i < (2 * totalSteps / 3) THEN// Segment 2: Yellow to CyanrVal = 255 - (((i - (totalSteps / 3)) * 255) / (totalSteps / 3))gVal = 255bVal = ((i - (totalSteps / 3)) * 255) / (totalSteps / 3)ELSE// Segment 3: Cyan to MagentarVal = ((i - (2 * totalSteps / 3)) * 255) / (totalSteps / 3)gVal = 255 - (((i - (2 * totalSteps / 3)) * 255) / (totalSteps / 3))bVal = 255ENDIF// Transparency settingsalphaVal = 40// Execution of drawingDRAWELLIPSE(currentX1, currentY1, currentX2, currentY2) FILLCOLOR(rVal, gVal, bVal, alphaVal) COLOURED(0, 0, 0, 0)NEXTRETURN1 user thanked author for this post.
01/09/2026 at 10:59 AM #25517301/09/2026 at 1:54 PM #255176Ivan,
Voici ce que j’ai pu coder pour colorer un cercle en dégradé grâce à des segments :
Cercle - dégradé de couleur123456789101112131415161718192021222324252627282930313233p=1000for i = 0 to px=400/p*(i)y=SQRT(SQUARE(210)-SQUARE(-210+210*2/(p-1)*i))yprime=-SQRT(SQUARE(210)-SQUARE(-210+210*2/(p-1)*i))z=p/4if x<= 400*1/4 thenr=255g=165/z*ib=0elsif x <= 400*2/4 thenr=255g=165+(255-165)/z*(i-z*1)b=0elsif x <= 400*3/4 thenr=255-255/z*(i-z*2)g=255b=0elsif x <= 400 thenr=0g=255-(255-128)/z*(i-z*3)b=0endifdrawsegment(-105+x,0+y,90,0) anchor (middle,xshift,yshift) COLOURED(r,g,b) style (line,5)drawsegment(-105+x,22+yprime,90,0) anchor (middle,xshift,yshift) COLOURED(r,g,b) style (line,5)nextreturnEt voici le code pour un demi-cercle :
Demi-cercle - dégradé de couleur12345678910111213141516171819202122232425262728293031p=1000for i = 0 to px=400/p*(i)y=SQRT(SQUARE(210)-SQUARE(-210+210*2/(p-1)*i))z=p/4if x<= 400*1/4 thenr=255g=165/z*ib=0elsif x <= 400*2/4 thenr=255g=165+(255-165)/z*(i-z*1)b=0elsif x <= 400*3/4 thenr=255-255/z*(i-z*2)g=255b=0elsif x <= 400 thenr=0g=255-(255-128)/z*(i-z*3)b=0endifdrawsegment(-105+x,0+y,90,0) anchor (middle,xshift,yshift) COLOURED(r,g,b) style (line,5)nextreturnComme tu peux le voir sur les photos, j’ai triché sur le cercle entier en remontant le deuxième demi-cercle sur l’axe des y pour combler les trous.
Pour le demi-cercle il y une zone non colorée car j’ai utilisé la formule mathématique d’un demi-cercle. Or dans cette formule les points ne sont pas équidistants sur l’axe des y. Ils sont larges au début, puis se resserrent et s’écartent à nouveau de l’autre côté. J’ai un moyen d’y pallier en mettant p=5000, mais le calcul prend beaucoup de temps.
Si tu as une formule mathématique qui permet d’obtenir des points équidistants sur un cercle je suis preneur. Est-ce que ta méthode ci-avant (via l’ellipse) permet de coder le remplissage d’un demi-cercle ?
Merci
01/09/2026 at 6:34 PM #255186Bonjour ! Concernant vos questions :
Demi-cercle : Il n’existe pas de solution parfaite pour éliminer complètement les espaces. C’est une limitation technique de la plateforme lors du tracé de segments à partir d’un point central vers un arc (plus on s’éloigne, plus les pixels sont espacés).
Optimisation : La meilleure façon d’accélérer le code est d’utiliser les degrés (de 0 à 180) avec les fonctions SIN et COS, comme indiqué ci-dessous. Ce sera beaucoup plus rapide que d’utiliser 5 000 itérations, même si le résultat visuel sera moins bon.
Ellipse : La fonction DRAWELLIPSE ne peut pas être tronquée ; elle dessine toujours la forme entière.
En résumé : utilisez l’approche par degrés pour améliorer les performances de la plateforme, mais acceptez que de petits espaces dans le remplissage soient inévitables en raison de la résolution des pixels.
12345678910111213141516171819202122232425262728293031323334353637383940414243defparam drawonlastbaronly=true// Rainbow Semicircle using Polar Coordinates (equidistant points)// 1. ConfigurationxCenter = barindex[50]yCenter = closeradiusPrice = 50 * pipsize // Vertical radiusradiusBar = 20 // Horizontal radius (in bars)// Precision: one segment per degreetotalDegrees = 180FOR i = 0 TO totalDegrees DO// Calculate angle in degrees (from 0 to 180 for a semicircle)angle = i// Trigonometry for equidistant points on the arc// x = x0 + R * cos(theta), y = y0 + R * sin(theta)// Note: SIN/COS in ProBuilder use degreesxPoint = xCenter + radiusBar * COS(angle)yPoint = yCenter + radiusPrice * SIN(angle)// Rainbow Color Logic based on the angle (Phase calculation)IF angle < 60 THENrVal = 255gVal = (angle * 255) / 60bVal = 0ELSIF angle < 120 THENrVal = 255 - ((angle - 60) * 255) / 60gVal = 255bVal = (angle - 60) * 255 / 60ELSErVal = 0gVal = 255 - ((angle - 120) * 255) / 60bVal = 255ENDIF// Drawing a segment from the center to the arc point// This creates the filled "fan" effectDRAWSEGMENT(xCenter, yCenter, xPoint, yPoint) COLOURED(rVal, gVal, bVal) STYLE(line, 2)NEXTRETURN -
AuthorPosts
Find exclusive trading pro-tools on