papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: SuperEllipse Sam 19 Sep 2015 - 5:27 | |
| Tout est dans le code. Pas besoin de blablabla! - Code:
-
rem ============================================================================ rem SuperEllipse rem Par Papydall rem ============================================================================ Init() DrawGallery() end rem ============================================================================ SUB Init() label spi,quit dim i width 0,1000 : height 0,700 top 0,(screen_y - height(0))/2 : left 0,(screen_x - width(0))/2 alpha 10 : top 10,5 : left 10,100 : font_bold 10 : font_name 10,"Tahoma" font_size 10,14 : font_color 10,0,0,128 font_bold 0 : font_size 0,10 : font_name 0,"tahoma": font_color 0,0,0,255
button 20 : top 20,620 : left 20,400 : caption 20,"Spirale": on_click 20,spi button 30 : top 30,620 : left 30,400 : caption 30,"Quitter": hide 30 : on_click 30,quit END_SUB rem ============================================================================ spi: hide 20 : DrawSpiral() return rem ============================================================================ quit: for i = height(0) to 0 step -5 : height 0,i : pause 10 : next i terminate return rem ============================================================================ SUB DrawGallery() dim_local i,j, angle$, pen,k,r,g,b caption 10,"Galerie de formes créées utilisant la SUB SuperEllipse" color 0,224,232,255 : 2d_pen_color 128,128,128 For i = 16 To 800 STEP 16 : 2d_Line i,68,i, 599 : Next i For i = 68 To 600 STEP 16 : 2d_Line 0,i, 799 ,i : Next i 2d_pen_color 0,0,128 For i = 0 To 12 angle$ = Str$(i * 30) + "°" while len(angle$) < 4 : angle$ = "0" + angle$ : end_while print_locate i*60+20,40 : print angle$ Next i print_locate 800,40 : print "<==== Angles de rotation" print_locate 850,60 : print "dans le sens horaire" pen = 2 : k = 0 : r = 0 : g = 0 : b = 255 For j = 32 To 795 STEP 60 2d_pen_color r,g,b SuperEllipse(j,97, 24, 18,.35,18, pen, k) SuperEllipse(j,154, 24, 18,.75,18, pen, k) SuperEllipse(j,201, 24, 18, 1, 4, pen, k) SuperEllipse(j,268, 24, 24, 2, 5, pen, k) SuperEllipse(j,325, 24, 24, 2, 7, pen, k) SuperEllipse(j,382, 24, 18, 2, 18, pen, k) SuperEllipse(j,440, 24, 18, 3, 18, pen, k) SuperEllipse(j,497, 24, 18, 5, 18, pen, k) SuperEllipse(j,554, 24, 18, 10,18, pen, k) k = k + 30 : r = r + 21.25 : b = b - 21.25 : ' pen = pen + .3 Next j END_SUB rem ============================================================================ ' ********************************** SUB SuperEllipse ************************** ' ** Paramètres: ' ** centerX, centerY : Coordonnées du centre de la SuperEllipse ' ** wide : Rayon-X de la SuperEllipse ' ** high : Rayon-Y de la SuperEllipse ' ** REMARQUE : Faire wide = high pour tracer des cercles, des carrés et des polygones réguliers ' ** exponent - Détermine la forme de la Superellipse (.15 <= exp <= 99) ' ** exponent = .15 : Dessine une Superellipse en forme de X ' ** exponent = .3 to .9 : Dessine un carreau avec des côtés courbés ' ** exponent = 1.0 : Dessine un carreau ' ** exponent = 2.0 : Dessine un ovale (ou un cercle si wide = high) ' ** exponent = 3.0 : ovale plus rectangulaire ' ** exponent = 30.0 to 99.0 : C'est un rectangle ' ** numSegments : Déterminer le nombre de segments pour dessiner la SuperEllipse ' ** penSize : Épaisseur de ligne ' ** rotAngle : Angle en degrés pour faire tourner la Superellipse ' ** ' ****************************************************************************** SUB SuperEllipse(centerX, centerY, wide, high, exponent, numSegments, penSize, rotAngle) dim_local pi2, d2r, puissance, inc,x1,y1,x2,y2,limit,theta,cosTheta, sinTheta dim_local cs,sn, rotx,roty pi2 = 8*Atn(1) : d2r = pi2/360
If penSize < 1 Or penSize > 20 Then penSize = 1 2d_pen_width penSize
If exponent < .15 Then exponent = .15 If exponent > 99 Then exponent = 99 ' Eviter la division par zéro If exponent = 0 puissance = 0 Else puissance = 2/exponent-1 End_If ' Garder l'angle de rotation entre 0 et 360° rotAngle = wrap_value(rotAngle) ' Conversion de degrés en radians inc = 360/numSegments * d2r ' Convertir rotAngle de degrés en radians rotAngle = d2r * rotAngle If rotAngle = 0 ' Calculer les coordonnées du 1er point de la ligne x1 = wide + centerX : y1 = centerY : 2d_poly_from x1,y1 limit = pi2 + inc For theta = inc To limit STEP inc ' Calculer les coordonnées x,y du point suivant cosTheta = Cos(theta) : sinTheta = Sin(theta) x2 = wide * cosTheta * power(Abs(cosTheta),puissance) + centerX y2 = high * sinTheta * power(Abs(sinTheta),puissance) + centerY ' Tracer la ligne depuis la dernière position (x1,y1) jusqu'à x2,y2 2d_poly_to x2,y2 Next theta Else ' Exécutez une rotation sur la Superellipse cs = Cos(rotAngle) : sn = Sin(rotAngle) rotX = wide : x1 = cs * rotX + centerX : y1 = sn * rotX + centerY 2d_poly_from x1,y1 limit = pi2 + inc For theta = inc To limit STEP inc cosTheta = Cos(theta) : sinTheta = Sin(theta) rotX = cosTheta * wide * power(Abs(cosTheta),puissance) rotY = sinTheta * high * power(Abs(sinTheta),puissance) x2 = cs * rotX - sn * rotY + centerX y2 = sn * rotX + cs * rotY + centerY 2d_poly_to x2,y2 Next theta End_If END_SUB rem ============================================================================ SUB DrawSpiral() dim_local pen,wide, high, r,g,b,cr(15),cg(15),cb(15),colr,i,inc color 0,0,0,0 : wide = 0 : high = 0 : r = 255: g = 0: b = 0 For i = 1 To 15 cr(i) = r : cg(i) = 0 : cb(i) = b : r = r - 17 : b = b + 17 Next i inc = 1 : colr = 1 : pen = 1 2d_pen_color cr(colr),cg(colr),cb(colr) For i = 0 To 720 STEP 5 pen = pen + .05 : wide = wide + 3.75 : high = high + 2.5 SuperEllipse(400,300, wide, high,5,18, pen,i) colr = colr + inc If colr > 15 Then colr = 15: inc = -1 If colr < 1 Then colr = 1: inc = 1 2d_pen_color cr(colr),cg(colr),cb(colr) Next i show 30 END_SUB rem ============================================================================ | |
|