Super Ellipse
Page 1 sur 1
Super Ellipse
- 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 ============================================================================
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Lun 1 Jan - 0:25 par Papydall-Admin
» A ceux qui célèbre Noël, bonnes fêtes
Dim 24 Déc - 10:49 par Papydall-Admin
» Joyeux Noël et Bonne Année
Ven 8 Déc - 1:34 par Papydall-Admin
» Planets of the Solar System : Tilts and Spins
Lun 20 Mar - 15:43 par Papydall-Admin
» Bonne Année 2023
Sam 31 Déc - 1:39 par Papydall-Admin
» Fractals - Mandelbrot
Ven 21 Aoû - 22:51 par Papydall-Admin
» Convertisseur Décimal ---> Binaire, Octal, Hexadécimal, ...
Mer 21 Nov - 1:08 par Papydall-Admin
» Balises {USER...}
Lun 19 Nov - 22:12 par Papydall-Admin
» Useful Dog
Ven 6 Avr - 14:25 par Papydall-Admin